Stazione Meteo 3.0 su ESP8266-12e

meteo3

Era prevedibile che portassi il nodo relativo alla Stazione Meteo da Arduino a ESP8266. La possibilità che offre questo modulo di entrare direttamente nella LAN casalinga fa sì che possa andare a scrivere direttamente i dati in un server MySql senza ricorrere ad intermediari. L’unico particolare è che non avendo ancora disponibile (per ora e per quanto ne sappia) una libreria che dallo sketch sia in grado di effettuare direttamente le INSERT nel database (cosa che per gli Arduino esiste da tempo) necessita di spedire i dati con il protocollo  HTTP ad un web server attrezzato con un interprete PHP, che potrebbe risiedere ad esempio nello stesso Raspberry dove gira MySql. Niente di complicato insomma, specialmente per chi già ha almeno conoscenze di base di questi ambienti.

Devo dire che il mercato di queste piccole schede è molto agguerrito e in continua evoluzione: già sono in commercio cloni di Arduino Uno dotati di moduli wi-fi ESP, che mantenendo lo schema di connessioni tipico di Arduino (comprese le molte porte analogiche che mancano agli ESP) abbassano notevolmente il costo della connessione wi-fi da svariate decine di euro a 5-6 euro. Un chiaro messaggio a chi riteneva che si dovessero spendere 70 euro per mettere un singolo Arduino in rete via wi-fi, francamente un’esagerazione.

Risolti i problemi di stabilità di cui ho parlato in precedenza (ora i moduli sono stabilissimi) rimaneva il problema del consumo di corrente, che è notevolmente maggiore di un Arduino Nano e che mi creava molti problemi ad alimentare la stazione con un battery pack a celle solari di quelli che si usano per ricaricare i cellulari. Il modulo può essere facilmente messo in “sleep-mode” e riportato in vita solamente per effettuare le letture diciamo ogni 5 minuti, il che abbassa drasticamente il consumo di corrente che altrimenti si manterrebbe su diverse decine di mA. Colpa ovviamente del modulo wi-fi che per collegarsi alla LAN e per rimanerci collegato, specialmente in caso di segnale basso, consuma molta energia.

Un’altra cosa interessante da sottolineare è il buon comportamento di questo modulo nei confronti del segnale wi-fi. Per la cronaca quelli che sto utilizzando ora sono i 12e venduti da BangGood a circa 6 euro, interfacciati verso la porta USB da un chip CH340 (altri produttori usano l’FTDI). Nonostante l’antenna “stampata” sulla scheda stessa non possa dare le stesse prestazioni di una esterna in termini di sensibilità devo dire che anche con un segnale di -94 o -96 dB raramente il modulo perde la connessione, e se accade si riaggancia al primo colpo al mio router. Tutto questo è documentato dal mio logger dove registro in tempo reale anche questo tipo di attività.

Lo sketch che pubblico di seguito invia i suoi dati via HTTP ad uno script PHP situato nella DocumentRoot di un server Apache che una volta letti i dati si occuperà di inviarli ad un server MySql installato, nel mio caso, sulla stessa macchina, un Raspberry Pi2.

Ecco lo script:

Esiste quindi un database con dbname = domotica e una tabella dove vengono depositati, ogni 5 minuti, i dati inviati dalla Stazione.

La tabella MySql avrà questa struttura:

Ho preferito mantenere il timestamp di ricezione dei dati in UTC, ovvero un orario di riferimento con fuso orario 0 con ottima approssimazione assimilabile al Tempo Medio di Greenwich perché non genererà date ambigue nel momento in cui si passa dall’ora solare a quella estiva, MySql permette poi in fase di interrogazione di riferirsi al fuso locale italiano (definito CET, e poi CEST quando in vigore l’ora estiva) con una query del tipo:

Qui devo fare una annotazione di tipo sistemistico: la funzione CONVERT_TZ() richiede che siano popolate alcune tabelle di sistema che generalmente sia in MySql che in MariaDB NON sono inizializzate. Per evitare che la lettura delle date ritorni dei valori NULL bisogna, da shell Linux, lanciare una utility che prelevi le informazioni relative alle timezone (tipicamente in /usr/share/zoneinfo) e le depositi nelle tabelle in questione. Il comando è:

