Помогите разобраться, пытаюсь настроить, чтоб из МД по кнопке управлять реле, нашел в Интернете 2 скетча, подправил под себя, чтоб попроще было разобраться как работает, 1 скетч включает реле на 2 секунды и выключает, хотя статус в МД не меняется за эти 2 секунды.
2 скетч не публикует топик в МД и в MQTTLens пусто.
1 скетч
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SD 2.4G_2"; //Название сети
const char* password = "xxxxxxxxx"; //пароль
const char* mqtt_server = "192.168.2.3"; //ip брокера mqtt
#define RELAY_2 14 //Выход на реле или светодиод на ESP
#define relays_topic2 "ESP04/relay_2" //публикуемый топик
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long last_mls = millis(); //функция времени в милисекундах
long last_mls3 = millis(); //функция времени для отправки топиков
boolean Status2 = true; //объявляем статус реле в 0 (true, false
// boolean lastbtnStat2 = false;
int status2 = 0; //режим по умолчанию при включении
void setup() //Выполняется при запуске 1 раз
{
pinMode(RELAY_2, OUTPUT); //Выход на реле или светодиод
digitalWrite(RELAY_2, Status2); //устанавливаем на выходе статус реле
Serial.begin(115200); //инициализация монитора порта
client.setServer(mqtt_server, 1883); //подключаемся к MQTT
client.setCallback(callback); //функция получения топиков с брокера
delay(100); //ждем 100 милисекунд
WiFi.begin(ssid, password); //подключаемся к WiFi
delay(5000); //ждем 5 секунд
client.connect("ESP04Client"); //конектимся с брокером как клиент
client.subscribe(relays_topic2); //подписываемся на топик
}
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();
if (strTopic == "ESP04/relay_2") {
if ((char)payload[0] == '0') {
Status2 = false;
digitalWrite(RELAY_2, Status2);
}
else if ((char)payload[0] == '1') {
Status2 = true;
digitalWrite(RELAY_2, Status2);
}
}
}
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.println("IP address: ");
Serial.println(WiFi.localIP());
}
if (!client.connected() && WiFi.status() == WL_CONNECTED) { //если к сети подключились но к MQTT нет
client.subscribe(relays_topic2); //подписываемся на топик
Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
}
}
void MQTT() //публикуем топик с состоянием режима
{
if (millis() - last_mls3 > 2000) //периодичность публикации топика
{ last_mls3 = millis();
client.publish(relays_topic2, String(status2).c_str(), true);
Serial.println("WiFinnected");
}
}
void loop()
{
client.loop();
MQTT();
if (millis() - last_mls > 60000) //проверка подключений раз в 60 сек
{
last_mls = millis();
reconnect_server();
}
}
Код: Выделить всё
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "SD 2.4G_2"; //Название сети
const char* password = "xxxxxxxx"; //пароль
const char* mqtt_server = "192.168.2.3"; //ip брокера mqtt
#define RELE_1 14 // Реле №1
#define BUTTON_1 13 // Кнопочный выключатель №1
#define relays_topic1 "ESP01/RELE_1" // Топик реле №1
WiFiClient espClient; //инициализация WiFi клиента
PubSubClient client(espClient); //инициализация MQTT клиента
long lastMsg = 0;
long last_mls = millis(); //функция времени в милисекундах
char msg[50];
int value = 0;
int hum = 0;
int diff = 1;
boolean rState1 = false;
boolean btnPress1 = false;
boolean lastbtnStat1 = false;
void setup() {
// инициализируем последовательный порт (для отладочных целей):
Serial.begin(115200);
delay(10);
pinMode(RELE_1, OUTPUT);
pinMode(BUTTON_1, INPUT);
digitalWrite(RELE_1, rState1);
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);
lastbtnStat1 = digitalRead(BUTTON_1);
}
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.println("IP address: ");
Serial.println(WiFi.localIP());
}
if(!client.connected() && WiFi.status() == WL_CONNECTED){
if (client.connect("ESP8266Client")) {
Serial.println("Mosquitto connect...");
client.subscribe(relays_topic1);
} else {
Serial.print("failed connect Mosquitto, rc=");
Serial.print(client.state());
Serial.println("");
}
}
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String strTopic = String(topic);
String strPayload = String((char*)payload);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
if ((char)payload[0] == '1') {
rState1 = true;
digitalWrite(RELE_1, rState1);
}
else {
rState1 = false;
digitalWrite(RELE_1, rState1);
}
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
}
// END Блок [обратная связь] ************************************************
bool checkBound(float newValue, float prevValue, float maxDiff) {
return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}
// Выключатель №1
void buttonWF(){
btnPress1 = digitalRead(BUTTON_1);
if (btnPress1 && !lastbtnStat1){
delay(400); // защита от дребезга (600 мсек.)
btnPress1 = digitalRead(BUTTON_1);
if(btnPress1){
rState1 = !rState1;
digitalWrite(RELE_1, rState1);
// публикуем изменение состояния реле на брокер
client.publish(relays_topic1, String(rState1).c_str(), true);
}
}
lastbtnStat1 = btnPress1;
}
// END Выключатель №1
void loop() {
client.loop();
// 120 секунд периодичность проверки переподключения
if (millis() - last_mls > 120000) {
last_mls = millis();
reconnect_server();
}
buttonWF(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
}