/********* Руи Сантос (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; //bool rcv; #define B_LED (1) #define R_LED (12) #define BUTT (5) //bool led = false; OneButton button(BUTT); 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); //lStat1 = !lStat1; } void longPress() { //lStat1 = false; switchLight(R_LED, 0, true); mqttClient.publish("/home/bigroom/lamp1_set", 0, false, "false"); mqttClient.publish("/home/bigroom/lamp2_set", 0, false, "false"); mqttClient.publish("/home/midroom/lamp1_set", 0, false, "false"); mqttClient.publish("/home/midroom/lamp2_set", 0, false, "false"); mqttClient.publish("/home/smallroom/lamp1_set", 0, false, "false"); mqttClient.publish("/home/smallroom/lamp2_set", 0, false, "false"); mqttClient.publish("/home/kuh/lighttbl", 0, false, "false"); } void setup() { // Serial.begin(9600); // 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-апдейта" }); ArduinoOTA.begin(); pinMode(B_LED, FUNCTION_3); pinMode(B_LED, OUTPUT); digitalWrite(B_LED, HIGH); pinMode(R_LED, OUTPUT); pinMode(BUTT, INPUT_PULLUP); 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); button.attachLongPressStart(longPress); button.setPressTicks(2000); //attachInterrupt(digitalPinToInterrupt(BUTT), sw_func, RISING); connectToWifi(); cRun = millis(); } void loop() { ArduinoOTA.handle(); button.tick(); // if(lStat1 != oldLStat1){ // digitalWrite(R_LED, lStat1); // oldLStat1 = lStat1; // if(!rcv) // mqttClient.publish("/home/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("/home/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("/home/kor/lamp1", 1, false, state ? "true" : "false"); 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("/home/kor/lamp1", 0, false, digitalRead(R_LED) == 1 ? "true" : "false"); mqttClient.publish("/home/kor/lamp1_set", 0, false, digitalRead(R_LED) == 1 ? "true" : "false"); mqttClient.subscribe("/home/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, "/home/kor/lamp1_set") == 0){ if (strncmp("true", payload, 4) == 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); }