SainSmart IIC/I2C/TWI – Display LCD seriale 2004 20×4

lcd04

Questo display prodotto dalla Sainsmart è decisamente un buon LCD, anche se mi ha fatto faticare un po’ per trovare una libreria che funzionasse con la IDE di Arduino 1.6.5. Ma andiamo per ordine. Dotato di 20 caratteri per 4 righe si presenta con un fondo blu retroilluminato e caratteri bianchi. Ne esiste anche una versione con sfondo “bianco” e caratteri neri, ad un prezzo che si aggira intorno ai 10-15 dollari, a seconda di dove si decide di acquistarlo. La grossa comodità che presenta questo LCD è che è pilotato dal bus I2C, il che significa che avremo bisogno di solo 4 connettori per gestirlo, 2 di alimentazione e i due classici SDA ed SCL. Nonostante le indicazioni del produttore la versione in commercio attualmente presenta un indirizzo I2C pari a 0x27 e non 0x34 come indicato. Se si ha qualche dubbio a riguardo dopo averlo acquistato è bene far girare, a collegamenti fatti, uno sketch contenente uno scanner I2C che ci possa indicare a quale indirizzo reperire l’LCD sul bus, in modo tale da riportarlo correttamente nella riga di configurazione. Uno sketch di questo tipo può essere reperito QUI.

Come ho accennato prima esistono alcune librerie su Internet, compresa quella indicata da Sainsmart, che sulle nuove versioni della IDE non compilano. Si tratta di codice rimasto fermo alla IDE 1.0.X, il che le rende assolutamente improponibili. C’è anche un po’ di ambiguità sul pin da utilizzare per gestire la retroilluminazione, il 13 negli schermi che ho io non funziona, va utilizzato il 3 e così via. Insomma, c’è rischio di perderci un po’ di tempo prima di vederlo funzionante e all’opera.

lcd01

Per farla breve quindi dirò che l’unica libreria che mi ha funzionato è reperibile a QUESTO indirizzo e che andando a rovistare tra il codice della stessa libreria ho ricavato tutte le funzioni disponibili per la gestione del display, che ho riportato nello sketch di test che pubblico qui di seguito.

SKETCH DI TEST:

 

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().

Sensore Adafruit TSL2561 – Letture di luce direttamente in Lux

tsl2561_1

Stimolato dal fatto che alle schede ESP8266 non stanno proprio simpatici i sensori di luce analogici ho ricercato qualcosa di digitale in grado di svolgere lo stesso compito, magari dotato di una libreria in grado di fornire i valori di uscita già calibrati in Lux senza dover giocherellare con formule variabili da modello a modello di fotoresistore. Ho trovato quindi questo TSL2561, prodotto dalla NewYorkese Adafruit, che ovviamente offre come valore aggiunto rispetto ad un fotoresistore del tipo GL5539 (di cui comunque ne ho una bustina piena) la lettura direttamente in Lux sulla banda del visibile, sull’infrarosso e su una banda più estesa definita “broadband”. Secondo fonte Adafruit inoltre la precisione dovrebbe essere migliore di un sensore fotografico CdS. In poche parole potremmo costruirci attorno un buon luxmetro o eventualmente un esposimetro.

Stiamo parlando di un sensore del costo di circa 6-7$; è chiaro che con la stessa cifra si possono acquistare non meno di una sessantina di GL5539, ma se vogliamo la qualità Adafruit e questo tipo di accuratezza nelle letture mi pare che siamo ancora a cifre accettabili. Poi ovviamente si può scegliere di usare uno o l’altro in base al contesto che ci interessa.

Informazioni molto dettagliate sull’impiego di questo sensore posso essere trovate sul sito Adafruit a questi indirizzi:

https://learn.adafruit.com/tsl2561/overview

https://www.adafruit.com/datasheets/TSL2561.pdf

Le librerie da scaricare sono due: una generica in comune ai sensori Adafruit ed una specifica per il TSL2561. Ho provato lo sketch di esempio anche su ESP8266 (con le dovute modifiche) e ha funzionato correttamente. Vengono prodotti dei warnings in compilazione la prima volta ma poi spariscono del tutto nelle compilazioni successive. Ricordarsi di definire nella Wire.begin i due pin associati al colloquio I2C, a differenza degli Arduino. Questo sensore è dotato poi di un pin “address” che permette di definire 3 indirizzi I2C (scollegato, a massa, a +Vcc) quindi può convivere tranquillamente con altri sensori che sfruttano lo stesso bus.

Per comodità riporto lo sketch di test Adafruit per Arduino leggermente modificato così da mostrare tutte e 3 le letture insieme e con un refuso corretto riguardante il metodo getLuminosity che nell’originale non funziona. Come si può vedere c’è una funzione configureSensor() che permette di regolare la sensibilità e la precisione del sensore, altra cosa che può rivelarsi utile.

 

SKETCH DI TEST: