Страница 1 из 3
ESP8266 по MQTT
Добавлено: Вт апр 16, 2019 9:29 pm
Forth
Добрый вечер!
Помогите разобраться, пытаюсь настроить, чтоб из МД по кнопке управлять реле, нашел в Интернете 2 скетча, подправил под себя, чтоб попроще было разобраться как работает, 1 скетч включает реле на 2 секунды и выключает, хотя статус в МД не меняется за эти 2 секунды.
2 скетч не публикует топик в МД и в MQTTLens пусто.
1 скетч
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SD 2.4G_2"; //Название сети
const char* password = "xxxxxxxxx"; //пароль
const char* mqtt_server = "192.168.2.3"; //ip брокера mqtt
#define RELAY_2 14 //Выход на реле или светодиод на ESP
#define relays_topic2 "ESP04/relay_2" //публикуемый топик
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long last_mls = millis(); //функция времени в милисекундах
long last_mls3 = millis(); //функция времени для отправки топиков
boolean Status2 = true; //объявляем статус реле в 0 (true, false
// boolean lastbtnStat2 = false;
int status2 = 0; //режим по умолчанию при включении
void setup() //Выполняется при запуске 1 раз
{
pinMode(RELAY_2, OUTPUT); //Выход на реле или светодиод
digitalWrite(RELAY_2, Status2); //устанавливаем на выходе статус реле
Serial.begin(115200); //инициализация монитора порта
client.setServer(mqtt_server, 1883); //подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100); //ждем 100 милисекунд
WiFi.begin(ssid, password); //подключаемся к WiFi
delay(5000); //ждем 5 секунд
client.connect("ESP04Client"); //конектимся с брокером как клиент
client.subscribe(relays_topic2); //подписываемся на топик
}
void callback(char* topic, byte* payload, unsigned int length) //читаем топики
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print(" ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if (strTopic == "ESP04/relay_2") {
if ((char)payload[0] == '0') {
Status2 = false;
digitalWrite(RELAY_2, Status2);
}
else if ((char)payload[0] == '1') {
Status2 = true;
digitalWrite(RELAY_2, Status2);
}
}
}
void reconnect_server() //функция проверки подключения
{
if (WiFi.status() != WL_CONNECTED) //если нет подключения с сети
{
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect..."); //выводим в монитор порта что пытаемся подключиться
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
if (!client.connected() && WiFi.status() == WL_CONNECTED) { //если к сети подключились но к MQTT нет
client.subscribe(relays_topic2); //подписываемся на топик
Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
}
}
void MQTT() //публикуем топик с состоянием режима
{
if (millis() - last_mls3 > 2000) //периодичность публикации топика
{ last_mls3 = millis();
client.publish(relays_topic2, String(status2).c_str(), true);
Serial.println("WiFinnected");
}
}
void loop()
{
client.loop();
MQTT();
if (millis() - last_mls > 60000) //проверка подключений раз в 60 сек
{
last_mls = millis();
reconnect_server();
}
}
2 скетч
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SD 2.4G_2"; //Название сети
const char* password = "xxxxxxxx"; //пароль
const char* mqtt_server = "192.168.2.3"; //ip брокера mqtt
#define RELE_1 14 // Реле №1
#define BUTTON_1 13 // Кнопочный выключатель №1
#define relays_topic1 "ESP01/RELE_1" // Топик реле №1
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long lastMsg = 0;
long last_mls = millis(); //функция времени в милисекундах
char msg[50];
int value = 0;
int hum = 0;
int diff = 1;
boolean rState1 = false;
boolean btnPress1 = false;
boolean lastbtnStat1 = false;
void setup() {
// инициализируем последовательный порт (для отладочных целей):
Serial.begin(115200);
delay(10);
pinMode(RELE_1, OUTPUT);
pinMode(BUTTON_1, INPUT);
digitalWrite(RELE_1, rState1);
Serial.begin(115200);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(100);
WiFi.begin(ssid, password);
delay(6000);
client.connect("ESP8266Client");
client.subscribe(relays_topic1);
lastbtnStat1 = digitalRead(BUTTON_1);
}
void reconnect_server() {
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect...");
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(relays_topic1);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
if ((char)payload[0] == '1') {
rState1 = true;
digitalWrite(RELE_1, rState1);
}
else {
rState1 = false;
digitalWrite(RELE_1, rState1);
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
}
// END Блок [обратная связь] ************************************************
bool checkBound(float newValue, float prevValue, float maxDiff) {
return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}
// Выключатель №1
void buttonWF(){
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 && !lastbtnStat1){
delay(400); // защита от дребезга (600 мсек.)
btnPress1 = digitalRead(BUTTON_1);
if(btnPress1){
rState1 = !rState1;
digitalWrite(RELE_1, rState1);
// публикуем изменение состояния реле на брокер
client.publish(relays_topic1, String(rState1).c_str(), true);
}
}
lastbtnStat1 = btnPress1;
}
// END Выключатель №1
void loop() {
client.loop();
// 120 секунд периодичность проверки переподключения
if (millis() - last_mls > 120000) {
last_mls = millis();
reconnect_server();
}
buttonWF(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
}
Re: ESP8266 по MQTT
Добавлено: Ср апр 17, 2019 6:23 am
ZyaK
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#include <ESP8266mDNS.h>
const char* ssid = "***********"; //Название сети
const char* password = "***********"; //пароль
const char* Smart_Home = "*************"; //ip брокера mqtt
#define BUTTON_1 3
#define BUTTON_2 5 //Кнопка
#define BUTTON_3 4
#define BUTTON_4 0
#define BUTTON_5 2
#define BUTTON_6 14
#define BUTTON_7 12
#define BUTTON_8 13
#define relays_topic "ESP01/#"
#define relays_topic1 "ESP01/r_1"
#define relays_topic2 "ESP01/r_2"
#define relays_topic3 "ESP01/r_3"
#define relays_topic4 "ESP01/r_4"
#define relays_topic5 "ESP01/r_5"
#define relays_topic6 "ESP01/r_6"
#define relays_topic7 "ESP01/r_7"
#define relays_topic8 "ESP01/r_8"
#define clk 15
#define data 16
#define latch 1
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long last_mls = millis(); //функция времени в милисекундах
boolean Status1 = false; //объявляем статус реле в 0
boolean btnPress1 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false; //временная переменная для хранения статуса
boolean Status2 = false;
boolean btnPress2 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat2 = false;
boolean Status3 = false;
boolean btnPress3 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat3 = false;
boolean Status4 = false;
boolean btnPress4 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat4 = false;
boolean Status5 = false;
boolean btnPress5 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat5 = false;
boolean Status6 = false;
boolean btnPress6 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat6 = false;
boolean Status7 = false;
boolean btnPress7 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat7 = false;
boolean Status8 = false;
boolean btnPress8 = false; //объявляем что кнопка не нажата 0
boolean lastbtnStat8 = false;
int regim1 = 0; //режим по умолчанию при включении
int regim2 = 0;
int regim3 = 0;
int regim4 = 0;
int regim5 = 0;
int regim6 = 0;
int regim7 = 0;
int regim8 = 0;
int Dannie = 0;
void setup() {
pinMode(clk, OUTPUT);
pinMode(data, OUTPUT);
pinMode(latch, OUTPUT);
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
shiftOut(data, clk, LSBFIRST, 0b11111111);
digitalWrite(latch, HIGH);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(BUTTON_3, INPUT);
pinMode(BUTTON_4, INPUT);
pinMode(BUTTON_5, INPUT);
pinMode(BUTTON_6, INPUT);
pinMode(BUTTON_7, INPUT);
pinMode(BUTTON_8, INPUT);
//Кнопка
//Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //подключаемся к WiFi
delay(6000);
client.setServer(Smart_Home, 1883); //подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100);
//Serial.println("");
//Serial.println("WiFi connected");
//Serial.println("IP address: ");
//Serial.println(WiFi.localIP());
client.connect("ESP01Client");
delay (100);//конектимся с брокером как клиент
client.subscribe(relays_topic);
client.loop();
client.publish(relays_topic1, String(regim1).c_str());
client.loop();
client.publish(relays_topic2, String(regim2).c_str());
client.loop();
client.publish(relays_topic3, String(regim3).c_str());
client.loop();
client.publish(relays_topic4, String(regim4).c_str());
client.loop();
client.publish(relays_topic5, String(regim5).c_str());
client.loop();
client.publish(relays_topic6, String(regim6).c_str());
client.loop();
client.publish(relays_topic7, String(regim7).c_str());
client.loop();
client.publish(relays_topic8, String(regim8).c_str());
client.loop();
}
void callback(char* topic, uint8_t* payload, unsigned int length) {
//Serial.print("Message arrived [");
//Serial.print(topic);
//Serial.print(" ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (unsigned int i = 0; i < length; i++) {
//Serial.print((char)payload[i]);
}
//Serial.println();
if (strTopic == "ESP01/r_1") {
if ((char)payload[0] == '0') {
Status1 = false;
regim1 = 0;
}
else if ((char)payload[0] == '1') {
Status1 = true;
regim1 = 1;
}
}
if (strTopic == "ESP01/r_2") {
if ((char)payload[0] == '0') {
Status2 = false;
regim2 = 0;
}
else if ((char)payload[0] == '1') {
Status2 = true;
regim2 = 1;
}
}
if (strTopic == "ESP01/r_3") {
if ((char)payload[0] == '0') {
Status3 = false;
regim3 = 0;
}
else if ((char)payload[0] == '1') {
Status3 = true;
regim3 = 1;
}
}
if (strTopic == "ESP01/r_4") {
if ((char)payload[0] == '0') {
Status4 = true;
regim4 = 0;
}
else if ((char)payload[0] == '1') {
Status4 = false;
regim4 = 1;
}
}
if (strTopic == "ESP01/r_5") {
if ((char)payload[0] == '0') {
Status5 = false;
regim5 = 0;
}
else if ((char)payload[0] == '1') {
Status5 = true;
regim5 = 1;
}
}
if (strTopic == "ESP01/r_6") {
if ((char)payload[0] == '0') {
Status6 = false;
regim6 = 0;
}
else if ((char)payload[0] == '1') {
Status6 = true;
regim6 = 1;
}
}
if (strTopic == "ESP01/r_7") {
if ((char)payload[0] == '0') {
Status7 = false;
regim7 = 0;
}
else if ((char)payload[0] == '1') {
Status7 = true;
regim7 = 1;
}
}
if (strTopic == "ESP01/r_8") {
if ((char)payload[0] == '0') {
Status8 = false;
regim8 = 0;
}
else if ((char)payload[0] == '1') {
Status8 = true;
regim8 = 1;
}
}
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
client.loop();
}
void button1()
{
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 == LOW && lastbtnStat1 == false)
{
delay(100); // защита от дребезга
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 == LOW && lastbtnStat1 == false)
{
regim1++;
lastbtnStat1 = true;
if (regim1 > 1)
{
regim1 = 0;
}
client.publish(relays_topic1, String(regim1).c_str());
}
}
if (btnPress1 == HIGH && lastbtnStat1 == true)
{
lastbtnStat1 = false;
}
if (regim1 == 0)
{
Status1 = false;
}
if (regim1 == 1)
{
Status1 = true;
}
client.loop();
}
void button2()
{
btnPress2 = digitalRead(BUTTON_2);
if (btnPress2 == LOW && lastbtnStat2 == false)
{
delay(100); // защита от дребезга
btnPress2 = digitalRead(BUTTON_2);
if (btnPress2 == LOW && lastbtnStat2 == false)
{
regim2++;
lastbtnStat2 = true;
if (regim2 > 1)
{
regim2 = 0;
}
client.publish(relays_topic2, String(regim2).c_str());
}
}
if (btnPress2 == HIGH && lastbtnStat2 == true)
{
lastbtnStat2 = false;
}
if (regim2 == 0)
{
Status2 = false;
}
if (regim2 == 1)
{
Status2 = true;
}
client.loop();
}
void button3()
{
btnPress3 = digitalRead(BUTTON_3);
if (btnPress3 == LOW && lastbtnStat3 == false)
{
delay(100); // защита от дребезга
btnPress3 = digitalRead(BUTTON_3);
if (btnPress3 == LOW && lastbtnStat3 == false)
{
regim3++;
lastbtnStat3 = true;
if (regim3 > 1)
{
regim3 = 0;
}
client.publish(relays_topic3, String(regim3).c_str());
}
}
if (btnPress3 == HIGH && lastbtnStat3 == true)
{
lastbtnStat3 = false;
}
if (regim3 == 0)
{
Status3 = false;
}
if (regim3 == 1)
{
Status3 = true;
}
client.loop();
}
void button4()
{
btnPress4 = digitalRead(BUTTON_4);
if (btnPress4 == LOW && lastbtnStat4 == false)
{
delay(100); // защита от дребезга
btnPress4 = digitalRead(BUTTON_4);
if (btnPress4 == LOW && lastbtnStat4 == false)
{
regim4++;
lastbtnStat4 = true;
if (regim4 > 1)
{
regim4 = 0;
}
client.publish(relays_topic4, String(regim4).c_str());
}
}
if (btnPress4 == HIGH && lastbtnStat4 == true)
{
lastbtnStat4 = false;
}
if (regim4 == 0)
{
Status4 = false;
}
if (regim4 == 1)
{
Status4 = true;
}
client.loop();
}
void button5()
{
btnPress5 = digitalRead(BUTTON_5);
if (btnPress5 == LOW && lastbtnStat5 == false)
{
delay(100); // защита от дребезга
btnPress5 = digitalRead(BUTTON_5);
if (btnPress5 == LOW && lastbtnStat5 == false)
{
regim5++;
lastbtnStat5 = true;
if (regim5 > 1)
{
regim5 = 0;
}
client.publish(relays_topic5, String(regim5).c_str());
}
}
if (btnPress5 == HIGH && lastbtnStat5 == true)
{
lastbtnStat5 = false;
}
if (regim5 == 0)
{
Status5 = false;
}
if (regim5 == 1)
{
Status5 = true;
}
client.loop();
}
void button6()
{
btnPress6 = digitalRead(BUTTON_6);
if (btnPress6 == LOW && lastbtnStat6 == false)
{
delay(100); // защита от дребезга
btnPress6 = digitalRead(BUTTON_6);
if (btnPress6 == LOW && lastbtnStat6 == false)
{
regim6++;
lastbtnStat6 = true;
if (regim6 > 1)
{
regim6 = 0;
}
client.publish(relays_topic6, String(regim6).c_str());
}
}
if (btnPress6 == HIGH && lastbtnStat6 == true)
{
lastbtnStat6 = false;
}
if (regim6 == 0)
{
Status6 = false;
}
if (regim6 == 1)
{
Status6 = true;
}
client.loop();
}
void button7()
{
btnPress7 = digitalRead(BUTTON_7);
if (btnPress7 == LOW && lastbtnStat7 == false)
{
delay(100); // защита от дребезга
btnPress7 = digitalRead(BUTTON_7);
if (btnPress7 == LOW && lastbtnStat7 == false)
{
regim7++;
lastbtnStat7 = true;
if (regim7 > 1)
{
regim7 = 0;
}
client.publish(relays_topic7, String(regim7).c_str());
}
}
if (btnPress7 == HIGH && lastbtnStat7 == true)
{
lastbtnStat7 = false;
}
if (regim7 == 0)
{
Status7 = false;
}
if (regim7 == 1)
{
Status7 = true;
}
client.loop();
}
void button8()
{
btnPress8 = digitalRead(BUTTON_8);
if (btnPress8 == LOW && lastbtnStat8 == false)
{
delay(100); // защита от дребезга
btnPress8 = digitalRead(BUTTON_8);
if (btnPress8 == LOW && lastbtnStat8 == false)
{
regim8++;
lastbtnStat8 = true;
if (regim8 > 1)
{
regim8 = 0;
}
client.publish(relays_topic8, String(regim8).c_str());
}
}
if (btnPress8 == HIGH && lastbtnStat8 == true)
{
lastbtnStat8 = false;
}
if (regim8 == 0)
{
Status8 = false;
}
if (regim8 == 1)
{
Status8 = true;
}
client.loop();
}
void reconnect_server() //функция проверки подключения
{
//Serial.println("");
//Serial.println("WiFi connected");
//Serial.println("IP address: ");
//Serial.println(WiFi.localIP());
if (WiFi.status() != WL_CONNECTED) //если нет подключения с сети
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //подключаемся к WiFi
delay(6000);
// Serial.println("");
//Serial.println("WiFi connect..."); //выводим в монитор порта что пытаемся подключиться
}
if (!client.connected() && WiFi.status() == WL_CONNECTED) {
if (client.connect("ESP01Client")) {
// Serial.println("Mosquitto connect...");
client.setServer(Smart_Home, 1883); //подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100);
client.connect("ESP01Client");
delay (100);//конектимся с брокером как клиент
client.subscribe(relays_topic);
client.loop();
client.publish(relays_topic1, String(regim1).c_str());
client.loop();
client.publish(relays_topic2, String(regim2).c_str());
client.loop();
client.publish(relays_topic3, String(regim3).c_str());
client.loop();
client.publish(relays_topic4, String(regim4).c_str());
client.loop();
client.publish(relays_topic5, String(regim5).c_str());
client.loop();
client.publish(relays_topic6, String(regim6).c_str());
client.loop();
client.publish(relays_topic7, String(regim7).c_str());
client.loop();
client.publish(relays_topic8, String(regim8).c_str());
client.loop();
//подписываемся на топики
}
}
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
digitalWrite(latch, LOW);
shiftOut(data, clk, LSBFIRST, Dannie);
digitalWrite(latch, HIGH);
}
void loop()
{
client.loop();
button1();
button2();
button3();
button4();
button5();
button6();
button7();
button8();
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
digitalWrite(latch, LOW);
shiftOut(data, clk, LSBFIRST, Dannie);
digitalWrite(latch, HIGH);
//delay(200);
if (millis() - last_mls > 10000) //проверка подключений раз в 60 сек
{
last_mls = millis();
reconnect_server();
}
}
мало ли интересно будет, управление 8-ю реле по 8 кнопкам
Re: ESP8266 по MQTT
Добавлено: Чт апр 18, 2019 6:03 am
Forth
ZyaK писал(а): ↑Ср апр 17, 2019 6:23 am
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#include <ESP8266mDNS.h>
const char* ssid = "***********"; //Название сети
const char* password = "***********"; //пароль
const char* Smart_Home = "*************"; //ip брокера mqtt
мало ли интересно будет, управление 8-ю реле по 8 кнопкам
По моему 1 вопросу никто не может подсказать?
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
Re: ESP8266 по MQTT
Добавлено: Чт апр 18, 2019 6:21 am
ZyaK
Forth писал(а): ↑Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
Re: ESP8266 по MQTT
Добавлено: Чт апр 18, 2019 6:59 pm
Forth
ZyaK писал(а): ↑Чт апр 18, 2019 6:21 am
Forth писал(а): ↑Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
У меня архив не открывается, пишет архив поврежден.
Если Вам не тяжело можете скорректировать скетч под 3 кнопки и 3 реле, желательно без использования сдвигового регистра, а с использованием конкретных GPIO?!
Re: ESP8266 по MQTT
Добавлено: Вс апр 21, 2019 6:42 pm
Forth
На просторах Интернета нашел работающий скетч, на 3 кнопки и 3 реле, спасибо Интернету.
Может еще кому то пригодится.
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ХХХХХХХХ"; // Имя WI-FI сети
const char* password = "ХХХХХХХХХХХХ"; // Пароль WI-FI сети
const char* mqtt_server = "192.168.2.3"; // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
#define RELE_1 14 // Реле №1
#define RELE_2 12 // Реле №2
#define RELE_3 13 // Реле №3
#define BUTTON_1 16 // Кнопочный выключатель №1
#define BUTTON_2 5 // Кнопочный выключатель №2
#define BUTTON_3 4 // Кнопочный выключатель №3
#define relays_topic1 "ESP01/RELE_1" // Топик реле №1
#define relays_topic2 "ESP01/RELE_2" // Топик реле №2
#define relays_topic3 "ESP01/RELE_3" // Топик реле №3
WiFiClient espClient;
PubSubClient client(espClient);
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean rState2 = false;
boolean rState3 = false;
boolean btnPress1 = false;
boolean btnPress2 = false;
boolean btnPress3 = false;
boolean lastbtnStat1 = false;
boolean lastbtnStat2 = false;
boolean lastbtnStat3 = false;
void setup() {
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
pinMode(RELE_3, OUTPUT);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(BUTTON_3, INPUT);
digitalWrite(RELE_1, rState1);
digitalWrite(RELE_2, rState2);
digitalWrite(RELE_3, rState3);
Serial.begin(115200);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(100);
WiFi.begin(ssid, password);
delay(6000);
client.connect("ESP8266Client");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
lastbtnStat1 = digitalRead(BUTTON_1);
lastbtnStat2 = digitalRead(BUTTON_2);
lastbtnStat3 = digitalRead(BUTTON_3);
}
void reconnect_server() {
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect...");
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("");
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
if ((char)payload[0] == '1') {
rState1 = true;
digitalWrite(RELE_1, rState1);
}
else {
rState1 = false;
digitalWrite(RELE_1, rState1);
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_2") {
if ((char)payload[0] == '1') {
rState2 = true;
digitalWrite(RELE_2, rState2);
}
else {
rState2 = false;
digitalWrite(RELE_2, rState2);
}
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
// Блок [Управление Реле 3 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_3") {
if ((char)payload[0] == '1') {
rState3 = true;
digitalWrite(RELE_3, rState3);
}
else {
rState3 = false;
digitalWrite(RELE_3, rState3);
}
}
// Блок [Управление Реле 3 из MajorDomo] ************************************
}
// END Блок [обратная связь] ************************************************
// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 && !lastbtnStat1){
delay(300); // защита от дребезга (300 мсек.)
btnPress1 = digitalRead(BUTTON_1);
if(btnPress1){
rState1 = !rState1;
digitalWrite(RELE_1, rState1);
client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
}
}
lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************
// Блок [Управление Реле 2 с кнопки] ****************************************
void button_2(){
btnPress2 = digitalRead(BUTTON_2);
if (btnPress2 && !lastbtnStat2){
delay(300); // защита от дребезга (300 мсек.)
btnPress2 = digitalRead(BUTTON_2);
if(btnPress2){
rState2 = !rState2;
digitalWrite(RELE_2, rState2);
client.publish(relays_topic2, String(rState2).c_str(), true); // Публикуем состояние реле 2 на MQTT
}
}
lastbtnStat2 = btnPress2;
}
// END Блок [Управление Реле 2 с кнопки] ************************************
// Блок [Управление Реле 3 с кнопки] ****************************************
void button_3(){
btnPress3 = digitalRead(BUTTON_3);
if (btnPress3 && !lastbtnStat3){
delay(300); // защита от дребезга (300 мсек.)
btnPress3 = digitalRead(BUTTON_3);
if(btnPress3){
rState3 = !rState3;
digitalWrite(RELE_3, rState3);
client.publish(relays_topic3, String(rState3).c_str(), true); // Публикуем состояние реле 3 на MQTT
}
}
lastbtnStat3 = btnPress3;
}
// END Блок [Управление Реле 3 с кнопки] ************************************
void loop(){
client.loop();
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
last_mls = millis();
reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
button_2(); // Функция кнопки №2 и публикация статуса реле 2 на MQTT
button_3(); // Функция кнопки №3 и публикация статуса реле 3 на MQTT
}
Re: ESP8266 по MQTT
Добавлено: Пн май 06, 2019 12:20 am
Strangeman
ZyaK писал(а): ↑Чт апр 18, 2019 6:21 am
Forth писал(а): ↑Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
Нет ли схемы принципиальной в pdf? Не всем будет удобно открывать lay формат.
Re: ESP8266 по MQTT
Добавлено: Пн май 06, 2019 5:51 am
ZyaK
Strangeman писал(а): ↑Пн май 06, 2019 12:20 am
Нет ли схемы принципиальной в pdf? Не всем будет удобно открывать lay формат.
Схему не рисовал, сразу на печатку и в бой

