Страница 2 из 3
Re: ESP8266 по MQTT
Добавлено: Пн сен 23, 2019 11:00 am
Argon
Полагаю что будет уместным выложить в этой теме как я решал ту же задачу.
Тоже ESP8266 и китайский 8-канальный релейный модуль.


Вот только прошивку я компилировал на сайте
https://wifi-iot.com/ (как-то привык уже к этому сервису)
Вот программные блоки из которых я собирал прошивку.

- wifiiot.jpg (414.37 КБ) 4840 просмотров
С портами пришлось поэкспериментировать чтоб после перезагрузки ESP не уходила в безопасный режим
У меня задействованы следующие порты (один какой-то даже можно исключить)

- gpio.jpg (76.73 КБ) 4840 просмотров
Через MQTT брокер mosquitto данные пробрасываются в MD (модуль MQTT)

- mqtt.jpg (105.62 КБ) 4840 просмотров
И в объектах уже делаем с этими данными что пожелаем.

- objekts.jpg (78.36 КБ) 4840 просмотров
Нареканий к работе вроде нет.
ЗЫ. Я тут недавно, поэтому пока коряво у меня получается оформлять заметки. По возможности смогу ответить на вопросы в объеме моей компетенции.
Re: ESP8266 по MQTT
Добавлено: Чт окт 03, 2019 8:39 am
ZyaK
Argon писал(а): Пн сен 23, 2019 11:00 am
Полагаю что будет уместным выложить в этой теме как я решал ту же задачу.
Тоже ESP8266 и китайский 8-канальный релейный модуль.
Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
Re: ESP8266 по MQTT
Добавлено: Чт окт 03, 2019 9:29 am
Argon
Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
При отвале сервера это MQTT брокера? Так он (mosquitto) в моем случае у меня же в локальной сети и крутится на том же IP что и МД. И на orang pi pc plus тоже спокойно уживался с МД вместе. Во внешних серверах (за пределами локалки) в данном случае нет необходимости.
Упадет WiFi ? Имеется в виду пропадет связь с esp8266? Так в этом случае управлять ни одной esp-шкой не получится ибо WiFi основная их фишка.
Re: ESP8266 по MQTT
Добавлено: Вс май 24, 2020 11:55 pm
viktor6
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
Вы это как-то решили или нет? У меня тоже самое
Re: ESP8266 по MQTT
Добавлено: Пн май 25, 2020 3:17 am
homester
viktor6 писал(а): Вс май 24, 2020 11:55 pm
Вы это как-то решили или нет? У меня тоже самое
Проверил из любопытства,- скетч рабочий.
Re: ESP8266 по MQTT
Добавлено: Пн май 25, 2020 3:23 am
homester
Argon писал(а): Чт окт 03, 2019 9:29 am
Решение рабочее, НО
при отвале сервера или падении вайфая управлять никак не представится возможным.
При отвале сервера это MQTT брокера? Так он (mosquitto) в моем случае у меня же в локальной сети и крутится на том же IP что и МД. И на orang pi pc plus тоже спокойно уживался с МД вместе. Во внешних серверах (за пределами локалки) в данном случае нет необходимости.
Упадет WiFi ? Имеется в виду пропадет связь с esp8266? Так в этом случае управлять ни одной esp-шкой не получится ибо WiFi основная их фишка.
Я подключил дополнительно ИК-пульт. (не дружит у меня жена с планшетами)
Re: ESP8266 по MQTT
Добавлено: Чт май 28, 2020 11:38 pm
viktor6
Ребята подскажите как решить
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
}
Re: ESP8266 по MQTT
Добавлено: Чт май 28, 2020 11:46 pm
homester
viktor6 писал(а): Чт май 28, 2020 11:38 pm
Ребята подскажите как решить
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
Инвертируй статус1
digitalWrite(RELE_1, !rState1);
Re: ESP8266 по MQTT
Добавлено: Пт май 29, 2020 12:43 am
viktor6
homester писал(а): Чт май 28, 2020 11:46 pm
viktor6 писал(а): Чт май 28, 2020 11:38 pm
Ребята подскажите как решить
2 сразу при старте реле включается, а мне нужно чтобы было выкл
3 при 1 реле выкл, а при 0 вкл как поменять местами чтобы 1 это был вкл, а 0 выкл
Инвертируй статус1
digitalWrite(RELE_1, !rState1);
А как сделать чтобы при включении питания реле не включалось само?
Re: ESP8266 по MQTT
Добавлено: Пт май 29, 2020 1:03 am
homester
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);
}