ESP8266 по MQTT
Модератор: immortal
-
- Сообщения: 407
- Зарегистрирован: Вт окт 24, 2017 2:01 pm
- Откуда: Ижевск
- Благодарил (а): 45 раз
- Поблагодарили: 69 раз
Re: ESP8266 по MQTT
Скетч внимательно смотрели?
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
PI2 + MQTT + 5 ESP8266 + Atmega16
-
- Сообщения: 273
- Зарегистрирован: Вс авг 20, 2017 1:46 am
- Благодарил (а): 142 раза
- Поблагодарили: 13 раз
Re: ESP8266 по MQTT
Не помоглоhomester писал(а): ↑Пт май 29, 2020 1:03 amАналогично,
void setup(){
digitalWrite(RELE_1, !rState1);
}
Код: Выделить всё
23:20:21.575 -> WiFi connected
23:20:21.575 -> IP address: 192.168.0.107
23:20:21.575 -> Mosquitto connect...
23:20:21.575 -> Message arrived [ESP01/RELE_1] 1
23:20:21.814 -> Message arrived [ESP01/RELE_2] 1
23:21:21.572 ->
23:21:21.572 -> WiFi connected
23:21:21.572 -> IP address: 192.168.0.107
Raspberry Pi3, с образа от Сергея 3.34
-
- Сообщения: 194
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 112 раз
- Поблагодарили: 34 раза
Re: ESP8266 по MQTT
Попробуй вот этот код.
Если модуль реле шибанутый (ноль на входе,- реле включено), то найди все строчки с digitalWrite() и инвертируй rStateХ
СпойлерПоказать
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "XXXXXXX"; // Имя WI-FI сети
const char* password = "XXXXXXXX"; // Пароль WI-FI сети
const char* mqtt_server = "192.168.0.3"; //адрес брокера MQTT
#define ESPClient "ESP10"
WiFiClient espClient; //инициализация WiFi
PubSubClient client(espClient); //инициализация MQTT
#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 topic1 "ESP10/wRELE_1" // Топик реле №1
#define topic2 "ESP10/wRELE_2" // Топик реле №2
#define topic3 "ESP10/wRELE_3" // Топик реле №3
/* Топики для публикации */
#define topic4 "ESP10/RELE_1" // Топик реле №1
#define topic5 "ESP10/RELE_2" // Топик реле №2
#define topic6 "ESP10/RELE_3" // Топик реле №3
long last_mls = millis();
char msg[50];
boolean rState1,rState2,rState3;
boolean btnPress1,btnPress2,btnPress3;
boolean lastbtnStat1,lastbtnStat2,lastbtnStat3;
void setup() {
Serial.begin(115200);
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);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
delay(5000);
ESP.restart();
}
/* MQTT */
client.setServer(mqtt_server, 1883);//подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100); //ждем 100 милисекунд
client.connect(ESPClient); //конектимся с брокером как клиент
client.subscribe(topic1);
client.subscribe(topic2);
client.subscribe(topic3);
lastbtnStat1 = digitalRead(BUTTON_1);
lastbtnStat2 = digitalRead(BUTTON_2);
lastbtnStat3 = digitalRead(BUTTON_3);
}
void reconnect_server() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.subscribe(topic1);
client.subscribe(topic2);
client.subscribe(topic3);
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
String strTopic = String(topic); //конвертируем в стринг полученый топик
String strPayload = String((char*)payload); //конвертируем в стринг полученные данные с топика
Serial.print(strTopic);
Serial.print(": ");
Serial.print(length);
Serial.print(" : ");
String v;
int x;
for (int i = 0; i < length; i++) {
v+=String((char)payload[i]);
}
if (strTopic == topic1) {rState1=v.toInt(); digitalWrite(RELE_1, rState1);}
else if (strTopic == topic2) {rState2=v.toInt(); digitalWrite(RELE_2, rState2);}
else if (strTopic == topic3) {rState3=v.toInt(); digitalWrite(RELE_3, rState3);}
}
// Блок [Управление Реле 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(topic4, 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(topic5, 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(topic6, 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 B+, v4.44, внешняя з/к
-
- Сообщения: 273
- Зарегистрирован: Вс авг 20, 2017 1:46 am
- Благодарил (а): 142 раза
- Поблагодарили: 13 раз
Re: ESP8266 по MQTT
Вообще не видно подключился он к вайфаю или нет в мониторе порта только этоhomester писал(а): ↑Сб май 30, 2020 3:01 amПопробуй вот этот код.Если модуль реле шибанутый (ноль на входе,- реле включено), то найди все строчки с digitalWrite() и инвертируй rStateХСпойлерПоказатьКод: Выделить всё
// Блок [Подключение библиотек] ************************************************ #include <ESP8266WiFi.h> #include <PubSubClient.h> // END Блок [Подключение библиотек] ******************************************** // Блок [Подключение к сети WI-FI] ********************************************* const char* ssid = "XXXXXXX"; // Имя WI-FI сети const char* password = "XXXXXXXX"; // Пароль WI-FI сети const char* mqtt_server = "192.168.0.3"; //адрес брокера MQTT #define ESPClient "ESP10" WiFiClient espClient; //инициализация WiFi PubSubClient client(espClient); //инициализация MQTT #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 topic1 "ESP10/wRELE_1" // Топик реле №1 #define topic2 "ESP10/wRELE_2" // Топик реле №2 #define topic3 "ESP10/wRELE_3" // Топик реле №3 /* Топики для публикации */ #define topic4 "ESP10/RELE_1" // Топик реле №1 #define topic5 "ESP10/RELE_2" // Топик реле №2 #define topic6 "ESP10/RELE_3" // Топик реле №3 long last_mls = millis(); char msg[50]; boolean rState1,rState2,rState3; boolean btnPress1,btnPress2,btnPress3; boolean lastbtnStat1,lastbtnStat2,lastbtnStat3; void setup() { Serial.begin(115200); 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); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { delay(5000); ESP.restart(); } /* MQTT */ client.setServer(mqtt_server, 1883);//подключаемся к MQTT client.setCallback(callback); //функция получения топиков с брокера delay(100); //ждем 100 милисекунд client.connect(ESPClient); //конектимся с брокером как клиент client.subscribe(topic1); client.subscribe(topic2); client.subscribe(topic3); lastbtnStat1 = digitalRead(BUTTON_1); lastbtnStat2 = digitalRead(BUTTON_2); lastbtnStat3 = digitalRead(BUTTON_3); } void reconnect_server() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); client.subscribe(topic1); client.subscribe(topic2); client.subscribe(topic3); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } // Блок [обратная связь] **************************************************** void callback(char* topic, byte* payload, unsigned int length) { String strTopic = String(topic); //конвертируем в стринг полученый топик String strPayload = String((char*)payload); //конвертируем в стринг полученные данные с топика Serial.print(strTopic); Serial.print(": "); Serial.print(length); Serial.print(" : "); String v; int x; for (int i = 0; i < length; i++) { v+=String((char)payload[i]); } if (strTopic == topic1) {rState1=v.toInt(); digitalWrite(RELE_1, rState1);} else if (strTopic == topic2) {rState2=v.toInt(); digitalWrite(RELE_2, rState2);} else if (strTopic == topic3) {rState3=v.toInt(); digitalWrite(RELE_3, rState3);} } // Блок [Управление Реле 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(topic4, 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(topic5, 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(topic6, 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
-
- Сообщения: 194
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 112 раз
- Поблагодарили: 34 раза
Re: ESP8266 по MQTT
У меня на ESP8266-Witti работает без проблем. Смотри у себя. А в монитор порта я не гляжу, т.к. прошиваюсь по "воздуху". Проверяю лишь прохождение топиков по MQTT-Explorer
Кнопки подтянуты на минус? И вообще, за комментируй в Loop все обращения к кнопкам и попробуй.
Кнопки подтянуты на минус? И вообще, за комментируй в Loop все обращения к кнопкам и попробуй.
Raspberry Pi3 B+, v4.44, внешняя з/к
-
- Сообщения: 194
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 112 раз
- Поблагодарили: 34 раза
Re: ESP8266 по MQTT
Вот тебе код с монитором порта
СпойлерПоказать
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "xxxxxxx"; // Имя WI-FI сети
const char* password = "xxxxxxx"; // Пароль WI-FI сети
const char* host = "ESP10";
const char* mqtt_server = "192.168.0.3"; //адрес брокера MQTT
#define ESPClient "ESP10"
WiFiClient espClient; //инициализация WiFi
PubSubClient client(espClient); //инициализация MQTT
#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 topic1 "ESP10/wRELE_1" // Топик реле №1
#define topic2 "ESP10/wRELE_2" // Топик реле №2
#define topic3 "ESP10/wRELE_3" // Топик реле №3
/* Топики для публикации */
#define topic4 "ESP10/RELE_1" // Топик реле №1
#define topic5 "ESP10/RELE_2" // Топик реле №2
#define topic6 "ESP10/RELE_3" // Топик реле №3
long last_mls = millis();
char msg[50];
boolean rState1,rState2,rState3;
boolean btnPress1,btnPress2,btnPress3;
boolean lastbtnStat1,lastbtnStat2,lastbtnStat3;
void setup() {
Serial.begin(115200);
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);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
delay(5000);
ESP.restart();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("");
/* MQTT */
client.setServer(mqtt_server, 1883);//подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100); //ждем 100 милисекунд
client.connect(ESPClient); //конектимся с брокером как клиент
if (!client.connected()){
Serial.print("failed, rc=");
Serial.print(client.state());
}
else {
Serial.println("MQTT connected");
client.subscribe(topic1);
client.subscribe(topic2);
client.subscribe(topic3);
}
lastbtnStat1 = digitalRead(BUTTON_1);
lastbtnStat2 = digitalRead(BUTTON_2);
lastbtnStat3 = digitalRead(BUTTON_3);
}
void reconnect_server() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.subscribe(topic1);
client.subscribe(topic2);
client.subscribe(topic3);
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
String strTopic = String(topic); //конвертируем в стринг полученый топик
String strPayload = String((char*)payload); //конвертируем в стринг полученные данные с топика
Serial.print(strTopic);
Serial.print(": ");
Serial.print(length);
Serial.print(" : ");
String v;
int x;
for (int i = 0; i < length; i++) {
v+=String((char)payload[i]);
}
if (strTopic == topic1) {rState1=v.toInt(); digitalWrite(RELE_1, rState1);}
else if (strTopic == topic2) {rState2=v.toInt(); digitalWrite(RELE_2, rState2);}
else if (strTopic == topic3) {rState3=v.toInt(); digitalWrite(RELE_3, rState3);}
}
// Блок [Управление Реле 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(topic4, 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(topic5, 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(topic6, 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
}
- Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
-
- Сообщения: 273
- Зарегистрирован: Вс авг 20, 2017 1:46 am
- Благодарил (а): 142 раза
- Поблагодарили: 13 раз
Re: ESP8266 по MQTT
Спасибоhomester писал(а): ↑Сб май 30, 2020 3:52 pmВот тебе код с монитором портаСпойлерПоказатьКод: Выделить всё
// Блок [Подключение библиотек] ************************************************ #include <ESP8266WiFi.h> #include <PubSubClient.h> // END Блок [Подключение библиотек] ******************************************** // Блок [Подключение к сети WI-FI] ********************************************* const char* ssid = "xxxxxxx"; // Имя WI-FI сети const char* password = "xxxxxxx"; // Пароль WI-FI сети const char* host = "ESP10"; const char* mqtt_server = "192.168.0.3"; //адрес брокера MQTT #define ESPClient "ESP10" WiFiClient espClient; //инициализация WiFi PubSubClient client(espClient); //инициализация MQTT #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 topic1 "ESP10/wRELE_1" // Топик реле №1 #define topic2 "ESP10/wRELE_2" // Топик реле №2 #define topic3 "ESP10/wRELE_3" // Топик реле №3 /* Топики для публикации */ #define topic4 "ESP10/RELE_1" // Топик реле №1 #define topic5 "ESP10/RELE_2" // Топик реле №2 #define topic6 "ESP10/RELE_3" // Топик реле №3 long last_mls = millis(); char msg[50]; boolean rState1,rState2,rState3; boolean btnPress1,btnPress2,btnPress3; boolean lastbtnStat1,lastbtnStat2,lastbtnStat3; void setup() { Serial.begin(115200); 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); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { delay(5000); ESP.restart(); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print(""); /* MQTT */ client.setServer(mqtt_server, 1883);//подключаемся к MQTT client.setCallback(callback); //функция получения топиков с брокера delay(100); //ждем 100 милисекунд client.connect(ESPClient); //конектимся с брокером как клиент if (!client.connected()){ Serial.print("failed, rc="); Serial.print(client.state()); } else { Serial.println("MQTT connected"); client.subscribe(topic1); client.subscribe(topic2); client.subscribe(topic3); } lastbtnStat1 = digitalRead(BUTTON_1); lastbtnStat2 = digitalRead(BUTTON_2); lastbtnStat3 = digitalRead(BUTTON_3); } void reconnect_server() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); client.subscribe(topic1); client.subscribe(topic2); client.subscribe(topic3); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } // Блок [обратная связь] **************************************************** void callback(char* topic, byte* payload, unsigned int length) { String strTopic = String(topic); //конвертируем в стринг полученый топик String strPayload = String((char*)payload); //конвертируем в стринг полученные данные с топика Serial.print(strTopic); Serial.print(": "); Serial.print(length); Serial.print(" : "); String v; int x; for (int i = 0; i < length; i++) { v+=String((char)payload[i]); } if (strTopic == topic1) {rState1=v.toInt(); digitalWrite(RELE_1, rState1);} else if (strTopic == topic2) {rState2=v.toInt(); digitalWrite(RELE_2, rState2);} else if (strTopic == topic3) {rState3=v.toInt(); digitalWrite(RELE_3, rState3);} } // Блок [Управление Реле 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(topic4, 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(topic5, 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(topic6, 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 }
Вот попробовал из двух сделать одно вроде работает
Может что-то и не так но не знаю как правильно
СпойлерПоказать
Код: Выделить всё
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
//EDIT THESE LINES TO MATCH YOUR SETUP
#define MQTT_SERVER "192.168.0.10"
const char* ssid = "xxxxxxx";
const char* password = "xxxxxxx";
//LED on ESP8266 GPIO14
const int lightPin1 = 14;
const int lightPin2 = 12;
const char* lightTopic1 = "/ESP-04/light1";
const char* lightTopic2 = "/ESP-04/light2";
WiFiClient wifiClient;
void callback(char* topic, byte* payload, unsigned int length); // add this in your code
PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);
void setup() {
//initialize the light as an output and set to LOW HIGH (off)
pinMode(lightPin1, OUTPUT);
digitalWrite(lightPin1, HIGH);
pinMode(lightPin2, OUTPUT);
digitalWrite(lightPin2, HIGH);
//start the serial line for debugging
Serial.begin(115200);
delay(100);
//start wifi subsystem
WiFi.begin(ssid, password);
//attempt to connect to the WIFI network and then connect to the MQTT server
reconnect();
//wait a bit before starting the main loop
delay(2000);
}
void loop(){
//reconnect if connection is lost
if (!client.connected() && WiFi.status() == 3) {reconnect();}
//maintain MQTT connection
client.loop();
//MUST delay to allow ESP8266 WIFI functions to run
delay(10);
}
// Блок [обратная связь] ****************************************************
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 == lightTopic1) {
if ((char)payload[0] == '1') {
digitalWrite(lightPin1, LOW);
//client.publish("/test/confirm1", "Light1 On");
}
else {
digitalWrite(lightPin1, HIGH);
// client.publish("/test/confirm1", "Light1 Off");
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == lightTopic2) {
if ((char)payload[0] == '1') {
digitalWrite(lightPin2, LOW);
// client.publish("/test/confirm2", "Light2 On");
}
else {
digitalWrite(lightPin2, HIGH);
// client.publish("/test/confirm2", "Light2 Off");
}
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
}
void reconnect() {
//attempt to connect to the wifi if connection is lost
if(WiFi.status() != WL_CONNECTED){
//debug printing
Serial.print("Connecting to ");
Serial.println(ssid);
//loop while we wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//print out some more debug once connected
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
//make sure we are connected to WIFI before attemping to reconnect to MQTT
if(WiFi.status() == WL_CONNECTED){
// Loop until we're reconnected to the MQTT server
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Generate client name based on MAC address and last 8 bits of microsecond counter
String clientName;
clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
//if connected, subscribe to the topic(s) we want to be notified about
if (client.connect((char*) clientName.c_str())) {
Serial.print("\tMTQQ Connected");
client.publish(lightTopic1, 0);
client.publish(lightTopic2, 0);
}
//otherwise print failed for debugging
else{
Serial.println("\tFailed.");
abort();
}
//подписываемся по топики
client.subscribe(lightTopic1);
client.loop();
client.subscribe(lightTopic2);
client.loop();
}
}
}
//generate unique name from MAC addr
String macToStr(const uint8_t* mac){
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5){
result += ':';
}
}
return result;
}
Raspberry Pi3, с образа от Сергея 3.34
-
- Сообщения: 194
- Зарегистрирован: Вт дек 24, 2019 2:09 pm
- Благодарил (а): 112 раз
- Поблагодарили: 34 раза
Re: ESP8266 по MQTT
Отправляя и получая данные по одному и тому-же топику,- рискуешь получить зацикливание.
- Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к