Sensori di pressione BME280 e BMP280

Ho acquistato vari BME280 e BMP280 su breakout board da diversi store on-line. Se non li conoscete, i sensori in questione servono a misurare Pressione atmosferica, Temperatura ed, eventualmente, Umidità; sono forse i sensori più utilizzati nelle stazioni meteo. Le Breakout-boards (BoBs), invece, sono quelle schedine che ci permettono di smanettare con componenti che, in mancanza di attrezzature apposite, non saremmo in grado di utilizzare a causa del loro package un po’ difficile da saldare.

Ad ogni modo le BoB sono molto comode anche perchè riportano i pin su header a passo standard da 2.54mm, con le serigrafie, e quasi sempre hanno anche un contorno di componenti già montati (level shifters, resistenze di pull-up, condensatori di filtro ecc) che fanno in modo da avere tra le mani un prodotto già funzionante con lo sforzo minimo, utilizzabile su breaboard o con altri microcontrollori tramite cavetti jumper. Aggiungiamo anche che spesso queste breakout boards ci vengono a costare pure meno del solo componente stesso…

Breakout Boards a 4 e 6 pin

Del BME280 e BMP280 su BoB ne esistono varie versioni: a parte i prodotti di Adafruit che si distinguono sempre dalla massa, perchè realizzati in maniera diversa e spesso con a bordo level-shifter a mosfet che ne fanno lievitare notevolmente sia prezzo che qualità, la maggior parte di quelli di origine cinese si presentano su BoBs di colore viola a 4 o 6 pins che hanno delle differenze.

Quello che dico per il BME280 vale anche per il BMP280. Analizzeremo dopo le (poche) differenze tra questi due sensori

Prima di continuare osserviamo il pinout del sensore in questione, preso dal datasheet:

Il diagramma è mostrato dalla parte inferiore (lato dei pad): il cerchietto tratteggiato in basso rappresenta il vent-hole, il buchino nella parte superiore che serve al sensore per mettersi in contatto con l’ambiente esterno. I più acuti osservatori avranno notato subito che i pin sono numerati al contrario rispetto a come siamo abituati sui normali circuiti integrati DIL: questa cosa è evidenziata anche nel datasheet per chi non ci facesse caso, perchè poi è facile sbagliarsi. Il significato dei pin è il seguente:

N° pinDescrizione pinFunzioneSpecifiche
1GNDGround
2CSBChip selectSe all'accensione si trova a VDDIO, il sensore va in modalità I2C
3SDIData (Input)SDI in modalità SPI
SDA in modalità I2C
4SCKClockSCK in modalità SPI
SCL in modalità I2C
5SDOSDO/AddressSDO in modalità SPI
Selezione indirizzo in modalità I2C:
0x76 se SDO=GND
0x77 se SDO=VDDIO
6VDDIOTensione per la sezione digitaleda 1.2 a 3.6
7GNDGround
8VDDTensione per la sezione analogicada 1.71 a 3.6V

VDD e VDDIO sono sempre collegati insieme, normalmente su una linea a 3.3V

BoBs a 4 pin = I2C @ 5V

Queste sono vendute per funzionare a 5V e solo in modalità I2C: su queste schede il terminale VIN va collegato a 5V, a bordo c’è un regolatore di tensione che scala a 3.3V ed è presente un level-shifter, costituito da due mosfet, o da un doppio mosfet, sui terminali SDA e SCL per fare in modo che, anche collegati su altre schede in cui ci sono dispositivi I2C the “tirano” verso 5V, arrivino sempre 3.3V. Su tali schede CSB è tenuto a livello alto, per cui il sensore parte in I2C, mentre su SDO c’è un jumper a 3 vie a saldare normalmente chiuso verso GND, per cui il sensore parte con indirizzo I2C 0x76. Su tali schede non è possibile utilizzare la comunicazione SPI.

Scegliete questa scheda se volete comunicare solo in I2C e se sul bus di comunicazione ci sono altri dispositivi I2C che lavorano a 5V o comunque sulla linea sono presenti resistenze di pull-up verso i 5V. Questa schedina normalmente costa qualcosina in più rispetto a quella a 6pin perchè a bordo ci sono i componenti per farla funzionare a 5V.

