/********* Руи Сантос (Rui Santos) Более подробно о проекте на: http://randomnerdtutorials.com Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino (Файл > Примеры > Arduino OTA > BasicOTA.ino) *********/ #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 (1) #define R_LED1 (14) #define R_LED2 (13) #define BUTT1 (4) #define BUTT2 (3) bool led = false; Bounce l1 = Bounce(); Bounce l2 = Bounce(); 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(); } 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); } void onMqttConnect(bool sessionPresent) { // Serial.println("Connected to MQTT."); // Serial.print("Session present: "); // Serial.println(sessionPresent); //uint16_t packetIdSub = mqttClient.subscribe("/home/smallroom/lamp1_set", 1); mqttClient.subscribe("/home/smallroom/lamp2_set", 1); // Serial.print("Subscribing Lamp1, packetId: "); // Serial.println(packetIdSub); //packetIdSub = mqttClient.subscribe("/home/kor/lamp2_set", 1); //Serial.print("Subscribing Lamp2, packetId: "); //Serial.println(packetIdSub); mqttClient.publish("/home/smallroom/lamp1", 1, false, lStat1 ? "1" : "0"); mqttClient.publish("/home/smallroom/lamp2", 1, false, lStat2 ? "1" : "0"); //Serial.println("Publishing at Lamp 1"); //mqttClient.publish("/home/kor/lamp2", 1, false, lStat2 ? "1" : "0"); //Serial.println("Publishing at Lamp 2"); digitalWrite(B_LED, LOW); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { //Serial.println("Disconnected from MQTT."); if (WiFi.isConnected()) { mqttReconnectTimer.once(2, connectToMqtt); } digitalWrite(B_LED, HIGH); } void onMqttSubscribe(uint16_t packetId, uint8_t qos) { // Serial.println("Subscribe acknowledged."); // Serial.print(" packetId: "); // Serial.println(packetId); // Serial.print(" qos: "); // Serial.println(qos); } void onMqttUnsubscribe(uint16_t packetId) { // Serial.println("Unsubscribe acknowledged."); // Serial.print(" packetId: "); // Serial.println(packetId); } void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { if(strcmp(topic, "/home/smallroom/lamp1_set") == 0){ if ((char)payload[0] == '1') lStat1 = true; else lStat1 = false; } if(strcmp(topic, "/home/smallroom/lamp2_set") == 0){ if ((char)payload[0] == '1') lStat2 = true; else lStat2 = false; } } void onMqttPublish(uint16_t packetId) { // Serial.println("Publish acknowledged."); // Serial.print(" packetId: "); // Serial.println(packetId); } void setup() { //Serial.begin(9600); //Serial.println("Booting"); // "Загрузка" WiFi.mode(WIFI_STA); WiFi.hostname("SW-SmallRoom1"); 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(); 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/smallroom/lamp1", 1, false, lStat1 ? "1" : "0"); // Serial.println("Publishing at Lamp 1"); EEPROM.put(0, lStat1); EEPROM.commit(); // Serial.print("Lamp 1: "); // Serial.println(lStat1); } if(lStat2 != oldLStat2){ digitalWrite(R_LED2, lStat2); oldLStat2 = lStat2; mqttClient.publish("/home/smallroom/lamp2", 1, false, lStat2 ? "1" : "0"); // Serial.println("Publishing at Lamp 1"); EEPROM.put(1, lStat2); EEPROM.commit(); // Serial.print("Lamp 1: "); // Serial.println(lStat1); } }