/********* Руи Сантос (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; // bool rcv; //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(); 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 setup() { //Serial.begin(9600); //Serial.println("Booting"); // "Загрузка" WiFi.mode(WIFI_STA); WiFi.hostname("SW-SmallRoom"); 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); uint8_t stat = 0; EEPROM.get(0, stat); digitalWrite(R_LED1, stat); EEPROM.get(1, stat); digitalWrite(R_LED2, stat); wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); mqttClient.onMessage(onMqttMessage); mqttClient.setServer(mqtt_server, 1883); mqttClient.setClientId("SmallRoomSW"); connectToWifi(); // cRun = millis(); } void loop() { ArduinoOTA.handle(); l1.update(); l2.update(); if(l1.fell()){ switchLight(R_LED1, !digitalRead(R_LED1), true); } if(l2.fell()){ switchLight(R_LED2, !digitalRead(R_LED2), true); } } bool switchLight(uint8_t nLamp, int state, bool pub) { digitalWrite(nLamp, state); EEPROM.put(nLamp == R_LED1 ? 0 : 1, state); EEPROM.commit(); String topic = "/home/smallroom/lamp"; char n = nLamp == R_LED1 ? '1' : '2'; if (pub) mqttClient.publish(String(topic + n).c_str(), 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.subscribe("/home/smallroom/lamp1", 1); mqttClient.subscribe("/home/smallroom/lamp2", 1); mqttClient.publish("/home/smallroom/lamp1", 1, false, digitalRead(R_LED1) == 1 ? "1" : "0"); mqttClient.publish("/home/smallroom/lamp2", 1, false, digitalRead(R_LED2) == 1 ? "1" : "0"); digitalWrite(B_LED, LOW); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { if (WiFi.isConnected()) { mqttReconnectTimer.once(2, connectToMqtt); } digitalWrite(B_LED, HIGH); } void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { if(strcmp(topic, "/home/smallroom/lamp1") == 0){ if (atoi(payload) == 1) switchLight(R_LED1, 1, false);//lStat1 = true; else switchLight(R_LED1, 0, false);//lStat1 = false; } if(strcmp(topic, "/home/smallroom/lamp2") == 0){ if (atoi(payload) == 1) switchLight(R_LED2, 1, false);//lStat2 = true; else switchLight(R_LED2, 0, false);//lStat2 = false; } }