ESP8266 по MQTT

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Аватара пользователя
Argon
Сообщения: 2
Зарегистрирован: Пт авг 23, 2019 8:32 am
Благодарил (а): 5 раз
Поблагодарили: 3 раза

Re: ESP8266 по MQTT

Сообщение Argon » Пн сен 23, 2019 11:00 am

Полагаю что будет уместным выложить в этой теме как я решал ту же задачу.
Тоже ESP8266 и китайский 8-канальный релейный модуль.
ИзображениеИзображение
Вот только прошивку я компилировал на сайте https://wifi-iot.com/ (как-то привык уже к этому сервису)
Вот программные блоки из которых я собирал прошивку.
СпойлерПоказать
wifiiot.jpg
wifiiot.jpg (414.37 КБ) 4361 просмотр
С портами пришлось поэкспериментировать чтоб после перезагрузки ESP не уходила в безопасный режим
У меня задействованы следующие порты (один какой-то даже можно исключить)
СпойлерПоказать
gpio.jpg
gpio.jpg (76.73 КБ) 4361 просмотр
Через MQTT брокер mosquitto данные пробрасываются в MD (модуль MQTT)
СпойлерПоказать
mqtt.jpg
mqtt.jpg (105.62 КБ) 4361 просмотр
И в объектах уже делаем с этими данными что пожелаем.
СпойлерПоказать
objekts.jpg
objekts.jpg (78.36 КБ) 4361 просмотр
Нареканий к работе вроде нет.
ЗЫ. Я тут недавно, поэтому пока коряво у меня получается оформлять заметки. По возможности смогу ответить на вопросы в объеме моей компетенции.
За это сообщение автора Argon поблагодарили (всего 3):
Step40 (Чт окт 03, 2019 12:34 pm) • Plug (Чт окт 03, 2019 3:01 pm) • TrDA (Пт окт 04, 2019 2:09 pm)
Рейтинг: 3.49%
ZyaK
Сообщения: 417
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 71 раз

Re: ESP8266 по MQTT

Сообщение ZyaK » Чт окт 03, 2019 8:39 am

Argon писал(а):
Пн сен 23, 2019 11:00 am
Полагаю что будет уместным выложить в этой теме как я решал ту же задачу.
Тоже ESP8266 и китайский 8-канальный релейный модуль.
Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
Argon
Сообщения: 2
Зарегистрирован: Пт авг 23, 2019 8:32 am
Благодарил (а): 5 раз
Поблагодарили: 3 раза

Re: ESP8266 по MQTT

Сообщение Argon » Чт окт 03, 2019 9:29 am

Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
При отвале сервера это MQTT брокера? Так он (mosquitto) в моем случае у меня же в локальной сети и крутится на том же IP что и МД. И на orang pi pc plus тоже спокойно уживался с МД вместе. Во внешних серверах (за пределами локалки) в данном случае нет необходимости.
Упадет WiFi ? Имеется в виду пропадет связь с esp8266? Так в этом случае управлять ни одной esp-шкой не получится ибо WiFi основная их фишка.
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Вс май 24, 2020 11:55 pm

AlexFox писал(а):
Сб сен 07, 2019 6:53 am
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
Вы это как-то решили или нет? У меня тоже самое
Raspberry Pi3, с образа от Сергея 3.34
homester
Сообщения: 202
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 119 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Пн май 25, 2020 3:17 am

viktor6 писал(а):
Вс май 24, 2020 11:55 pm
Вы это как-то решили или нет? У меня тоже самое
Проверил из любопытства,- скетч рабочий.
Raspberry Pi3 B+, v4.44, внешняя з/к
homester
Сообщения: 202
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 119 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Пн май 25, 2020 3:23 am

Argon писал(а):
Чт окт 03, 2019 9:29 am
Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
При отвале сервера это MQTT брокера? Так он (mosquitto) в моем случае у меня же в локальной сети и крутится на том же IP что и МД. И на orang pi pc plus тоже спокойно уживался с МД вместе. Во внешних серверах (за пределами локалки) в данном случае нет необходимости.
Упадет WiFi ? Имеется в виду пропадет связь с esp8266? Так в этом случае управлять ни одной esp-шкой не получится ибо WiFi основная их фишка.
Я подключил дополнительно ИК-пульт. (не дружит у меня жена с планшетами)
Raspberry Pi3 B+, v4.44, внешняя з/к
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Чт май 28, 2020 11:38 pm

Ребята подскажите как решить
1 подключения к вайфай идет минуту
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
СпойлерПоказать

Код: Выделить всё

// Блок [Подключение библиотек] ************************************************
#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
}
Raspberry Pi3, с образа от Сергея 3.34
homester
Сообщения: 202
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 119 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Чт май 28, 2020 11:46 pm

viktor6 писал(а):
Чт май 28, 2020 11:38 pm
Ребята подскажите как решить
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
Инвертируй статус1
digitalWrite(RELE_1, !rState1);
За это сообщение автора homester поблагодарил:
viktor6 (Пт май 29, 2020 12:41 am)
Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Пт май 29, 2020 12:43 am

homester писал(а):
Чт май 28, 2020 11:46 pm
viktor6 писал(а):
Чт май 28, 2020 11:38 pm
Ребята подскажите как решить
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
Инвертируй статус1
digitalWrite(RELE_1, !rState1);
А как сделать чтобы при включении питания реле не включалось само?
Raspberry Pi3, с образа от Сергея 3.34
homester
Сообщения: 202
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 119 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Пт май 29, 2020 1:03 am

viktor6 писал(а):
Пт май 29, 2020 12:43 am
homester писал(а):
Чт май 28, 2020 11:46 pm
viktor6 писал(а):
Чт май 28, 2020 11:38 pm
Ребята подскажите как решить
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
Инвертируй статус1
digitalWrite(RELE_1, !rState1);
А как сделать чтобы при включении питания реле не включалось само?
Аналогично,

void setup(){
digitalWrite(RELE_1, !rState1);
}
Raspberry Pi3 B+, v4.44, внешняя з/к
Ответить