Di seguito verrà chiesta la password dell’utente root del database. A esecuzione avvenuta si potrà andare nello schema denominato “mysql” e controllare che le tabelle [timezone_*], credo siano 4 se non ricordo male, siano popolate.

In poche parole la tabella nella sua forma originale si presenta in questo modo:

Schermata 2016-01-22 alle 21.56.33

E letta dalla query che ho indicato con le conversioni delle date in quest’altro modo:

Schermata 2016-01-22 alle 21.56.48

Ma passiamo ai collegamenti fisici: ho sostituito il “vecchio” lettore di luce KY018 con un più preciso e flessibile TSL2561 di Adafruit, digitale, che mi ha permesso di non scontrarmi con la poca flessibilità delle schede ESP con i sensori analogici.

“Solita” resistenza di pull-up sul sensore DHT22 (4.7Kohm o 10Kohm) e, cosa fondamentale un “ponte” possibilmente interrompibile tra il pin GPIO16 (D0) e il pin RST per far sì che funzioni il codice di Deep-Sleep del modulo. Questo circuito va chiuso durante l’esecuzione dello sketch e va aperto quando c’è da fare l’upload di uno sketch modificato. Mi raccomando, poiché con i due PIN cortocircuitati l’upload del codice dà errore e non funziona. Il Deep-Sleep fa risparmiare molta corrente, l’ESP quando è “dormiente” consuma pochi micro ampère  e quando viene risvegliato riesegue da capo lo sketch comprensivo della funzione setup(). Il che significa ovviamente che si riconnetterà di nuovo al wi-fi dopo esserne uscito per “addormentarsi”.

La mia Stazione è ormai da circa 24 ore in questa condizione di funzionamento e non ho rilevato comportamenti anomali o scorretti da parte del modulo.

Per quanto riguarda le librerie esterne, sono le stesse che ho già indicato in post precedenti relative agli stessi sensori. Adafruit per quanto riguarda i sensori DHT22 e TSL2561 e la SFE_BMP180 per il sensore barometrico.

Ecco quindi lo sketch che pilota il tutto:

Sostituire i valori della propria LAN nelle rispettive righe:

const char* ssid = “**********************”;
const char* password = “******************”;

nonché l’indirizzo IP del server HTTP:

String url = “http://192.168.3.100/insert_meteo.php?”;

e il nome del file php che si occupa della ricezione, che io ho chiamato “inserti_meteo.php”

La gestione del modo Deep-Sleep avviene in pratica sostituendo la classica delay() con questo codice:

uint32_t sleepTimeSec = 300;  // 300 secondi, ovvero 5 minuti
uint32_t sleep = (sleepTimeSec * 1000000);

ESP.deepSleep(sleep, RF_DEFAULT);

Trascorso il tempo indicato il modulo effettuerà un wake-up, in pratica un SOFT RESET, che NON rimetterà in esecuzione il codice dal punto in cui lo abbiamo lasciato, ma procederà ad una riesecuzione da capo della funzione setup() e poi loop().

