// #include // #include // #include // #include // #include // #include // #include // #include // // замените значения в этих константах на те, // // что соответствуют вашей сети: // const char* ssid = "wf-home"; // const char* password = "0ndthnrf"; // const char* mqtt_server = "192.168.1.250"; // //unsigned long int cRun; // bool lStat1; // bool lStat2; // #define B_LED 16 // //bool led = false; // Bounce l1 = Bounce(); // Bounce l2 = Bounce(); // WiFiClient espClient; // PubSubClient client(espClient); // void callback(char* topic, byte* payload, unsigned int length) { // Serial.print("Message arrived ["); // Serial.print(topic); // Serial.print("] "); // for (unsigned int i = 0; i < length; i++) { // Serial.print((char)payload[i]); // } // Serial.println(); // if(strcmp(topic, "/home/bigroom/lamp1_set") == 0){ // if ((char)payload[0] == '1') lStat1 = true; // else lStat1 = false; // EEPROM.put(0, lStat1); // EEPROM.commit(); // Serial.print("Lamp 1: "); // Serial.println(lStat1); // if (client.connected()) // client.publish("/home/bigroom/lamp1", lStat1 ? "1" : "0"); // //setLamp(0); // } // if(strcmp(topic, "/home/bigroom/lamp2_set") == 0){ // if ((char)payload[0] == '1') lStat2 = true; // else lStat2 = false; // //setLamp(1); // EEPROM.put(1, lStat2); // EEPROM.commit(); // Serial.print("Lamp 2: "); // Serial.println(lStat2); // if (client.connected()) // client.publish("/home/bigroom/lamp2", lStat2 ? "1" : "0"); // } // // Switch on the LED if an 1 was received as first character // //if ((char)payload[0] == '1') { // //digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level // // but actually the LED is on; this is because // // it is active low on the ESP-01) // //} else { // //digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH // //} // } // void reconnect() { // // Loop until we're reconnected // int cntConn = 0; // int cntConnW = 0; // while (!client.connected() && cntConn < 5) { // if(!WiFi.isConnected()){ // WiFi.disconnect(); // WiFi.begin(ssid, password); // while ((WiFi.waitForConnectResult() != WL_CONNECTED) && cntConn < 5) { // Serial.println("Connection Failed! Rebooting..."); // // "Соединиться не удалось! Перезагрузка..." // delay(1000); // cntConn++; // } // } // Serial.print("Attempting MQTT connection..."); // // Create a random client ID // String clientId = "SwitchBigRoom"; // //clientId += String(random(0xffff), HEX); // // Attempt to connect // if (client.connect(clientId.c_str())) { // Serial.println("connected"); // // Once connected, publish an announcement... // //client.publish("outTopic", "hello world"); // // ... and resubscribe // client.subscribe("/home/bigroom/lamp1_set"); // client.subscribe("/home/bigroom/lamp2_set"); // digitalWrite(B_LED, LOW); // } else { // Serial.print("failed, rc="); // Serial.print(client.state()); // Serial.println(" try again in 5 seconds"); // digitalWrite(B_LED, HIGH); // // Wait 5 seconds before retrying // //delay(5000); // } // cntConn++; // } // } // void setup() { // Serial.begin(9600); // Serial.println("Booting"); // "Загрузка" // WiFi.mode(WIFI_STA); // WiFi.hostname("SW-BigRoom"); // WiFi.begin(ssid, password); // int cntConn = 0; // while ((WiFi.waitForConnectResult() != WL_CONNECTED) && cntConn < 5) { // Serial.println("Connection Failed! Rebooting..."); // // "Соединиться не удалось! Перезагрузка..." // delay(1000); // cntConn++; // ESP.restart(); // } // // строчка для номера порта по умолчанию // // можно вписать «8266»: // // ArduinoOTA.setPort(8266); // // строчка для названия хоста по умолчанию; // // можно вписать «esp8266-[ID чипа]»: // // ArduinoOTA.setHostname("myesp8266"); // // строчка для аутентификации // // (по умолчанию никакой аутентификации не будет): // // ArduinoOTA.setPassword((const char *)"123"); // ArduinoOTA.onStart([]() { // Serial.println("Start"); // "Начало OTA-апдейта" // }); // ArduinoOTA.onEnd([]() { // Serial.println("\nEnd"); // "Завершение OTA-апдейта" // }); // ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { // Serial.printf("Progress: %u%%\r", (progress / (total / 100))); // }); // ArduinoOTA.onError([](ota_error_t error) { // Serial.printf("Error[%u]: ", error); // if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); // // "Ошибка при аутентификации" // else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); // // "Ошибка при начале OTA-апдейта" // else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); // // "Ошибка при подключении" // else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); // // "Ошибка при получении данных" // else if (error == OTA_END_ERROR) Serial.println("End Failed"); // // "Ошибка при завершении OTA-апдейта" // }); // ArduinoOTA.begin(); // Serial.println("Ready"); // "Готово" // Serial.print("IP address: "); // "IP-адрес: " // Serial.println(WiFi.localIP()); // //pinMode(0, INPUT_PULLUP); // //l1.attach(0); // pinMode(B_LED, OUTPUT); // pinMode(4, OUTPUT); // pinMode(13, OUTPUT); // pinMode(14, INPUT); // l1.attach(14); // pinMode(12, INPUT); // l2.attach(12); // lStat1 = false; // lStat2 = false; // client.setServer(mqtt_server, 1883); // client.setCallback(callback); // EEPROM.begin(16); // EEPROM.get(0, lStat1); // EEPROM.get(1, lStat2); // //cRun = millis(); // } // void loop() { // ArduinoOTA.handle(); // digitalWrite(4, lStat1); // digitalWrite(13, lStat2); // if (!client.connected()) { // reconnect(); // } // client.loop(); // l1.update(); // l2.update(); // if(l1.fell()){ // lStat1 = !lStat1; // //digitalWrite(4, lStat1); // EEPROM.put(0, lStat1); // EEPROM.commit(); // Serial.print("Lamp 1: "); // Serial.println(lStat1); // if (client.connected()) // client.publish("/home/bigroom/lamp1", String(lStat1).c_str()); // } // if(l2.fell()){ // lStat2 = !lStat2; // //digitalWrite(13, lStat2); // EEPROM.put(1, lStat2); // EEPROM.commit(); // Serial.print("Lamp 2: "); // Serial.println(lStat2); // if (client.connected()) // client.publish("/home/bigroom/lamp2", String(lStat2).c_str()); // } // // if(cRun + 500 < millis()){ // // digitalWrite(B_LED, led); // // led = !led; // // cRun = millis(); // // } // } #include #include #include #include #include #include const char* ssid = "wf-home"; const char* password = "0ndthnrf"; const char* mqtt_server = "192.168.1.250"; AsyncMqttClient mqttClient; Ticker mqttReconnectTimer; WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler; Ticker wifiReconnectTimer; bool lStat1, oldLStat1; bool lStat2, oldLStat2; unsigned long cRun; #define B_LED (16) #define R_LED1 (4) #define R_LED2 (13) #define BUTT1 (14) #define BUTT2 (12) bool led = false; Bounce l1 = Bounce(); Bounce l2 = Bounce(); void connectToWifi() { WiFi.begin(ssid, password); } void connectToMqtt() { mqttClient.connect(); } void onWifiConnect(const WiFiEventStationModeGotIP& event) { connectToMqtt(); } void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi wifiReconnectTimer.once(2, connectToWifi); } void onMqttConnect(bool sessionPresent) { mqttClient.subscribe("/home/bigroom/lamp1_set", 0); mqttClient.subscribe("/home/bigroom/lamp2_set", 0); mqttClient.publish("/home/bigroom/lamp1", 0, false, lStat1 ? "1" : "0"); mqttClient.publish("/home/bigroom/lamp2", 0, false, lStat2 ? "1" : "0"); digitalWrite(B_LED, LOW); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { if (WiFi.isConnected()) { mqttReconnectTimer.once(2, connectToMqtt); } digitalWrite(B_LED, HIGH); } void onMqttSubscribe(uint16_t packetId, uint8_t qos) { } void onMqttUnsubscribe(uint16_t packetId) { } void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { if(strcmp(topic, "/home/bigroom/lamp1_set") == 0){ if (atoi(payload) == 1) lStat1 = true; else lStat1 = false; } if(strcmp(topic, "/home/bigroom/lamp2_set") == 0){ if (atoi(payload) == 1) lStat2 = true; else lStat2 = false; } } void onMqttPublish(uint16_t packetId) { } void setup() { WiFi.mode(WIFI_STA); WiFi.hostname("SW-BigRoom"); ArduinoOTA.onStart([]() { }); ArduinoOTA.onEnd([]() { }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { // Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { // Serial.printf("Error[%u]: ", error); // if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); // // "Ошибка при аутентификации" // else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); // // "Ошибка при начале OTA-апдейта" // else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); // // "Ошибка при подключении" // else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); // // "Ошибка при получении данных" // else if (error == OTA_END_ERROR) Serial.println("End Failed"); // // "Ошибка при завершении OTA-апдейта" }); ArduinoOTA.begin(); //pinMode(B_LED, FUNCTION_3); pinMode(B_LED, OUTPUT); digitalWrite(B_LED, HIGH); pinMode(R_LED1, OUTPUT); pinMode(BUTT1, INPUT_PULLUP); pinMode(R_LED2, OUTPUT); pinMode(BUTT2, FUNCTION_3); pinMode(BUTT2, INPUT_PULLUP); l1.attach(BUTT1); l2.attach(BUTT2); EEPROM.begin(16); EEPROM.get(0, lStat1); EEPROM.get(1, lStat2); oldLStat1 = lStat1; oldLStat2 = lStat2; // Serial.print("Lamp1: "); // Serial.println(lStat1); digitalWrite(R_LED1, lStat1); digitalWrite(R_LED2, lStat2); //oldLStat2 = lStat2; wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.onSubscribe(onMqttSubscribe); mqttClient.onUnsubscribe(onMqttUnsubscribe); mqttClient.onMessage(onMqttMessage); mqttClient.onPublish(onMqttPublish); mqttClient.setServer(mqtt_server, 1883); connectToWifi(); cRun = millis(); } void loop() { ArduinoOTA.handle(); l1.update(); l2.update(); if(l1.fell()){ lStat1 = !lStat1; } if(l2.fell()){ lStat2 = !lStat2; } if(lStat1 != oldLStat1){ digitalWrite(R_LED1, lStat1); oldLStat1 = lStat1; mqttClient.publish("/home/bigroom/lamp1", 0, false, lStat1 ? "1" : "0"); EEPROM.put(0, lStat1); EEPROM.commit(); } if(lStat2 != oldLStat2){ digitalWrite(R_LED2, lStat2); oldLStat2 = lStat2; mqttClient.publish("/home/bigroom/lamp2", 0, false, lStat2 ? "1" : "0"); EEPROM.put(1, lStat2); EEPROM.commit(); } }