Re: ESP8266 по MQTT
Добавлено: Ср май 08, 2019 9:51 am
prmres
Forth писал(а): ↑Чт апр 18, 2019 6:59 pm
У меня архив не открывается, пишет архив поврежден.
Winrar 5.61 открыл без проблем
Re: ESP8266 по MQTT
Добавлено: Сб сен 07, 2019 6:53 am
AlexFox
Forth писал(а): ↑Вс апр 21, 2019 6:42 pm
На просторах Интернета нашел работающий скетч, на 3 кнопки и 3 реле, спасибо Интернету.
Может еще кому то пригодится.
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ХХХХХХХХ"; // Имя WI-FI сети
const char* password = "ХХХХХХХХХХХХ"; // Пароль WI-FI сети
const char* mqtt_server = "192.168.2.3"; // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
#define RELE_1 14 // Реле №1
#define RELE_2 12 // Реле №2
#define RELE_3 13 // Реле №3
#define BUTTON_1 16 // Кнопочный выключатель №1
#define BUTTON_2 5 // Кнопочный выключатель №2
#define BUTTON_3 4 // Кнопочный выключатель №3
#define relays_topic1 "ESP01/RELE_1" // Топик реле №1
#define relays_topic2 "ESP01/RELE_2" // Топик реле №2
#define relays_topic3 "ESP01/RELE_3" // Топик реле №3
WiFiClient espClient;
PubSubClient client(espClient);
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean rState2 = false;
boolean rState3 = false;
boolean btnPress1 = false;
boolean btnPress2 = false;
boolean btnPress3 = false;
boolean lastbtnStat1 = false;
boolean lastbtnStat2 = false;
boolean lastbtnStat3 = false;
void setup() {
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
pinMode(RELE_3, OUTPUT);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(BUTTON_3, INPUT);
digitalWrite(RELE_1, rState1);
digitalWrite(RELE_2, rState2);
digitalWrite(RELE_3, rState3);
Serial.begin(115200);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(100);
WiFi.begin(ssid, password);
delay(6000);
client.connect("ESP8266Client");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
lastbtnStat1 = digitalRead(BUTTON_1);
lastbtnStat2 = digitalRead(BUTTON_2);
lastbtnStat3 = digitalRead(BUTTON_3);
}
void reconnect_server() {
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect...");
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("");
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
if ((char)payload[0] == '1') {
rState1 = true;
digitalWrite(RELE_1, rState1);
}
else {
rState1 = false;
digitalWrite(RELE_1, rState1);
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_2") {
if ((char)payload[0] == '1') {
rState2 = true;
digitalWrite(RELE_2, rState2);
}
else {
rState2 = false;
digitalWrite(RELE_2, rState2);
}
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
// Блок [Управление Реле 3 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_3") {
if ((char)payload[0] == '1') {
rState3 = true;
digitalWrite(RELE_3, rState3);
}
else {
rState3 = false;
digitalWrite(RELE_3, rState3);
}
}
// Блок [Управление Реле 3 из MajorDomo] ************************************
}
// END Блок [обратная связь] ************************************************
// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 && !lastbtnStat1){
delay(300); // защита от дребезга (300 мсек.)
btnPress1 = digitalRead(BUTTON_1);
if(btnPress1){
rState1 = !rState1;
digitalWrite(RELE_1, rState1);
client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
}
}
lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************
// Блок [Управление Реле 2 с кнопки] ****************************************
void button_2(){
btnPress2 = digitalRead(BUTTON_2);
if (btnPress2 && !lastbtnStat2){
delay(300); // защита от дребезга (300 мсек.)
btnPress2 = digitalRead(BUTTON_2);
if(btnPress2){
rState2 = !rState2;
digitalWrite(RELE_2, rState2);
client.publish(relays_topic2, String(rState2).c_str(), true); // Публикуем состояние реле 2 на MQTT
}
}
lastbtnStat2 = btnPress2;
}
// END Блок [Управление Реле 2 с кнопки] ************************************
// Блок [Управление Реле 3 с кнопки] ****************************************
void button_3(){
btnPress3 = digitalRead(BUTTON_3);
if (btnPress3 && !lastbtnStat3){
delay(300); // защита от дребезга (300 мсек.)
btnPress3 = digitalRead(BUTTON_3);
if(btnPress3){
rState3 = !rState3;
digitalWrite(RELE_3, rState3);
client.publish(relays_topic3, String(rState3).c_str(), true); // Публикуем состояние реле 3 на MQTT
}
}
lastbtnStat3 = btnPress3;
}
// END Блок [Управление Реле 3 с кнопки] ************************************
void loop(){
client.loop();
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
last_mls = millis();
reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
button_2(); // Функция кнопки №2 и публикация статуса реле 2 на MQTT
button_3(); // Функция кнопки №3 и публикация статуса реле 3 на MQTT
}
Доброго времени суток! Взял ваш скрипт, на ESP8266, Ip адрес берет, а по mqtt уже не конектится

- 2019-09-07_0951.png (44.01 КБ) 7314 просмотров