/********* Руи Сантос (Rui Santos) Более подробно о проекте на: http://randomnerdtutorials.com Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino (Файл > Примеры > Arduino OTA > BasicOTA.ino) *********/ #include #include #include #include #include #include //#include const char* ssid = "wf-home"; const char* password = "0ndthnrf"; const char* mqtt_server = "192.168.1.111"; #define TOPIC "home/" AsyncMqttClient mqttClient; Ticker mqttReconnectTimer; WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler; Ticker wifiReconnectTimer; //bool lStat1, oldLStat1; //bool lStat2, oldLStat2; unsigned long cRun; //bool rcv; #define B_LED (1) #define R_LED (12) #define BUTT (5) //bool led = false; //OneButton button(BUTT); Bounce lSwitch = Bounce(); bool switchLight(uint8_t nLamp, int state, bool pub); 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 ICACHE_RAM_ATTR sw_func() // { // lStat1 = !lStat1; // } void oneClick() { switchLight(R_LED, !digitalRead(R_LED), true); //Serial.println("Press"); //lStat1 = !lStat1; } // void longPress() // { // //lStat1 = false; // switchLight(R_LED, 0, true); // mqttClient.publish(TOPIC"bigroom/lamp1_set", 0, false, "false"); // mqttClient.publish(TOPIC"bigroom/lamp2_set", 0, false, "false"); // mqttClient.publish(TOPIC"midroom/lamp1_set", 0, false, "false"); // mqttClient.publish(TOPIC"midroom/lamp2_set", 0, false, "false"); // mqttClient.publish(TOPIC"smallroom/lamp1_set", 0, false, "false"); // mqttClient.publish(TOPIC"smallroom/lamp2_set", 0, false, "false"); // mqttClient.publish(TOPIC"kuh/lighttbl", 0, false, "false"); // } void setup() { //Serial.begin(115200); //Serial.println("Booting"); // "Загрузка" WiFi.mode(WIFI_STA); WiFi.hostname("SW-Koridor"); 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-апдейта" }); // Serial.println("OTA Begin"); ArduinoOTA.begin(); // Serial.println("OTA Done"); //Serial.end(); pinMode(B_LED, FUNCTION_3); pinMode(B_LED, OUTPUT); digitalWrite(B_LED, HIGH); pinMode(R_LED, OUTPUT); pinMode(BUTT, INPUT_PULLUP); // Serial.println("EEPROM Begin"); EEPROM.begin(16); uint8_t lstat = 0; EEPROM.get(0, lstat); //oldLStat1 = lStat1; // Serial.print("Lamp1: "); //Serial.println(lStat1); digitalWrite(R_LED, lstat); //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); mqttClient.setClientId("SW_Koridor"); //button.attachClick(oneClick); lSwitch.attach(BUTT); lSwitch.interval(5); // button.attachLongPressStart(longPress); //button.setPressTicks(2000); //attachInterrupt(digitalPinToInterrupt(BUTT), sw_func, RISING); // Serial.println("WiFi Connect"); connectToWifi(); cRun = millis(); } void loop() { ArduinoOTA.handle(); //button.tick(); lSwitch.update(); if(lSwitch.fell()) switchLight(R_LED, !digitalRead(R_LED), true); // if(lStat1 != oldLStat1){ // digitalWrite(R_LED, lStat1); // oldLStat1 = lStat1; // if(!rcv) // mqttClient.publish(TOPIC"kor/lamp1", 0, false, lStat1 ? "1" : "0"); // else // rcv = false; // EEPROM.put(0, lStat1); // EEPROM.commit(); // } if (cRun + 9999 < millis()){ cRun = millis(); char v[11]; ultoa(cRun, v, 10); mqttClient.publish(TOPIC"kor/millislamp", 0, false, v); } } bool switchLight(uint8_t nLamp, int state, bool pub) { digitalWrite(nLamp, state); EEPROM.put(0, state); EEPROM.commit(); //if (pub) mqttClient.publish(TOPIC"kor/lamp1", 1, false, state ? "1" : "0"); return state; } 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) { mqttClient.publish(TOPIC"kor/lamp1", 0, false, digitalRead(R_LED) == 1 ? "1" : "0"); mqttClient.publish(TOPIC"kor/lamp1_set", 0, false, digitalRead(R_LED) == 1 ? "1" : "0"); mqttClient.subscribe(TOPIC"kor/lamp1_set", 1); 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, TOPIC"kor/lamp1_set") == 0){ if (strncmp("1", payload, 1) == 0) switchLight(R_LED, 1, false);//lStat1 = true; else switchLight(R_LED, 0, false);//lStat1 = false; //rcv = true; } } void onMqttPublish(uint16_t packetId) { // Serial.println("Publish acknowledged."); // Serial.print(" packetId: "); // Serial.println(packetId); }