ESP8266 – Collegare più sensori analogici

Usando ormai da svariato tempo schede basate su ESP8266-12 ho imparato a convivere con i due limiti operativi di questi controller, ovvero il non indifferente consumo di corrente, il che ne rende problematica l’alimentazione con batterie e la presenza di una sola entrata analogica.

Il primo problema è in qualche modo aggirabile ricorrendo alla gestione in Deep Sleep di un nodo, quando però non è richiesto che il nodo debba essere sempre “sveglio” e vigile, in attesa di eventi estemporanei. Nel secondo caso invece è invece necessario ricorrere a chip esterni, tipo l’MCP3008 o MCP3208, che mettono a disposizione un certo numero di entrate analogiche da gestire ad esempio sul bus SPI. D’altronde è lo stesso problema che hanno i Raspberry, che di entrate analogiche non ne hanno proprio.

Esistono comunque in giro degli schemi semplificati che permettono agli ESP8266 di lavorare con più sensori analogici contemporaneamente effettuando una sorta di multiplexing via software. Ho realizzato un circuito di test composto da un controller Wemos D1 mini (ma anche una qualsiasi altra scheda basata sull’8266 va benissimo) e tre fotoresistori GL5539, a rappresentare genericamente 3 sensori analogici.

a0_multipli

Nella parte superiore della breadboard ci sono i soliti rail di alimentazione, 3.3V in questo caso, tensione che costituisce anche la Vref per i sensori. Questo perché nonostante il datasheet di Espressif citi come voltaggio di riferimento per l’entrata analogica A0 i valori da 0 a 1V, nelle schede commerciali in genere un partitore di tensione interno riporta il Vref ai più comodi valori compresi tra 0 e 3.3V.

Ogni sensore ha la sua resistenza di pull-down di 10K, che può variare a seconda di cosa stiamo usando e, cosa molto importante, ogni singolo circuito relativo ad un sensore analogico è isolato dagli altri tramite un comune diodo. In questo modo i sensori non si influenzeranno tra loro quando attiveremo di volta in volta i rispettivi pin digitali a cui sono connessi. Senza i diodi avremo comunque letture scombinate, provare per credere.

a0_multipli_2

In basso ho creato un common rail per convogliare i segnali analogici provenienti dai sensori e indirizzati all’entrata A0 del controller. Sarà quindi lo sketch, prima di effettuare la lettura sul singolo sensore, a portare a livello alto il relativo pin digitale e a portare a 0V gli altri 2.

Ecco lo sketch di esempio:

La cosa sembra funzionare. Dov’è il problema? I diodi, naturalmente. Questi provocano per loro natura una certa caduta di tensione nel circuito. Nel mio caso è esattamente di 0.5V, il che significa che il voltaggio di riferimento viene abbassato da 3.3V a 2.8V e avremo letture raw che non vanno da 0 a 1023, ma da 0 a 870 sballando tra l’altro la formula che uso per il GL5539 che dovrebbe diventare:

Insomma, se vogliamo convivere con questa situazione, una volta dedotto il valore massimo che otteniamo dopo la caduta di tensione (es. 870) possiamo rimappare le nostre entrate analogiche “virtuali” con una istruzione del tipo:

val = map(val,0,870,0,1023);

tenendo conto però che stiamo perdendo risoluzione sulle letture analogiche, e quindi qualità sul valore ritornato. Se tutto questo è per noi accettabile va bene, altrimenti è decisamente meglio passare a veri multiplexer, quindi chip esterni del tipo MCP3008 che sono comunque gestibili molto facilmente e che occupano sempre e comunque 4 pin digitali. In questo caso i valori letti saranno accurati al 100% (10 bit).

Una scheda che però mi intriga ancora di più e che ho intenzione di provare è la ADS1015 di Adafruit, che mette a disposizione 4 entrate analogiche ad alta risoluzione (12 bit, ovvero non più 1024 valori ma 4096) a guadagno variabile, anche se al costo di circa 10$. Il massimo della flessibilità insomma visto che veicola i dati sul bus I2C, impegnando solo 2 pin per i segnali.

 