BoBs a 6 pin = I2C+SPI @ 3.3V

Anche nelle BoBs a 6 pin il pin CSB è tenuto a livello alto ma, anzichè essere collegato direttamente a VDD c’è una resistenza di pull-up da 10KΩ, per cui, lasciando il pin scollegato, il sensore parte in I2C: se volete comunicare in SPI, tale pin va portato a GND e lo si può fare in sicurezza senza mettere in corto nulla dato che c’è la resistenza. SDO è messo a GND tramite una resistenza di pull-down da 10KΩ, per cui, lasciando tale pin scollegato, anche qui l’indirizzo di default è 0x76, portando invece SDO a VDD l’indirizzo diventa 0x77.

Scegliete questa scheda se volete lavorare a 3.3V e risparmiare, anche se è un pochino più larga di quella a 4 pins.

BME280 Vs BMP280

I due sensori in questione hanno il nome molto simile e vengono facilmente confusi tra loro: la differenza tra i due è che  il BMP280 non misura l’umidità e quindi costa di meno.

Il BMP280 è anche più piccolo. Il pinout dei due sensori è identico, così anche l’indirizzamento e i registri: su molti siti scrivono che gli indirizzi di default sono diversi, probabilmente nessuno è andato a leggersi i datasheets. Di seguito c’è un’immagine del retro di due schedine a 6 pin:

In questa foto, a sinistra c’è un sensore BME280, a destra invece potrebbe trattarsi di un BME280 o BMP280. Come vedete le breakout boards sono perfettamente identiche, cambia la serigrafia: quella a sinistra è precisa, quella destra è generica perchè, ripeto, questa Breakout-board si adatta sia al BME280 che al BMP280 (hanno scritto BME/PM280 ma vabbè).

Ho sentito dire di persone che hanno acquistato una di queste boards come BME280 e invece non erano in grado di misurare l’umidità dal momento che sulla scheda era invece montato un BMP280: questo, purtroppo, succede. Per fortuna, prima di utilizzarle (e quindi saldarci sopra degli headers che invaliderebbero un reso), è possibile riconoscere il tipo di sensore montato: Il BME (che misura pure l’umidità) è quadrato, il BMP è rettangolare:

Sulla BoB del BMP, in aggiunta, è possibile vedere i pad intorno al sensore proprio perchè è più corto rispetto al BME e la BoB è la stessa.

Esiste, poi, anche il BMP180, che è uguale a questi due ma misura soltanto la pressione.

Sensore BME280 o BMP280 che non funziona

Nella foto di prima, in cui illustro la differenza tra i due sensori, si nota un altro problema, abbastanza grave. Rivediamo un attimo il diagramma con il pinout e, usando un tester, vediamo dove vanno a finire i pin di alimentazione tenendo come riferimento il “Buchino” sopra al sensore per determinare il pinout:

Il sensore a destra è stato montato al contrario, ruotato di 180°! Il buchino su questa BoB deve trovarsi a destra tenendo l’header in alto… Inutile dire che, con questo BMP280 in mano, sono letteralmente impazzito cercando di capire perchè non funzionasse… solo dopo attente analisi e lente di ingrandimento ho capito il perchè. A quanto pare si tratta di un problema abbastanza comune su questo tipo di sensore quando lo si acquista in Cina: probabilmente le pick-and-place che fanno il montaggio a volte non rilevano bene il buchino e montano il sensore al contrario. Al termine della linea ci dovrebbe essere qualcuno che controlla ma non tutti lo fanno.

Oltre a questo problema, che è tipo meccanico, ce ne possono essere altri software, che vedremo al paragrafo libreria.

Le misura di temperatura e umidità del BME280/BMP280 sono affidabili?

Premetto che personalmente prendo questi sensori solo per misurare la pressione atmosferica. In molti, però, ci misurano anche temperatura e umidità (BME280). Vi dirò: io con i valori di temperatura non mi sono mai trovato bene, ho sempre letto valori più alti di 1/1.5 gradi rispetto ad altri sensori con cui facevo il confronto e con termometri certificati. Incredibilmente un sensore economico, figlio di nessuno, come il DHT22 mi ha sempre restituito valori di temperature più vicini agli strumenti costosi.

Poi, leggi e rileggi e nel datasheet, in una nota a margine, è svelato l’arcano:

Essendo il sensore montato su PCB, risente della temperatura dello stesso, in più il sensore in se stesso si riscalda leggermente. Tutto questo porta a leggere una temperatura più alta del normale e per tale motivo nei miei progetti di centraline meteo in cui uso il BME o BMP280, non utilizzo mai la temperatura letta dal sensore ma preferisco accoppiare un altro sensore come appunto un DHT22 o un DS18B20.

Per quanto riguarda l’umidità (solo BME280), le opinioni sono discordanti: spesso non ho trovato spesso dei valori di umidità uguali a quelli di strumenti portatili che normalmente uso per il mio lavoro, mentre il DHT22, ancora una volta, mi dava dei valori vicini. Il mio sospetto è che il “buchino” sopra al sensore è piccolo e causa un’isteresi notevole: l’umidità entra e fa fatica ad uscire ma questo si potrebbe risolvere con una adeguata ventilazione. Ad ogni modo ci sono persone che hanno fatto comparazioni molto autorevoli in cui il BME280 risulta essere il miglior sensore, tra quelli provati, per determinare l’umidità: ho riportato il link all’ultimo paragrafo. Il DHT22, posso confermare, perde stabilità col passare del tempo relativamente al valore di umidità.

Libreria per Arduino

La libreria più utilizzata per Arduino è sicuramente quella di Adafruit. Se vogliamo utilizzare la comunicazione I2C, includeremo <Wire.h> altrimenti, per l’SPI, includeremo <SPI.h>. Si dichiara l’oggetto al di fuori delle funzioni in base al tipo di comunicazione che vogliamo utilizzare:

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

Le note sono auto-esplicative. Nel caso dell’SPI gestito dalla periferica hardware dedicata bisognerà specificare qual’è il pin utilizzato per il Chip-Select (CSB sulla BoB), nel caso, invece, di SPI emulato via software, andranno specificati tutti i pin.

L’inizializzazione di default per BoB Adafruit si fa con:

bool status = bme.begin();

nel caso in cui status è false vuol dire che c’è un problema: non viene trovato il sensore sul bus. In realtà la libreria l’ha fatta Adafruit e specifica che è per la sua breakout-board, sulla quale il pin SDO è collegato a VDD dando l’indirizzo di default 0x77, per cui l’inizializzazione fatta così, senza parametri, cerca il sensore all’indirizzo 0x77. Il problema è che molti utenti alle prime armi comprano il sensore cinese e usano la libreria Adafruit e non funziona… e avete capito già perchè! Se avete acquistato il sensore cinese (e, soprattutto, sulla BoB a 6pin non avete messo SDO a VDD), l’indirizzo è 0x76 per cui l’inizializzazione la farete con:

bool status = bme.begin(0x76);

Io ho provato ad utilizzare il sensore su un ESP32 e sullo stesso bus I2C in cui era collegato un display OLED, senza avere nessun tipo di problema, con la libreria Adafruit. In aggiunta, se con una BoB a 6 pin non riuscite proprio a comunicare, provate a mettere il pin CSB a 3.3V, perchè non vorrei che alcuni modelli di BoB abbiano il pin di default a GND con la resistenza oppure che semplicemente la resistenza non fa bene contatto o non fornisce corrente sufficiente. In particolare mi è capitato di avere problemi sulle breadboards: collegando i pin direttamente alla scheda di sviluppo, nessun problema, collegando tutto su breadboard non funzionava nulla.

Sulla BoB a 4 pin il problema non c’è perchè CSB è collegato direttamente a 3.3V senza resistenza.

Se avete altri problemi vi consiglio di utilizzare un programmino di test chiamato I2C scanner che scansiona il bus alla ricerca di tutti i dispositivi.

Downloads

Links

Nei link su amazon vi consiglio dei prodotti che ho acquistato personalmente e che mi sono arrivati senza problemi di chip montati al contrario!

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)