Sensore allagamento con ESP seconda parte
Passiamo ad analizzare il codice:
L’idea generale è che dopo essersi svegliato ESP crea una connessione con domoticz, inviando un certo numero di allarmi, per poi spegnersi quando ha finito.
Vi sono alcune ottimizzazioni che vengono discusse alla fine del codice che hanno tutte come obiettivo di accendere l’antenna Wi fi solo quando è strettamente necessario.
#include <ESP8266WiFi.h> #include <WiFiClient.h> /** * An example showing how to put ESP8266 into Deep-sleep mode * GPI00 to ground during flashing (without VCC) * GPI00 free and vcc during execution * flashing phase: * 1- OFF VCC ESP * 2- GP00 to ground * 3- plug USB adaptor * 4- FLash * execution PHASE * 1- OFF VCC ESP * 2- GP00 Free * 3- ON VCC ESP * 4- PLUG USB Adaptor */ const int numalarm=20; //DomoticZ const char* host = "Domoticz host ip"; //Domoticz, i'm calling you const int httpPort1 = 8080; //Domoticz port //Wi Fi const char* ssid = "SSID Name"; // The SSID (name) of the Wi-Fi network you want to connect to const char* password = "SSID password"; //Static IP address configuration IPAddress staticIP(192, 168, 1, 42); //ESP static ip IPAddress gateway(192, 168, 1, 1); //IP Address of your WiFi Router (Gateway) IPAddress subnet(255, 255, 255, 0); //Subnet mask void setup() { //Force Sleep WiFi.mode( WIFI_OFF ); WiFi.forceSleepBegin(); delay( 1 ); Serial.println("I'm awake."); } void loop() { //Request for Domoticz String url = "/json.htm?type=command¶m=switchlight&idx=39&switchcmd=On"; //Device number 39 on domoticz // Bring up the WiFi connection WiFi.forceSleepWake(); delay( 1 ); WiFi.mode( WIFI_STA ); WiFi.config(staticIP, gateway, subnet); WiFi.begin(ssid, password); // Connect to the network unsigned long timeout = millis(); while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect delay(1000); if (millis() - timeout > 10000) { //Serial.println(">>> No WiFi Connection !"); ESP.deepSleep(0,WAKE_RF_DISABLED); } //Serial.print(++i); Serial.print(' '); } // Use WiFiClient class to create TCP connections WiFiClient client; for(int j=0;j<numalarm;j++){ if (!client.connect(host, httpPort1)) { //Serial.println("connection failed"); sleepWell(); } // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 4000) { //Serial.println(">>> Client Timeout !"); client.stop(); sleepWell(); } } } // Read all the lines of the reply from server and print them to //Serial /*while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); }*/ sleepWell(); } void sleepWell(){ //Serial.println("Going into deep sleep"); WiFi.disconnect( true ); delay(100 ); ESP.deepSleep(0,WAKE_RF_DISABLED); //Go down the ill }
Nella fase di setup alla riga 39 e 40 si forza lo spegnimento del WiFi all’avvio dell’ESP. Questo è particolarmente utile allorquando ESP non ha bisogno di usare il wifi oppure quando ESP deve compiere delle elaborazioni prima di aver bisogno di effettuare una connessione WiFi. Per lo stesso motivo si forza lo spegnimento dell’antenna (riga 103) allo spegnimento. Tali cautele sembrano inutili se si considera il significato di deep sleep, ma alcuni modelli di ESP non spengono l’antenna, se non forzati a farlo, e la riaccendono appena riaccesi dopo il reset. Da queste considerazioni vengono fuori le righe 39, 40 e 103.
Alla riga 47 viene costruita la riga Json per contattare Domoticz. Su tale piattaforma è stato creato uno switch ON/OFF a cui corrisponde un device con identificatore (idx) a cui, nell’esempio riportato, la piattaforma ha assegnato il numero 39 che viene riportato nella stringa.
Nella righe da 52 a 54 viene accesa antenna e quindi viene effettuato il collegamento alla rete Wifi.
Alla riga 70 viene aperta una connessione verso il server Web che ospita domoticz. Nel caso in cui ci siano problemi, ESP viene mandato in Deep Sleep. Questa operazione viene effettuata sempre in caso di problemi per salvaguardare la batteria.
Nella righe da 77 a 79 la stringa viene inviata a domoticz.
Alle righe 84 e 85 la connessione viene chiusa e quindi ESP viene messo in Deep Sleep.
Il risultato finale nel suo “package” definitivo