19 pensieri riguardo “Stazione Meteo 3.0 su ESP8266-12e”

  1. Non sono riuscito nella fase di DeepSleep ad andare sotto i 7-8mA; tu dici il contrario e cioè che nella fase “dormiente” il consumo si aggira intorno i microAmpere. Mi aiuti a capire come fare ?
    Premetto che ho eliminato tutti i consumi accessori e cioè power led, etc etc.

  2. Ciao Domenico,

    questo è un problema su cui sto indagando anche io. Non so quale sia la scheda che stai usando, ma il mio modulo che è quello di Banggood (fabbricato dalla doit) messo in Deep Sleep non scende sotto i 14.5 mA (milliAmpere).
    Guardando quanto dichiarato sul sito Espressif alla URL http://bbs.espressif.com/viewtopic.php?t=133 il consumo in Deep Sleep dovrebbe scendere intorno ai 10 microAmpere, ma questo non succede. Se proprio vogliamo paragonare i consumi raggiunti, almeno con i miei moduli, sembrerebbe che l’ESP sia andato in “Modem-Sleep”, lasciando cioè la CPU attiva. In Deep Sleep invece si dovrebbe disattivare tutto tranne l’RTC interno, deputato al risveglio dell’ESP, e questo giustificherebbe i 10uA.
    C’è un documento interessante alla URL http://bbs.espressif.com/viewtopic.php?f=51&t=1977 , si tratta di un file PDF dal nome “9B-ESP8266-Low_Power_Solutions__EN.pdf”. Si trova nel terzo riquadro, lo puoi scaricare da lì. Merita una lettura approfondita, io dovrei trovare il tempo di farlo con calma.

    Un’altra prova che devo fare (ma forse puoi anticiparmi tu) è quella di ricorrere, sempre dalla IDE di Arduino, alla chiamata diretta alla funzione di sistema, come consigliato in questo forum: http://www.esp8266.com/viewtopic.php?f=29&t=2472

    che forse potrebbe risolvere il problema. Naturalmente senza dimenticare di collegare tra loro il pin GPIO16 e il RST durante l’esecuzione dello sketch.

    Maintainer

    1. Ho provato a fare la chiamata diretta alla “system_deep_sleep()” ma niente da fare, sempre 14.5mA.
      D’altronde cercando nell’SDK (la 2.3.0) la chiamata ESP.deepSleep() non faceva altro che chiamare la funzione citata prima. Ecco il codice:

      void EspClass::deepSleep(uint32_t time_us, WakeMode mode)
      {
      system_deep_sleep_set_option(static_cast(mode));
      system_deep_sleep(time_us);
      esp_yield();
      }

      Quindi la questione rimane aperta. Lo stesso documento Espressif che ho citato nel precedente post si smentisce poi a pag. 11/12 parlando di 20uA e non 10uA per il Deep Sleep Mode, ma siamo comunque lontanissimi dal consumo che si dovrebbe avere. Il colpevole potrebbe essere il firmware installato, ma è solo un’ipotesi.

  3. Riguardo la questione del Deep Sleep mi è capitato di leggere qua e là alcuni articoli dove si parlava del fatto che alcune schede montano dei regolatori di tensione che hanno correnti a riposo anche di qualche decina di mA, rendendo in pratica vano il ricorso alla funzione di Deep Sleep.

    Maintainer

      1. L’ESP8266-01 richiede un’alimentazione molto stabile, specialmente in corrente, altrimenti si rischia di vederlo resettarsi apparentemente senza motivo sotto carico . Niente ricaricabili, che hanno poi una tensione di circa 1.2V e non 1.5V. Probabilmente con le batterie che stai usando non regge i picchi di corrente richiesti dalla trasmissione wi-fi. Prova con alcaline di buona marca sicuramente cariche al massimo.

  4. Ciao, complimenti per la guida. Non possedendo un Raspberry Pi2 e mi chiedevo se posso usare il tuo codice php ridettamene caricandolo su un server tipo altervista. Potrei far comunicare il mio esp8266 con un server web? grazie.

  5. Bel progetto, molto interessante!
    Proprio l’altro giorno ho testato con successo su esp8266 l’utilizzo delle librerie MySQL Connector Arduino per l’inserimento diretto di valori nel database, senza utilizzare quindi l’interprete php..
    Chiedevo un consiglio: ora che i dati sono all’interno del nostro bellissimo database, cosa posso usare per visualizzarli? Magari creando dashboard con grafici, gauge etc..
    Si potrebbe utilizzare Grafana o altre piattaforme di monitoring e analisi per avere una interfaccia grafica e una esposizione dei dati accattivante?
    Grazie

  6. Non sono un esperto sui front-end da utilizzare in questi casi per cui nel mio caso ho utilizzato le API Google per gli oggetti grafici, che sono gratuite. Ma anche Grafana va benissimo. Tutte queste librerie possono facilmente prelevare dati da un Database MySql.

  7. Buongiorno e grazie per aver condiviso,
    credo che l’immagine in alta risoluzione dei collegamenti (quella fatta con fritzing per intenderci),
    sia corrotta..
    La potete sistemare? Grazie infinite..!

Lascia un commento