#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"; AsyncMqttClient mqttClient; Ticker mqttReconnectTimer; WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler; Ticker wifiReconnectTimer; #define L_TOP (2) #define L_INT (3) #define L_DOWN (0) #define L_SMALL (1) #define DOOR (4) #define L_WIFI (2) //On board blue #define L_WIFI2 (14) //Green #define L_MQTT (13) //Blue #define L_MSG (12) //Red unsigned long cRun = 0; unsigned long l_run; uint8_t tP, iP, dP, sP, door, doorP; //uint16_t timeT, timeI, timeD, timeS; //uint16_t timeTt, timeIt, timeDt, timeSt; // uint16_t timeAlm, timeOpen; // bool doorSent, lockSent; uint16_t nSec = 0; leds r_led(L_MSG); uint8_t pcfreg, opcfreg; PCF8574 pcf(0x3F); bool l_m = false; 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()); digitalWrite(L_WIFI, HIGH); digitalWrite(L_WIFI2, LOW); connectToMqtt(); } void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { Serial.println("Disconnected from Wi-Fi."); digitalWrite(L_WIFI, LOW); digitalWrite(L_WIFI2, HIGH); 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/kor/doortimeout_set", 1); mqttClient.publish("/home/kor/locker_top", 1, false, tP ? "0" : "1"); mqttClient.publish("/home/kor/locker_int", 1, false, iP ? "0" : "1"); mqttClient.publish("/home/kor/locker_down", 1, false, dP ? "0" : "1"); mqttClient.publish("/home/kor/locker_small", 1, false, sP ? "0" : "1"); mqttClient.publish("/home/kor/door", 1, false, doorP ? "0" : "1"); //mqttClient.publish("/home/kor/doorlocker", 1, false, sP || dP || iP || tP ? "1" : "0"); /*char v[7]; itoa(timeAlm, v, 10); mqttClient.publish("/home/kor/doortimeout", 1, false, v);*/ //digitalWrite(L_WIFI2, LOW); digitalWrite(L_MQTT, LOW); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { //Serial.println("Disconnected from MQTT."); if (WiFi.isConnected()) { mqttReconnectTimer.once(2, connectToMqtt); } digitalWrite(L_MQTT, HIGH); //if(WiFi.isConnected()) // digitalWrite(L_WIFI2, 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/doortimeout_set") == 0){ char v[7]; timeAlm = atoi(payload); EEPROM.put(0, timeAlm); EEPROM.commit(); itoa(timeAlm, v, 10); mqttClient.publish("/home/kor/doortimeout", 0, false, v); Serial.print("New Timeout: "); Serial.println(timeAlm); }*/ } void onMqttPublish(uint16_t packetId) { Serial.println("Publish acknowledged."); Serial.print(" packetId: "); Serial.println(packetId); } void setup() { Serial.begin(9600); Serial.println("Begin"); WiFi.mode(WIFI_STA); WiFi.hostname("Door-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(); 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("Door"); Wire.begin(); // Serial.println("Begin Scan"); // for (byte i = 8; i < 120; i++) // { // Wire.beginTransmission (i); // if (Wire.endTransmission () == 0) // { // Serial.print ("Found address: "); // Serial.print (i, DEC); // Serial.print (" (0x"); // Serial.print (i, HEX); // Serial.println (")"); // delay (1); // maybe unneeded? // } // end of good response // } // end of for loop // Serial.println("End Scan"); Wire.beginTransmission(0x3F); if(Wire.endTransmission() == 0) Serial.println("PCF Found"); else Serial.println("PCF Not Found"); pcf.begin(); // pinMode(L_TOP, INPUT_PULLUP); // pinMode(L_INT, INPUT_PULLUP); // pinMode(L_DOWN, INPUT_PULLUP); // pinMode(L_SMALL, INPUT_PULLUP); // pinMode(DOOR, INPUT_PULLUP); pinMode(L_WIFI, OUTPUT); pinMode(L_WIFI2, OUTPUT); pinMode(L_MQTT, OUTPUT); pinMode(L_MSG, OUTPUT); digitalWrite(L_MQTT, HIGH); digitalWrite(L_WIFI, HIGH); uint8_t pcfreg = pcf.read8(); tP = pcfreg & 0x1; iP = (pcfreg >> L_INT) & 0x1; dP = (pcfreg >> L_DOWN) & 0x1; sP = (pcfreg >> L_SMALL) & 0x1; doorP = (pcfreg >> DOOR) & 0x1;// tP = digitalRead(L_TOP); // iP = digitalRead(L_INT); // dP = digitalRead(L_DOWN); // sP = digitalRead(L_SMALL); // EEPROM.begin(16); // EEPROM.get(0, timeAlm); // timeOpen = 0; // doorSent = lockSent = false; Serial.println("Connect to WiFi"); connectToWifi(); Serial.println("Loop"); } void loop() { // uint8_t tC = digitalRead(L_TOP); // uint8_t iC = digitalRead(L_INT); // uint8_t dC = digitalRead(L_DOWN); // uint8_t sC = digitalRead(L_SMALL); uint8_t tC, iC, dC, sC; char v[10]; //door = digitalRead(DOOR); if(l_m && (l_run + 100) < millis()){ analogWrite(L_MSG, 0); l_m = false; } //r_led.tick(); ArduinoOTA.handle(); if(cRun + 99 < millis()){ cRun = millis(); pcfreg = pcf.read8(); tC = (pcfreg >> L_TOP) & 0x1; iC = (pcfreg >> L_INT) & 0x1; dC = (pcfreg >> L_DOWN) & 0x1; sC = (pcfreg >> L_SMALL) & 0x1; door = (pcfreg >> DOOR) & 0x1; if(opcfreg != pcfreg){ itoa(pcfreg, v, 2); mqttClient.publish("/home/kor/pcf", 1, false, v); opcfreg = pcfreg; } if(tC != tP){ Serial.println("Top Changed"); if(mqttClient.connected()){ mqttClient.publish("/home/kor/locker_top", 1, false, tC ? "0" : "1"); } tP = tC; } if(iC != iP){ if(mqttClient.connected()){ mqttClient.publish("/home/kor/locker_int", 1, false, iC ? "0" : "1"); } iP = iC; } if(dC != dP){ if(mqttClient.connected()){ mqttClient.publish("/home/kor/locker_down", 1, false, dC ? "0" : "1"); } dP = dC; } if(sC != sP){ if(mqttClient.connected()){ mqttClient.publish("/home/kor/locker_small", 1, false, sC ? "0" : "1"); } sP = sC; } if(door != doorP){ if(mqttClient.connected()){ mqttClient.publish("/home/kor/door", 1, false, door ? "0" : "1"); } doorP = door; } nSec++; // if(nSec % 10 == 0){ // char v[11]; // itoa(pcfreg, v, 2); // if(mqttClient.connected()) // mqttClient.publish("/home/test/pcfreg", 0, false, v); // } if(nSec > 99){ if(mqttClient.connected()){ char v[11]; ultoa(millis(), v, 10); analogWrite(L_MSG, 1); l_run = millis(); l_m = true; //r_led.start(); mqttClient.publish("/home/kor/doormillis", 1, false, v); Serial.print("Millis: "); Serial.println(millis()); } nSec = 0; } /* if((((tC == 0) && (iC == 0) && (dC == 0) && (sC == 0)) || (door == 0)) && ((timeOpen / 10) < timeAlm)){ timeOpen++; if((timeOpen / 10) >= timeAlm){ if(mqttClient.connected()){ if (door == 0){ //Door to long time open r_led.start(); mqttClient.publish("/home/kor/doorlong", 1, false, "1"); doorSent = true; } else{ //Not closed locker r_led.start(); mqttClient.publish("/home/kor/doorlocker", 1, false, "0"); lockSent = true; } } } } else{ timeOpen = 0; if(doorSent == true){ doorSent = false; if(mqttClient.connected()) r_led.start(); mqttClient.publish("/home/kor/doorlong", 1, false, "0"); } if(lockSent == true){ lockSent = false; if(mqttClient.connected()) r_led.start(); mqttClient.publish("/home/kor/doorlocker", 1, false, "1"); } }*/ } }