Nodemcu. Самопроизвольное включение нагрузки
- Войдите на сайт для отправки комментариев
Ср, 15/09/2021 - 20:51
Добрый день. В интернетах найден код прошивки nodemcu для связи через mqtt с homeassistant. Данный код взят за основу и используется в нескольких проектах. Косяк в том, что нагрузка начинает самопроизвольно включаться через рандомные промежутки времени. Т.е. сидишь ты в комнате в темноте, бац включился свет. Так и не понял в чем проблема. Призываю коллективный разум. Спасибо.
#include <RBDdimmer.h> #include <OneButton.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> #define BUTTON_DOWN 5 #define BUTTON_UP 4 #define USE_SERIAL Serial #define outputPin 13 #define zerocross 12 // for boards with CHANGEBLE input pins #define LAMPMAXVALUE 100 dimmerLamp dimmer(outputPin, zerocross); //initialase port for dimmer for ESP8266, ESP32, Arduino due boards OneButton buttonDown = OneButton( BUTTON_DOWN, // Input pin for the button false, // Button is active LOW false // Enable internal pull-up resistor ); OneButton buttonUp = OneButton( BUTTON_UP, // Input pin for the button false, // Button is active LOW false // Enable internal pull-up resistor ); const char *ssid = "admin"; // Имя вайфай точки доступа const char *pass = "admin"; // Пароль от точки доступа const char *mqtt_server = "192.168.1.100"; // Имя сервера MQTT const int mqtt_port = 1883; // Порт для подключения к серверу MQTT const char *mqtt_user = ""; // Логи от сервер const char *mqtt_pass = ""; // Пароль от сервера int mainLamp = 30; WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); void setup() { USE_SERIAL.begin(9600); dimmer.begin(NORMAL_MODE, OFF); //dimmer initialisation: name.begin(MODE, STATE) buttonDown.attachClick(DimmerOff); buttonUp.attachClick(DimmerOn); buttonDown.attachDuringLongPress(DimmerDown); buttonUp.attachDuringLongPress(DimmerUp); buttonDown.setDebounceTicks(40); buttonUp.setDebounceTicks(40); buttonDown.setPressTicks(1000); buttonUp.setPressTicks(1000); } void DimmerOff() { dimmer.begin(NORMAL_MODE, OFF); client.publish("Dimmer/light/status", "OFF"); client.publish("Dimmer/light/100/status", "OFF"); client.publish("Dimmer/light/40/status", "OFF"); client.publish("Dimmer/light/60/status", "OFF"); client.publish("Dimmer/light/80/status", "OFF"); } void DimmerOn() { String myString; dimmer.begin(NORMAL_MODE, ON); dimmer.setPower(mainLamp); myString = String(mainLamp); client.publish("Dimmer/light/status", "ON"); client.publish("Dimmer/brightness/status", myString); } void DimmerDown() { String myString; if (mainLamp > 30) mainLamp--; dimmer.setPower(mainLamp); myString = String(mainLamp); delay(70); client.publish("Dimmer/brightness/status", myString); } void DimmerUp() { String myString; if (mainLamp < LAMPMAXVALUE) mainLamp++; dimmer.setPower(mainLamp); myString = String(mainLamp); delay(70); client.publish("Dimmer/brightness/status", myString); } void setPowerDimmer (int power){ mainLamp = power; dimmer.setPower(mainLamp); } void loop() { buttonDown.tick(); buttonUp.tick(); // подключаемся к wi-fi if (WiFi.status() != WL_CONNECTED) { WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; } // подключаемся к MQTT серверу if (WiFi.status() == WL_CONNECTED) { if (!client.connected()) { if (client.connect(MQTT::Connect("ESP8266") .set_auth(mqtt_user, mqtt_pass))) { client.set_callback(callback); client.subscribe("Dimmer/light/switch"); client.subscribe("Dimmer/light/40/set"); client.subscribe("Dimmer/light/60/set"); client.subscribe("Dimmer/light/80/set"); client.subscribe("Dimmer/light/100/set"); client.subscribe("Dimmer/brightness/set"); client.publish("Dimmer/light/status", "OFF"); client.publish("Dimmer/light/40/status", "OFF"); client.publish("Dimmer/light/60/status", "OFF"); client.publish("Dimmer/light/80/status", "OFF"); client.publish("Dimmer/light/100/status", "OFF"); client.publish("Dimmer/brightness/status", "0"); dimmer.begin(NORMAL_MODE, OFF); } } if (client.connected()){ client.loop(); } } } // конец основного цикла void callback(const MQTT::Publish& pub) { String payload = pub.payload_string(); String myString; if(String(pub.topic()) == "Dimmer/light/switch") // проверяем из нужного ли нам топика пришли данные { if (payload == "ON"){ DimmerOn(); myString = String(mainLamp); client.publish("Dimmer/brightness/status", myString); } else { DimmerOff(); client.publish("Dimmer/brightness/status", "0"); } } if(String(pub.topic()) == "Dimmer/brightness/set") // проверяем из нужного ли нам топика пришли данные { int brightness = payload.toInt(); Serial.println(brightness); if (brightness > 30){ setPowerDimmer(brightness); } else{ setPowerDimmer(30); client.publish("Dimmer/brightness/status", "30"); } } if(String(pub.topic()) == "Dimmer/light/40/set") // проверяем из нужного ли нам топика пришли данные { if (payload == "ON"){ client.publish("Dimmer/light/40/status", payload); client.publish("Dimmer/light/60/status", "OFF"); client.publish("Dimmer/light/80/status", "OFF"); client.publish("Dimmer/light/100/status", "OFF"); mainLamp = 40; DimmerOn(); } else { DimmerOff(); } } if(String(pub.topic()) == "Dimmer/light/60/set") // проверяем из нужного ли нам топика пришли данные { if (payload == "ON"){ client.publish("Dimmer/light/60/status", payload); client.publish("Dimmer/light/40/status", "OFF"); client.publish("Dimmer/light/80/status", "OFF"); client.publish("Dimmer/light/100/status", "OFF"); mainLamp = 60; DimmerOn(); } else { DimmerOff(); } } if(String(pub.topic()) == "Dimmer/light/80/set") // проверяем из нужного ли нам топика пришли данные { if (payload == "ON"){ client.publish("Dimmer/light/80/status", payload); client.publish("Dimmer/light/40/status", "OFF"); client.publish("Dimmer/light/60/status", "OFF"); client.publish("Dimmer/light/100/status", "OFF"); mainLamp = 80; DimmerOn(); } else { DimmerOff(); } } if(String(pub.topic()) == "Dimmer/light/100/set") // проверяем из нужного ли нам топика пришли данные { if (payload == "ON"){ client.publish("Dimmer/light/100/status", payload); client.publish("Dimmer/light/40/status", "OFF"); client.publish("Dimmer/light/60/status", "OFF"); client.publish("Dimmer/light/80/status", "OFF"); mainLamp = 100; DimmerOn(); } else { DimmerOff(); } } }
Где схема подключения?!
я же говорю в разных проектах поведение одинаковое. Конкретно в этом диммер с nodemcu. В другом перепрошивал sonoff basic, поведение аналогичное. Дело явно не в схеме, а в коде. Хотя, если вы настаиваете - выложу схему.
Без схемы нет полного понимания. И схему нужно именно от того проекта, где именно приведённый выше код используется.
Хотя, если вы настаиваете - выложу схему.
схема важна не только ради схемы, но и чтоб проверить, насколько ты заинтересован в ответе. Если у тебя попросили схему, а ты отказался - значит вопрос несерьезный, после этого с тобой никто и разговаривать не будет.
А если согласился и нарисовал - значит тест прошел.
Так что если хочешь получить ответ - схему придется рисовать, даже если потом на нее никто и не взглянет:)
Проверяй, что у тебя там в mqtt идет.
Если что-то не то идет в Mqtt все равно код не должен обрабатывать эти запросы. А он, видимо, обрабатывает. Вот и не пойму где косяк. Может я client.set_callback(callback) не там вызываю?