Impara come usare il BME680 Sensore Ambientale con Arduino. Il BME680 è un sensore piccolo che può misurare temperatura, umidità, pressione e concentrazione di gas. Supporta anche diverse modalità di alimentazione, inclusa una modalità a bassissimo consumo, che lo rende adatto a progetti alimentati a batteria.
Componenti necessari
Di seguito trovi i componenti necessari per questo progetto. Oltre al sensore BME680 ti servirà un microcontrollore. Ho scelto un Arduino UNO ma puoi usare anche altri Arduino. Poiché il BME680 funziona a 5V e 3.3V, puoi anche usare un ESP32 o ESP8622, per esempio.

Sensore BME680

Arduino Uno

Set di fili Dupont

Breadboard

Cavo USB per Arduino UNO
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Panoramica del sensore BME680
Il BME680 è un sensore piccolo (3x3x1 mm) che può misurare temperatura, umidità, pressione e la concentrazione di gas organici volatili (VOC) come etanolo, alcol e monossido di carbonio. L’immagine sotto mostra il sensore con il piccolo foro per lo scambio di gas sulla parte superiore:

La comunicazione con il sensore avviene tramite interfaccia I2C o SPI ed è compatibile con Arduino o ESP32, per esempio.
Il chip BME680 ha una tensione di funzionamento da 1.7V a 3.6V. Di solito però si usa una breakout board con regolatore di tensione che permette di alimentare il sensore anche a 5V. Ne parleremo più avanti.
Il consumo di corrente è di circa 4µA per le misurazioni di umidità, pressione e temperatura e fino a 12mA quando si usano tutti i sensori inclusi quelli per i gas. Tuttavia, è possibile mettere il sensore in modalità sleep dove consuma solo 0.15µA. Inoltre, i singoli sensori di umidità, pressione e gas possono essere abilitati o disabilitati indipendentemente per gestire il consumo energetico.
Per quanto riguarda la precisione, il sensore può misurare l’umidità con una precisione di ±3%, la pressione barometrica con una precisione assoluta di ±1 hPa e la temperatura con una precisione di ±1.0°C. Grazie alla precisione nella pressione, il sensore può essere usato per stimare l’altitudine con un margine di ±1 metro.
| Sensore | Precisione | Intervallo |
| Temperatura | ± 1.0 ºC | -40 a 85 ºC |
| Umidità | ± 3 % | 0 a 100 % |
| Pressione | ± 1 hPa | 300 a 1100 hPa |
Sensore gas
Il BME680 contiene un sensore MOx (ossido metallico) con riscaldatore per misurare la concentrazione di composti organici volatili (VOC) nell’aria, in particolare etano, isoprene / 2-metil-1,3 butadiene, etanolo, acetone, monossido di carbonio. Tuttavia, non può distinguere tra questi VOC. Invece fornisce un valore di resistenza proporzionale alla concentrazione di VOC.
Nota che il sensore gas necessita di un tempo di burn-in da 5 a 30 minuti! Se vuoi mettere il sensore (e il microcontrollore) in modalità sleep tra una misurazione e l’altra devi memorizzare il sensor state per ridurre questo tempo di burn-in per il sensore gas. Per le misurazioni di umidità, pressione e temperatura questo non è necessario.
Per la specifica tecnica completa consulta il datasheet linkato qui sotto:
Breakout board per BME680
Poiché il chip BME680 è molto piccolo, di solito si usa una breakout board per collegare il sensore ad Arduino o ESP32. L’immagine sotto mostra il fronte e il retro di una tipica breakout board per il BME680:

Pinout del BME680
La breakout board solitamente ha il XC6206 (662K) regolatore di tensione low-dropout che permette di alimentare il sensore a 3.3V o 5V. Il BME680 è la piccola scatola metallica quadrata, sul lato destro nella foto sotto:

Sul lato sinistro ci sono i pin per l’interfaccia I2C o SPI, insieme alle connessioni di alimentazione (VCC, GND). Per la comunicazione I2C servono solo i pin SCL e SDA. Quando si usa l’interfaccia SPI, il pin CS (Chip Select) permette a più sensori BME680 di condividere lo stesso bus. Ogni sensore può essere controllato individualmente collegando il suo pin CS a un GPIO separato.
Con l’interfaccia I2C, il pin SDO determina l’indirizzo I2C del sensore. Lasciando SDO scollegato l’indirizzo è 0x77, mentre collegandolo a massa cambia l’indirizzo a 0x76. Questa configurazione aiuta a evitare conflitti di indirizzo con altri dispositivi I2C e permette anche a due sensori BME680 di funzionare sullo stesso bus I2C.
Collegare il BME680 via I2C
Collegare il BME680 via I2C è semplice. Collega SCL e SDA del BME680 ai pin corrispondenti sull’Arduino UNO. GND va collegato a GND, e VCC può essere collegato a 5V o 3.3V. Vedi il cablaggio completo sotto:

Se non sai quali sono i pin hardware I2C per la tua scheda dai un’occhiata al Find I2C and SPI default pins tutorial. Se usi una scheda a 3.3V, ad esempio un ESP32, assicurati di collegare VCC a 3.3V!
Codice per misurare Temperatura, Umidità, Pressione, Altitudine e Gas
Il codice seguente mostra come misurare Temperatura, Umidità, Pressione, Altitudine e concentrazione di Gas con il BME680. Dai un’occhiata veloce al codice completo prima di discuterne i dettagli:
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme;
void setup() {
Serial.begin(115200);
bme.begin();
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
if (bme.performReading()) {
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Serial.println();
delay(2000);
}
}
librerie
Per cominciare, il codice include la Adafruit BME680 library che fornisce tutte le funzioni essenziali per il sensore BME680. Questa libreria gestisce la comunicazione via I2C o SPI e semplifica le letture del sensore.
#include "Adafruit_BME680.h"
Puoi installare questa libreria come al solito tramite il LIBRARY MANAGER. Cerca “bme680” e seleziona la “Adafruit BME680 Library” come mostrato sotto:

costanti
Successivamente, il codice definisce una costante per la pressione al livello del mare in ettopascal (hPA). Questo valore è importante per calcolare l’altitudine. Puoi modificarlo in base alla tua posizione per migliorare la precisione. Questo map potrebbe aiutarti.
#define SEALEVELPRESSURE_HPA (1013.25)
oggetti
Qui, il codice crea un’istanza della classe Adafruit_BME680. Questo oggetto ci permetterà di accedere alle letture del sensore e configurarlo.
Adafruit_BME680 bme;
Se lasci SDO scollegato e usi i pin I2C di default per il tuo microcontrollore, questo costruttore dovrebbe funzionare così com’è. Altrimenti puoi specificare l’indirizzo I2C tramite bme.begin(addr) nella funzione setup:
bme.begin(uint8_t addr = BME68X_DEFAULT_ADDRESS);
o pin I2C diversi tramite
Adafruit_BME680(TwoWire *theWire = &Wire);
quando crei l’oggetto sensore.
setup
All’interno della funzione setup(), il codice avvia la comunicazione seriale a 115200 baud. Questo è essenziale per stampare i dati del sensore sul Serial Monitor.
Serial.begin(115200);
Poi inizializza il sensore BME680 chiamando bme.begin(). Se il sensore è collegato correttamente e la libreria funziona, inizierà la comunicazione.
bme.begin();
Ricorda che puoi specificare un indirizzo I2C diverso chiamando bme.begin(addr) se necessario.
La precisione del sensore dipende molto dalle impostazioni di oversampling. In questa riga, la misurazione della temperatura è impostata per oversampling 8 volte, il che smussa le fluttuazioni e migliora l’affidabilità.
bme.setTemperatureOversampling(BME680_OS_8X);
Il BME680 supporta le seguenti impostazioni di oversampling:
BME680_OS_NONEBME680_OS_1XBME680_OS_2XBME680_OS_4XBME680_OS_8XBME680_OS_16X
L’umidità è impostata per oversampling 2 volte. Di solito è sufficiente per la maggior parte delle applicazioni dove l’umidità non cambia rapidamente.
bme.setHumidityOversampling(BME680_OS_2X);
Per la pressione, il sensore usa un oversampling 4x. La pressione atmosferica può variare lentamente, quindi questo livello offre un buon equilibrio tra velocità e precisione.
bme.setPressureOversampling(BME680_OS_4X);
Il codice applica anche un filtro passa basso alle letture del sensore usando un filtro IIR (Infinite Impulse Response). Questo aiuta a eliminare il rumore nelle letture di pressione.
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
Sono supportate le seguenti dimensioni di filtro:
BME680_FILTER_SIZE_0BME680_FILTER_SIZE_1BME680_FILTER_SIZE_3BME680_FILTER_SIZE_7BME680_FILTER_SIZE_15BME680_FILTER_SIZE_31BME680_FILTER_SIZE_63BME680_FILTER_SIZE_127
Infine, c’è un’impostazione speciale per il sensore gas. Deve riscaldarsi prima di effettuare una lettura. Questa riga imposta il riscaldatore a 320°C per 150 millisecondi. Questo è fondamentale per misurare i composti organici volatili (VOC) nell’aria.
bme.setGasHeater(320, 150); // 320*C for 150 ms
loop
Ora diamo un’occhiata alla funzione loop(), che gira continuamente. Inizia controllando se una lettura del sensore è disponibile usando bme.performReading(). Se la lettura ha successo, procede a stampare i dati.
if (bme.performReading()) {
La temperatura viene prelevata da bme.temperature e il valore viene stampato sul Serial Monitor in gradi Celsius.
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Allo stesso modo, la lettura dell’umidità viene presa da bme.humidity e stampata in percentuale.
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
La pressione atmosferica è ottenuta da bme.pressure. Il valore è in Pascal, quindi dividendo per 100 si converte in hPa (ettopascal), unità standard per la pressione barometrica.
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
L’altitudine non è misurata direttamente, ma calcolata dalla pressione usando il riferimento al livello del mare. La funzione readAltitude() si occupa di questo.
Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Infine, viene stampata la resistenza del gas (in Ohm). Questo valore dà un’idea della qualità dell’aria. Il sensore non indica esattamente quali gas sono presenti, ma una resistenza alta di solito significa aria più pulita. Dividendo per 1000 si converte il valore in kilo-ohm per una lettura più semplice.
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Il loop poi si ferma per 2 secondi prima di ripetere. Questo ritardo aiuta a vedere chiaramente l’output nel Serial Monitor. Dovresti vedere il seguente output:

Ecco fatto! Ora sai come configurare e leggere i dati dal BME680 collegato a una scheda Arduino via I2C. Nella sezione successiva ti mostro rapidamente come usare invece l’interfaccia SPI.
Collegare il BME680 via SPI
Invece di I2C puoi anche comunicare con il BME680 via SPI, che richiede più collegamenti ma permette misurazioni più veloci.
A seconda della scheda microcontrollore i pin per l’hardware SPI variano. Consulta il Find I2C and SPI default pins tutorial se devi identificarli. Per Arduino UNO i pin sono 13 (SCK), 12 (MISO/SDO), 11 (MOSI/SDA) e 10 (CS/SS). Lo schema sotto mostra i collegamenti da fare.

Rispetto al codice precedente, devi solo sostituire la seguente riga che crea l’oggetto sensore
Adafruit_BME680 bme;
con questa riga, che specifica i pin usati per collegare il BME680 via SPI:
#define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
Tutto il resto del codice può rimanere esattamente lo stesso.
Conclusione
In questo tutorial hai imparato come usare il BME680 Sensore Ambientale con un Arduino. Il BME680 è un sensore molto piccolo che può misurare temperatura, umidità, pressione e concentrazioni di gas con precisione.
Rispetto al molto simile BME280, il BME680 ha il sensore gas aggiuntivo ma questo significa anche che deve riscaldarsi per 5–20 minuti prima che le letture di gas siano affidabili e consuma più energia. Se non ti servono le misurazioni di gas scegli il più economico e piccolo BME280. Vedi il tutorial How To Use BME280 Pressure Sensor With Arduino per maggiori informazioni.
Nota che esiste anche un BMP280, che è più economico e consuma meno energia, ma misura solo temperatura e pressione. Se ti servono solo temperatura e umidità scegli invece il SI7021, che è ancora più piccolo e preciso. Dai un’occhiata al Si7021 Temperature Sensor Arduino Tutorial.
Altri sensori comuni ma meno precisi da considerare sono il LM35, il TMP36, il DS18B20 e il DHT11/ DHT22. Per visualizzare i dati del sensore dai un’occhiata ai tutorial Weather Station on e-Paper Display e Temperature Plotter on e-Paper Display.
Infine, se vuoi trasmettere dati ambientali su distanze maggiori rispetto al Bluetooth o Wi-Fi, la comunicazione a lunga distanza via LoRa potrebbe interessarti: Send Environmental Data with LoRa.
Non abbiamo parlato dell’interpretazione delle misurazioni di concentrazione di gas del BME680. Se vuoi misurare la qualità dell’aria dai un’occhiata al tutorial Measure Air Quality with BME680, dove ne discutiamo in dettaglio.
Se hai domande, sentiti libero di lasciarle nella sezione commenti.
Buon divertimento con il tinkering ; )

