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.

 

Lascia un commento