Snezhana
New member
Ребята помогите решить задачу.
Плата ESP8266 управляет тремя реле через MajorDomo
Вот скетч:
Топик ESP01/RELE_1 Включает и выключает Реле 1
Топик ESP01/RELE_2 Включает и выключает Реле 2
Топик ESP01/RELE_2 Включает и выключает Реле 2
установлена она на лестнице но иногда кратковременно пропадает электричество и при включении плата по умолчанию отключает все реле.
А нужно чтобы она принимала те значения которые были установлены в MajorDomo
Плата ESP8266 управляет тремя реле через MajorDomo
Вот скетч:
Код:
// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ssid"; // Имя WI-FI сети
const char* password = "password"; // Пароль WI-FI сети
const char* mqtt_server = "192.168.200.251"; // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
#define RELE_1 14 // Реле №1
#define RELE_2 12 // Реле №2
#define RELE_3 13 // Реле №3
#define BUTTON_1 16 // Кнопочный выключатель №1
#define BUTTON_2 5 // Кнопочный выключатель №2
#define BUTTON_3 4 // Кнопочный выключатель №3
#define relays_topic1 "ESP01/RELE_1" // Топик реле №1
#define relays_topic2 "ESP01/RELE_2" // Топик реле №2
#define relays_topic3 "ESP01/RELE_3" // Топик реле №3
WiFiClient espClient;
PubSubClient client(espClient);
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean rState2 = false;
boolean rState3 = false;
boolean btnPress1 = false;
boolean btnPress2 = false;
boolean btnPress3 = false;
boolean lastbtnStat1 = false;
boolean lastbtnStat2 = false;
boolean lastbtnStat3 = false;
void setup() {
pinMode(RELE_1, OUTPUT);
pinMode(RELE_2, OUTPUT);
pinMode(RELE_3, OUTPUT);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(BUTTON_3, INPUT);
digitalWrite(RELE_1, rState1);
digitalWrite(RELE_2, rState2);
digitalWrite(RELE_3, rState3);
Serial.begin(115200);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(100);
WiFi.begin(ssid, password);
delay(6000);
client.connect("ESP8266Client");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
lastbtnStat1 = digitalRead(BUTTON_1);
lastbtnStat2 = digitalRead(BUTTON_2);
lastbtnStat3 = digitalRead(BUTTON_3);
}
void reconnect_server() {
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("WiFi connect...");
} else {
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("");
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(relays_topic1);
client.subscribe(relays_topic2);
client.subscribe(relays_topic3);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload);
}
Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
if ((char)payload[0] == '1') {
rState1 = true;
digitalWrite(RELE_1, rState1);
}
else {
rState1 = false;
digitalWrite(RELE_1, rState1);
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_2") {
if ((char)payload[0] == '1') {
rState2 = true;
digitalWrite(RELE_2, rState2);
}
else {
rState2 = false;
digitalWrite(RELE_2, rState2);
}
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
// Блок [Управление Реле 3 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_3") {
if ((char)payload[0] == '1') {
rState3 = true;
digitalWrite(RELE_3, rState3);
}
else {
rState3 = false;
digitalWrite(RELE_3, rState3);
}
}
// Блок [Управление Реле 3 из MajorDomo] ************************************
}
// END Блок [обратная связь] ************************************************
// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 && !lastbtnStat1){
delay(300); // защита от дребезга (300 мсек.)
btnPress1 = digitalRead(BUTTON_1);
if(btnPress1){
rState1 = !rState1;
digitalWrite(RELE_1, rState1);
client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
}
}
lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************
// Блок [Управление Реле 2 с кнопки] ****************************************
void button_2(){
btnPress2 = digitalRead(BUTTON_2);
if (btnPress2 && !lastbtnStat2){
delay(300); // защита от дребезга (300 мсек.)
btnPress2 = digitalRead(BUTTON_2);
if(btnPress2){
rState2 = !rState2;
digitalWrite(RELE_2, rState2);
client.publish(relays_topic2, String(rState2).c_str(), true); // Публикуем состояние реле 2 на MQTT
}
}
lastbtnStat2 = btnPress2;
}
// END Блок [Управление Реле 2 с кнопки] ************************************
// Блок [Управление Реле 3 с кнопки] ****************************************
void button_3(){
btnPress3 = digitalRead(BUTTON_3);
if (btnPress3 && !lastbtnStat3){
delay(300); // защита от дребезга (300 мсек.)
btnPress3 = digitalRead(BUTTON_3);
if(btnPress3){
rState3 = !rState3;
digitalWrite(RELE_3, rState3);
client.publish(relays_topic3, String(rState3).c_str(), true); // Публикуем состояние реле 3 на MQTT
}
}
lastbtnStat3 = btnPress3;
}
// END Блок [Управление Реле 3 с кнопки] ************************************
void loop(){
client.loop();
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
last_mls = millis();
reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
button_2(); // Функция кнопки №2 и публикация статуса реле 2 на MQTT
button_3(); // Функция кнопки №3 и публикация статуса реле 3 на MQTT
}
Топик ESP01/RELE_2 Включает и выключает Реле 2
Топик ESP01/RELE_2 Включает и выключает Реле 2
установлена она на лестнице но иногда кратковременно пропадает электричество и при включении плата по умолчанию отключает все реле.
А нужно чтобы она принимала те значения которые были установлены в MajorDomo
Последнее редактирование: