Datalogger WiFi con ESP8266

Da qualche anno in campo hobbistico si è diffuso l'interesse per il cosiddetto Internet Of Things, o internet delle cose: dispositivi dagli usi più disparati con i quali è possibile interagire tramite internet con interfacce utente spesso fornite da smatphones e PC. Dopo aver piluccato fra vari articoli in rete mi sono incuriosito all'argomento e dunque ho deciso di sperimentare un po'. Molto popolari sono i dispositivi costruiti attorno ad alcuni chip paricolarmente votati a questo tipo di utilizzo: l'ESP8266 nelle sue varie versioni e l'ESP32, "fratellone" del primo con qualche funzionalità aggiuntiva. Infatti dispongono di notevoli risorse hardware (piedini I/O, ingressi analogici, UART, SPI, I2C ecc) ma soprattutto possono essere programmati con diversi firmware; non ultima la possibilità di utilizzare l'IDE di Arduino. Inoltre il loro prezzo non impegna nessuno, quindi mi sono procurato due schede di sviluppo NodeMCU e due chip ESP-12. Per farci cosa? Innanzitutto per familiarizzare un po' con l'argomento, con l'obiettivo di realizzare qualcosa su misura dei miei interessi. Per i primi passi ho copiato qualche progettino già fatto, poi ho iniziato a pensare a qualcosa di più specifico.

Un (altro) datalogger

In effetti.. La montagna ha partorito un topolino? Non proprio..
Vero, ho deciso di affrontare un campo in cui ho già acquisito una certa dimestichezza, tuttavia in questo caso ci sono alcune marce in più. Questo progetto acquisisce i dati da un sensore di temperatura ad intervalli impostabili e genera direttamente un file in formato csv scrivendo su una scheda di memoria flash di tipo microSD. L'orario di sistema è acquisito via internet dal pool di servers NTP e aggiornato regolarmente. Il firmware include anche la gestione delle richieste effettuate su un BOT di Telegram, cosicchè la lettura del sensore possa essere rilevata tramite internet. Ho anche cercato (invano) di inviare in chat il file di log come allegato: nessun errore, "message sent" ma null'altro. Ho aggirato il problema implementando un server FTP attraverso il quale si accede alla scheda SD ed è possibile scaricare i log e -udite udite- modificare i parametri di funzionamento. Infatti ho constatato che inserire i parametri direttamente nel firmware comporta che per modificare l'intervallo di acquisizione dei dati, modificare i parametri del wifi, cambiare la password del server FTP occorre necessariamente riprogrammare il chip. Che significa avere a portata di mano un PC con l'ambiente di sviluppo installato, ricompilare, ricaricare.. Troooppo macchinoso. Modificare un file di configurazione col blocco note e caricarlo sulla SD del datalogger, magari dal telefonino via FTP è decisamente più comodo.

Schema elettrico

La scheda NodeMCU è catalogata fra i "sistemi di sviluppo" nei principali siti e-commerce, dunque sono partito da quella base. Buona parte della circuiteria è a bordo: regolatore di tensione a 3.3 volt, convertitore USB/seriale, componentistica per il RESET, varie resistenza di pull-up e pull-down per il boot e il funzionamento ottimale della scheda. Dunque mi è bastato aggiungere l'adattatore microSD, un connettore per il sensore DS18B20 (potrebbe essere usato tal quale anche per un DHT22 o simili cambiando due righe di codice) uno per eventuali dispositivi I2C (ulteriori sensori, display, espansioni I/O ecc. uno per l'ingresso ADC e l'alimentazione esterna. Sono inoltre accessibili i pin di input/ output inutilizzati.

In un primo momento ho ritenuto opportuno montare il circuito su bread board con l'intento, verificato il corretto funzionamento e il dimensionamento dei componenti, di realizzare una piccola scheda attorno al solo ESP-12. Successivamente mi sono reso conto che in questo genere di progetti la cosa non ha senso, in quanto lo spazio occupato dai componenti necessari allo stadio di alimentazione e all'eventuale convertitore USB-seriale, nonchè l'esigua differenza di prezzo tra il solo chip e l'intera NodeMCU non giustificano lo sforzo. Quindi ho realizzato uno stampato con la zoccolatura per la NodeMCU e i pochi componenti aggiuntivi:

Layout

Lato componenti

Lato rame

Il codice

Attingere nei vari articoli in rete mi ha permesso di approntare in tempo ragionevole un sketch "quasi" funzionante, perfezionandolo poco a poco nelle settimane di test seguite alla prima accensione. In effetti ho dovuto affrontare alcuni problemi inaspettati che nelle prime compilazioni del codice provocavano reset casuali ogni due-tre giorni ed in generale instabilità di funzionamento a lungo termine. Non avendo ottenuto risultati dalla consultazione di guide, forum e blog vari, mi sono arrangiato fino a scoprire che -udite udite- l'ultima versione dell'esp core caricato nel gestore schede dell'IDE di Arduino semplicemente si "mangia" qualche byte della memoria heap ad ogni iterazione del loop. Inevitabilmente, anche se la RAM disponibile non è poca, si arriva al crash del sistema. Installata la versione precedente (2.3.x) lo stesso codice è magicamente diventato "rock-solid". Successivamente mi sono dedicato agli orpelli, così che la versione "momentaneamente definitiva" dello sketch prevede o provvede a:

  • appena avviata la scheda, acquisire dal file SETUP.TXT i parametri della rete wifi, username e password del server FTP, intervallo fra le misurazioni;
  • contattare il server NTP e impostare l'ora di sistema, che rimane corretta almeno per qualche giorno anche in caso di spegnimento/caduta del wifi;
  • calcolare l'ora in cui verrà eseguita la prima lettura successiva in modo tale da allineare le rilevazioni ad orari sensati. In pratica se, ad esempio, l'accensione del sistema avviene alle 21.07 e sono previste letture ogni 15 minuti, la prima lettura avverrà dopo soli 8 minuti, in modo tale da allineare le successive al minuto 15, 30, 45, 00 e così via. "Feature" al tempo stesso inutile e indispensabile.
  • determinare in base alla data di sistema il nome del file di log dei dati. Ho deciso di raggruppare le letture mensilmente, così il nome dei files generato sarà del tipo mese corrente-anno (es. nov2018.csv, dic2018.csv, gen2019.csv ecc.)
  • inviare attraverso la chat generata dal bot Telegram la lettura del sensore, annotando data e ora di ogni richiesta su un file memorizzato su scheda SD così da tenere traccia delle richieste.
Non entro nei dettagli della creazione e configurazione del bot Telegram, ci sono numerosi articoli e tutorial ben fatti che spiegano passo passo la procedura. Unica annotazione: salvo modifiche, lo sketch risponde al solo commando "/command1"; occorre inoltre inserire la stringa Bot Token generata a sua volta da BotFather affinchè il sistema possa funzionare correttamente.

Qualche immagine del datalogger wifi all'opera: il file csv generato..

..importato in un foglio di calcolo per ulteriori elaborazioni

La chat generata dal bot Telegram

..infine, l'accesso via FTP alla scheda di memoria

Download

Sketch Arduino
Template file di configurazione
Pacchetto librerie utilizzate

Disponendo di un paio di sensori DS18B20 nella versione da inserire negli appositi raccordi a pozzetto degli impianti idraulici ho installato la sonda sul serbatoio di accumulo dell'impianto solare termico, così da monitorarne le prestazioni. Peccato che, testa oggi ritesta domani, sia sopraggiunto l'autunno inoltrato e dunque il periodo meno interessante da questo punto di vista. Ho finito il progetto in ritardo? No, sono MOLTO in anticipo sulla prossima primavera!

praz2004 chiocciola libero punto it