Страница 3 из 3
Re: ESP8266 по MQTT
Добавлено: Пт май 29, 2020 7:54 am
ZyaK
Скетч внимательно смотрели?
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
Re: ESP8266 по MQTT
Добавлено: Пт май 29, 2020 11:21 pm
viktor6
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);
}
Не помогло
Код: Выделить всё
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
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 3:01 am
homester
Попробуй вот этот код.
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#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
}
Если модуль реле шибанутый (ноль на входе,- реле включено), то найди все строчки с digitalWrite() и инвертируй rStateХ
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 1:15 pm
viktor6
homester писал(а): Сб май 30, 2020 3:01 am
Попробуй вот этот код.
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#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
}
Если модуль реле шибанутый (ноль на входе,- реле включено), то найди все строчки с digitalWrite() и инвертируй rStateХ
Вообще не видно подключился он к вайфаю или нет в мониторе порта только это
и всеравно после прошивки состояния вкл

- 888888.jpg (83.74 КБ) 3195 просмотров
Реле вот такое
https://aliexpress.ru/item/32502425153.html
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 2:53 pm
homester
У меня на ESP8266-Witti работает без проблем. Смотри у себя. А в монитор порта я не гляжу, т.к. прошиваюсь по "воздуху". Проверяю лишь прохождение топиков по MQTT-Explorer
Кнопки подтянуты на минус? И вообще, за комментируй в Loop все обращения к кнопкам и попробуй.
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 3:52 pm
homester
Вот тебе код с монитором порта
Код: Выделить всё
// Блок [Подключение библиотек] ************************************************
#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
}
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 4:20 pm
viktor6
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;
}
Re: ESP8266 по MQTT
Добавлено: Сб май 30, 2020 4:27 pm
homester
Отправляя и получая данные по одному и тому-же топику,- рискуешь получить зацикливание.