ESP8266 по MQTT

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

Модератор: immortal

ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: ESP8266 по MQTT

Сообщение ZyaK » Пт май 29, 2020 7:54 am

Скетч внимательно смотрели?
Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
Dannie = ~Dannie;
PI2 + MQTT + 5 ESP8266 + Atmega16
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Пт май 29, 2020 11:21 pm

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);
}
Не помогло :oops:

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

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
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение 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Х
Raspberry Pi3 B+, v4.44, внешняя з/к
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Сб май 30, 2020 1:15 pm

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
888888.jpg (83.74 КБ) 2400 просмотров
Реле вот такое https://aliexpress.ru/item/32502425153.html
Raspberry Pi3, с образа от Сергея 3.34
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Сб май 30, 2020 2:53 pm

У меня на ESP8266-Witti работает без проблем. Смотри у себя. А в монитор порта я не гляжу, т.к. прошиваюсь по "воздуху". Проверяю лишь прохождение топиков по MQTT-Explorer
Кнопки подтянуты на минус? И вообще, за комментируй в Loop все обращения к кнопкам и попробуй.
Raspberry Pi3 B+, v4.44, внешняя з/к
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

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
}
За это сообщение автора homester поблагодарил:
viktor6 (Сб май 30, 2020 4:20 pm)
Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
viktor6
Сообщения: 273
Зарегистрирован: Вс авг 20, 2017 1:46 am
Благодарил (а): 142 раза
Поблагодарили: 13 раз

Re: ESP8266 по MQTT

Сообщение viktor6 » Сб май 30, 2020 4:20 pm

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
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: ESP8266 по MQTT

Сообщение homester » Сб май 30, 2020 4:27 pm

Отправляя и получая данные по одному и тому-же топику,- рискуешь получить зацикливание.
За это сообщение автора homester поблагодарил:
viktor6 (Сб май 30, 2020 10:33 pm)
Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
Ответить