#include #include #include #include #include #include #define BUTT1 (0) #define BUTT2 (2) #define SOCK1 (4) #define SOCK2 (5) #define LED_WF (14) //Green #define LED_MQ (12) //Blue #define LED_WRK (13) //Red const char* ssid = "wf-home"; const char* password = "0ndthnrf"; const char* mqtt_server = "192.168.1.111"; #define TOPIC "home/" Bounce but1 = Bounce(); Bounce but2 = Bounce(); unsigned long cRun = millis(); int nSec; uint8_t stat1, stat2, oldstat1, oldstat2; unsigned long lwms; AsyncMqttClient mqttClient; Ticker mqttReconnectTimer; WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler; Ticker wifiReconnectTimer; void connectToWifi(); void connectToMqtt(); void onWifiConnect(const WiFiEventStationModeGotIP& event); void onWifiDisconnect(const WiFiEventStationModeDisconnected& event); void onMqttConnect(bool sessionPresent); void onMqttDisconnect(AsyncMqttClientDisconnectReason reason); void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total); void pubBool(const char* topic, uint8_t pl); void onMqttPublish(uint16_t packetId); void setup(){ Serial.begin(9600); WiFi.mode(WIFI_STA); WiFi.hostname("Rozetka1"); Serial.begin(9600); ArduinoOTA.onStart([]() { Serial1.println("Start Update"); // "Начало OTA-апдейта" }); ArduinoOTA.onEnd([]() { Serial1.println("\nEnd Update"); // "Завершение OTA-апдейта" }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { //Serial1.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial1.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial1.println("Auth Failed"); // "Ошибка при аутентификации" else if (error == OTA_BEGIN_ERROR) Serial1.println("Begin Failed"); // "Ошибка при начале OTA-апдейта" else if (error == OTA_CONNECT_ERROR) Serial1.println("Connect Failed"); // "Ошибка при подключении" else if (error == OTA_RECEIVE_ERROR) Serial1.println("Receive Failed"); // "Ошибка при получении данных" else if (error == OTA_END_ERROR) Serial1.println("End Failed"); // "Ошибка при завершении OTA-апдейта" }); ArduinoOTA.begin(); wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.onMessage(onMqttMessage); mqttClient.onPublish(onMqttPublish); mqttClient.setServer(mqtt_server, 1883); mqttClient.setClientId("Rozetka1"); pinMode(LED_WF, OUTPUT); pinMode(LED_MQ, OUTPUT); pinMode(LED_WRK, OUTPUT); pinMode(BUTT1, INPUT_PULLUP); pinMode(BUTT2, INPUT_PULLUP); but1.attach(BUTT1); but2.attach(BUTT2); but1.interval(50); but2.interval(50); pinMode(SOCK1, OUTPUT); pinMode(SOCK2, OUTPUT); //digitalWrite(LED_WF, HIGH); //digitalWrite(LED_MQ, HIGH); digitalWrite(LED_WRK, HIGH); EEPROM.begin(8); stat1 = EEPROM.read(0); stat2 = EEPROM.read(1); oldstat1 = stat1; digitalWrite(SOCK1, stat1); //EEPROM.get(4, stat1); oldstat2 = stat2; digitalWrite(SOCK2, stat2); connectToWifi(); lwms = millis(); } void loop(){ ArduinoOTA.handle(); yield(); but1.update(); but2.update(); if(but1.fell()){ stat1 == 0 ? stat1=1 : stat1=0; } if(but2.fell()){ stat2 == 0 ? stat2=1 : stat2=0; } if(stat1 != oldstat1){ oldstat1 = stat1; digitalWrite(SOCK1, stat1); EEPROM.write(0, stat1); EEPROM.commit(); pubBool(TOPIC"roz1/on1", stat1); } if(stat2 != oldstat2){ oldstat2 = stat2; digitalWrite(SOCK2, stat2); EEPROM.write(1, stat2); EEPROM.commit(); pubBool(TOPIC"roz1/on2", stat2); } if(cRun + 999 < millis()){ cRun = millis(); if(mqttClient.connected()){ if(++nSec > 59){ nSec = 0; char v[15]; ultoa(millis()/1000, v, 10); mqttClient.publish(TOPIC"roz1/millis", 1, false, v); } } } if(lwms + 300 < millis()) digitalWrite(LED_WRK, HIGH); } void connectToWifi() { Serial.println("Connecting to Wi-Fi..."); WiFi.begin(ssid, password); } void connectToMqtt() { Serial.println("Connecting to MQTT..."); mqttClient.connect(); } void onWifiConnect(const WiFiEventStationModeGotIP& event) { Serial.println("Connected to Wi-Fi."); Serial.print("IP: "); Serial.println(WiFi.localIP()); connectToMqtt(); digitalWrite(LED_WF, HIGH); } void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { Serial.println("Disconnected from Wi-Fi."); mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi wifiReconnectTimer.once(2, connectToWifi); digitalWrite(LED_WF, LOW); } void onMqttConnect(bool sessionPresent) { Serial.println("Connected to MQTT."); Serial.print("Session present: "); Serial.println(sessionPresent); mqttClient.publish(TOPIC"roz1/on1", 1, false, stat1 == 0 ? "0" : "1"); mqttClient.publish(TOPIC"roz1/on1_set", 1, false, stat1 == 0 ? "0" : "1"); mqttClient.publish(TOPIC"roz1/on2", 1, false, stat2 == 0 ? "0" : "1"); mqttClient.publish(TOPIC"roz1/on2_set", 1, false, stat2 == 0 ? "0" : "1"); mqttClient.subscribe(TOPIC"roz1/on1_set", 1); mqttClient.subscribe(TOPIC"roz1/on2_set", 1); nSec = 59; digitalWrite(LED_MQ, HIGH); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { //Serial.println("Disconnected from MQTT."); if (WiFi.isConnected()) { mqttReconnectTimer.once(2, connectToMqtt); } digitalWrite(LED_MQ, LOW); } void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total){ char pl[20]; strncpy(pl, payload, len); pl[len] = 0; Serial.println(topic); Serial.println(pl); if(strcmp(topic, TOPIC"roz1/on1_set") == 0){ if(strcmp(pl, "1") == 0){ stat1 = 1; } else{ stat1 = 0; } return; } if(strcmp(topic, TOPIC"roz1/on2_set") == 0){ if(strcmp(pl, "1") == 0){ stat2 = 1; } else{ stat2 = 0; } } } void onMqttPublish(uint16_t packetId) { digitalWrite(LED_WRK, LOW); lwms = millis(); } void pubBool(const char* topic, uint8_t pl){ if(mqttClient.connected()){ mqttClient.publish(topic, 1, false, pl == 1 ? "true" : "false"); } }