Sensore Adafruit BMP280

In genere quando si ha bisogno di un sensore barometrico, capace cioè di misurare la pressione atmosferica, si ricorre al classico BMP180, reperibile presso alcuni fornitori cinesi intorno ai 3 euro. Ci sono però in commercio versioni più precise e flessibili, come ad esempio il BMP280 messo in commercio da Adafruit, a circa 10 dollari. Se poi vogliamo anche che il modulo misuri l’umidità relativa sia Adafruit che Sparkfun hanno in catalogo il BME280, in entrambi i casi quotato sui 20 dollari. Quello Adafruit può essere alimentato sia a 5 che a 3.3V mentre lo Sparkfun solo a 3.3V. Personalmente non spenderei 20$ per avere anche la misura di umidità, ma a questo punto userei un BMP280 affiancato da un DHT22 (3-4€) risparmiando un pò ed ottenendo anche un’altra lettura di temperatura per controllo.

Comunque: cos’ha in più il BMP280 rispetto al suo predecessore BMP180? Innanzitutto è più preciso, specialmente nella lettura barometrica. Nel datasheet Bosch del BMP280, reperibile QUI, c’è anche una breve comparativa dei valori tra i due sensori, e poi nel caso del BMP280 possiamo usare sia l’interfaccia I2C che SPI.

bmp280-1

Come si nota in figura la scheda Adafruit espone ben 6 pin così indirizzati:

Volendo quindi utilizzare il BMP con il bus I2C è sufficiente collegare i pin SCK e SDI oltre all’alimentazione, mentre in SPI servono 4 connessioni più l’alimentazione. Quindi direi proprio nessun problema di convivenza anche con molti sensori di vario tipo sullo stesso controller.

E mettiamoci poi alla fine anche la qualità costruttiva e l’affidabilità dei prodotti assemblati da Adafruit.

Passiamo alla libreria di gestione: ovviamente Adafruit mette a disposizione sul suo sito una LIBRERIA per questo sensore che va utilizzata oltre a quella generica comune a tutti i sensori Adafruit.

Sugli articoli di qualche mese fa riguardanti il BMP180 avevo fatto uso della libreria Sparkfun, perché ritengo abbastanza inutile avere una funzione per l’altimetro se non si ha la possibilità di prendere una misura di pressione a 0 mt. sul livello del mare. L’altezza precisa del punto di misura (sempre fissa se costruiamo una Stazione Meteo) la possiamo ricavare meglio dal GPS di un cellulare ed usarla poi per ricavare la pressione S.L.D.M. che è direttamente confrontabile con i dati meteo pubblicati dalle fonti ufficiali. Quindi stavolta va bene la libreria di Adafruit e quest’ultima quantità ce la calcoliamo da soli.

bmp280-2

Ecco un breve sketch di esempio per Arduino utilizzabile, con le opportune modifiche di collegamenti ai pin,  anche su schede ESP8266:

Nella funzione utente leggi_BMP280() ho quindi ignorato la readAltitude() messa a disposizione dalla libreria a favore del calcolo della pressione SLDM. E’ possibile usare l’altimetro ma ricordiamoci che il parametro di input 1013.25 mBar è un valore assolutamente teorico e non garantisce precisione nel calcolo dell’altitudine. Sarebbe necessaria contemporaneamente e nello stesso luogo un’altra lettura di pressione sul livello del mare con cui “entrare” nella funzione readAltitude().

Un’ultima cosa: mi raccomando di non dimenticare la bmp.begin() dentro la funzione setup. Il sensore è calibrato in fabbrica e questa funzione ne chiama un’altra interna alla libreria, readCoefficients(), che acquisisce i dati di calibrazione inseriti dal produttore e memorizzati in alcuni registri interni del chip Bosch.