Ultima modifica il 12 Settembre 2026 by Adriano
Il sensore BME280 rappresenta un’evoluzione del precedente BMP180, rispetto al quale offre oltre a dimensioni più contenute, consumi inferiori e prestazioni migliorate la lettura del valore dell’umidità. Solo un scalino più in basso del più completo BME680 che integra anche una funzione per la rilevazione dei gas.

In questo articolo vedremo nel dettaglio come è realizzato un modulo basato sul BME80, le sue caratteristiche principali e il suo funzionamento. Successivamente passeremo alla realizzazione di un semplice circuito di prova con un microcontrollore, per leggere i valori di temperatura e pressione e visualizzarli anche su un display OLED.
Indice
Descrizione del sensore BME280
Il BME280 è un sensore digitale MEMS (Micro-Electro-Mechanical System) progettato da Bosch Sensortec per la misura della pressione atmosferica. della temperatura. e dell’umidità.
Il dispositivo appartiene alla famiglia dei sensori barometrici Bosch e costituisce il successore del BMP180.
La misura della pressione può essere utilizzata non soltanto per conoscere le condizioni atmosferiche, ma anche per determinare l’altitudine, sfruttando la relazione esistente tra pressione atmosferica e quota.
Il sensore integra al proprio interno gli elementi necessari per effettuare la conversione delle grandezze fisiche in valori digitali. Il microcontrollore esterno deve quindi occuparsi semplicemente della configurazione del dispositivo e della lettura dei dati attraverso il bus di comunicazione.
Una caratteristica particolarmente interessante del BME280 è la possibilità di utilizzare due differenti interfacce digitali:
- I²C, particolarmente comoda nei progetti con Arduino ed ESP32;
- SPI, utile quando sono richieste maggiori prestazioni o quando il bus I²C non è disponibile.
Per l’utilizzo nei normali progetti elettronici, l’interfaccia I²C è generalmente la soluzione più semplice. Sono infatti sufficienti le due linee SDA e SCL, oltre all’alimentazione e alla massa.
Pressione atmosferica e altitudine
La pressione atmosferica diminuisce all’aumentare della quota. Il BME280 consente quindi di utilizzare il valore di pressione misurato anche per effettuare una stima dell’altitudine.
È importante però distinguere tra misura della pressione e misura diretta dell’altitudine: il sensore misura fisicamente la pressione atmosferica, mentre l’altitudine viene calcolata dal microcontrollore mediante una relazione matematica che tiene conto della pressione misurata e della pressione di riferimento.
Per questo motivo, la precisione dell’altitudine calcolata dipende anche dalla corretta impostazione della pressione di riferimento. Le variazioni della pressione atmosferica dovute alle condizioni meteorologiche possono infatti influenzare il valore dell’altitudine ottenuto.
Il modulo BME280
Il componente BME280 è disponibile come piccolo circuito integrato SMD e normalmente viene utilizzato nei progetti amatoriali attraverso appositi moduli breakout.
Questi moduli semplificano notevolmente il collegamento con Arduino, ESP32 e altri microcontrollori, integrando generalmente:
- il sensore BME280;
- un regolatore di tensione;
- condensatori di disaccoppiamento;
- circuiteria per l’adattamento dei livelli logici;
- i connettori per l’alimentazione e il bus di comunicazione.

Caratteristiche
| Alimentazione: | da 1,8 VDC a 5 VDC |
| Range: | – Temperatura: da -40°C a +85°C – Umidità: 0-100% RH – Pressione: da 300 a 1100 hPa |
| Risoluzione: | – Temperatura: 0,01°C – Umidità: 0,008% – Pressione: 0,18 Pa |
| Precisione: | – Temperatura: +-1°C – Umidità: +-3% – Pressione: +-1Pa |
| Interfacce: | – I2C (fino a 3,4 MHz) – SPI (3 e 4 fili, fino a 10 MHz) |
| Indirizzo I²C: | – SDO LOW : 0x76 – SDO HIGH: 0x77 |
| Dimensioni (senza connettore strip): | circa 13,3×10,6×3,5 mm |
| Peso (senza connettore strip): | 0,5 grammi |
BME280 e sensori della stessa famiglia
Il precedente BMP180 permette di misurare pressione e temperatura, mentre il BME280 ne rappresenta una versione più moderna e aggiunge la misura dell’umidità relativa, risultando particolarmente interessante per la realizzazione di stazioni meteorologiche.
Il BME680 aggiunge infine anche il sensore di gas, offrendo quattro tipi di informazioni: temperatura, pressione, umidità e una misura correlata alla presenza di composti organici volatili e alla qualità dell’aria.

Sotto una tabella comparativa dei vari sensori prodotti dalla Bosch Sensortec
| Caratteristica | BMP180 | BMP280 | BME280 | BME680 |
|---|---|---|---|---|
| Pressione atmosferica | ✓ | ✓ | ✓ | ✓ |
| Temperatura | ✓ | ✓ | ✓ | ✓ |
| Umidità relativa | ✗ | ✗ | ✓ | ✓ |
| Gas / qualità aria | ✗ | ✗ | ✗ | ✓ |
| Campo pressione [hPa] | 300–1100 | 300–1100 | 300–1100 | 300–1100 |
| Campo temperatura [°C] | −40…+85 | −40…+85 | −40…+85 | −40…+85 |
| Campo umidità | — | — | 0–100 %RH | 0–100 %RH |
| Precisione pressione [hPa tip.] | ±1 | ±1 | ±1 | ±0,6 |
| Precisione temperatura | circa ±1 °C | ±0,5 °C @ 25 °C | ±0,5 °C @ 25 °C | circa ±0,5 °C |
| Precisione umidità | — | — | ±3 %RH | ±3 %RH |
| Interfaccia | I²C / SPI | I²C / SPI | I²C / SPI | I²C / SPI |
| Tensione sensore [V] | 1,8–3,6 | 1,71–3,6 | 1,71–3,6 | 1,71–3,6 |
| Tensione I/O | — | 1,2–3,6 V | 1,2–3,6 V | 1,2–3,6 V |
| Consumo | na | ~2,7 µA @ 1 Hz | ~3,6 µA @ 1 Hz | ~3,7 µA @ 1 Hz |
| Dimensioni chip | 3,6 × 3,8 mm | 2,0 × 2,5 mm | 2,5 × 2,5 mm | 3,0 × 3,0 mm |
Breve video
Schema elettrico del modulo
Il modulo BME80 utilizzato per questo progetto non contiene soltanto il sensore Bosch, ma integra anche la circuiteria necessaria per semplificarne il collegamento con un microcontrollore. Lo schema elettrico può essere suddiviso in tre sezioni principali:
- alimentazione del modulo e generazione dei 3,3 V;
- adattamento dei livelli logici delle linee I²C;
- circuito del sensore BME280 e selezione del suo indirizzo I²C.

Alimentazione del modulo
Il connettore J1 mette a disposizione quattro collegamenti:
- VIN – alimentazione del modulo;
- ASCL – linea SCL del bus I²C lato microcontrollore;
- ASDA – linea SDA del bus I²C lato microcontrollore;
- GND – massa.

La tensione applicata a VIN viene inviata all’ingresso del regolatore U4, indicato nello schema come 3.3V-LDO, un 662K (Datasheet)
Il regolatore ha il compito di ricavare una tensione stabilizzata di 3,3 V, indicata nello schema con il nome BVCC, utilizzata per alimentare il BME280 e come riferimento per il lato a tensione più bassa del convertitore di livello I²C.
All’ingresso del regolatore è presente il condensatore C1 da 1 µF, mentre sull’uscita sono presenti C2 da 4,7 µF e C3 da 0,1 µF. Questi condensatori svolgono la funzione di stabilizzazione e filtraggio dell’alimentazione, riducendo eventuali disturbi e variazioni della tensione.
Il regolatore dispone inoltre del pin EN (enable), che nello schema è collegato all’ingresso VIN, mantenendo quindi il regolatore sempre abilitato quando il modulo viene alimentato.
La tensione BVCC, viene anche utilizzata per alimentare il circuito del sensore e come riferimento per il lato a tensione più bassa del convertitore di livello I²C.
Adattamento dei livelli logici I²C
Una delle parti più interessanti del circuito è rappresentata dai due convertitori di livello basati su transistor BSS138, in realtà questi sono posti all’interno del un chip IC6 SMD SOT-363 tipo 2N7002DW marcato K72 (datasheet)
![]() |
![]() |
Il bus I²C utilizza infatti due linee:
- SCL, per il clock;
- SDA, per i dati.
Nel modulo queste linee sono indicate con due nomi differenti sui due lati del circuito:
- ASCL → BSCL
- ASDA → BSDA
La lettera A identifica il lato collegato al microcontrollore, mentre la lettera B identifica il lato collegato al BME280.
Il circuito utilizza il BSS138 come level shifter bidirezionale, una configurazione molto comune nei moduli I²C.
Sul lato del microcontrollore sono presenti le resistenze di pull-up:
- R3 = 10 kΩ per ASCL;
- R4 = 10 kΩ per ASDA.
Queste resistenze collegano le due linee a VIN.
Sul lato del BME280 sono invece presenti:
- R5 = 10 kΩ per BSCL;
- R6 = 10 kΩ per BSDA.
Queste resistenze collegano le linee al livello BVCC, cioè circa 3,3 V.
Il BSS138 permette così alle linee I²C di funzionare correttamente anche quando i due lati del circuito utilizzano livelli di tensione differenti.
Questa soluzione è particolarmente utile nei moduli commerciali perché permette di collegare il sensore a microcontrollori che lavorano con una tensione superiore a quella richiesta dal BME280, senza applicare direttamente tale tensione ai pin del sensore.
Nota: il bus I²C è di tipo open-drain/open-collector. Le linee SDA e SCL non vengono normalmente portate attivamente a livello alto dai dispositivi, ma vengono riportate al livello alto tramite le resistenze di pull-up. Questa caratteristica permette al circuito con BSS138 di realizzare la conversione bidirezionale dei livelli logici.
Il sensore BME280
Il cuore del modulo è il circuito integrato IC2, cioè il BME280 (Datasheet)
![]() |
|



Il sensore viene alimentato a 3,3 V. Nello schema sono evidenziati i collegamenti:
- VDD → 3,3 V;
- VIO → 3,3 V;
- GND → massa.
Il pin VDD alimenta il circuito interno del sensore, mentre VIO definisce il livello di tensione utilizzato per l’interfaccia digitale. È quindi importante che anche VIO sia correttamente alimentato.
Il condensatore C4 da 0,1 µF, collegato tra alimentazione e massa, svolge la funzione di condensatore di disaccoppiamento direttamente a ridosso del sensore, contribuendo a mantenere stabile l’alimentazione durante il funzionamento.
Collegamento del bus I²C
Quando il BME280 viene utilizzato tramite I²C, i collegamenti principali sono:
- BSDA → SDA;
- BSCL → SCL;
- GND → massa;
- 3,3 V → alimentazione.
Il pin CSB viene utilizzato dal BME280 per la selezione dell’interfaccia. Per il funzionamento I²C deve trovarsi nello stato logico alto; il modulo è predisposto per il funzionamento I²C, mentre la configurazione SPI non viene utilizzata nel nostro progetto.
In questo modo il microcontrollore può comunicare con il BME280 attraverso le sole due linee SDA e SCL.
Selezione dell’indirizzo I²C
Un’altra caratteristica interessante del modulo è rappresentata dal collegamento del pin SDO. Questo pin consente di selezionare l’indirizzo I²C del BME280, permettendo di utilizzare due differenti indirizzi:
| SDO | Indirizzo I²C |
|---|---|
| GND | 0x76 |
| 3,3 V | 0x77 |
Sul modulo questa selezione viene effettuata mediante il piccolo interruttore S1, di tipo SPDT.
Portando S1 verso GND, il pin SDO viene posto a livello basso e l’indirizzo del sensore diventa 0x76.
Portando invece S1 verso 3,3 V, SDO viene posto a livello alto e l’indirizzo diventa 0x77.
Nota: in realtà S1 è rappresentato da tre piccole piazzole su cui occorre depositare una piccola goccia di stagno, normalmente il collegamento è fissato a massa per l’indirizzo di default è 0x76
Questa possibilità è particolarmente utile quando si desidera utilizzare due BME280 sullo stesso bus I²C: assegnando ai due sensori indirizzi differenti, entrambi possono essere collegati contemporaneamente alle stesse linee SDA e SCL.
In sintesi
Lo schema del modulo integra quindi diverse funzioni che semplificano notevolmente l’utilizzo del BME280:
- un regolatore LDO per ottenere i 3,3 V necessari al sensore;
- condensatori di filtro e disaccoppiamento;
- due BSS138 per l’adattamento dei livelli logici sulle linee I²C;
- resistenze di pull-up da 10 kΩ;
- il circuito integrato BME280;
- un selettore per impostare l’indirizzo I²C 0x76 oppure 0x77.
Grazie a questa circuiteria il modulo può essere utilizzato molto più facilmente con diverse piattaforme hardware, tra cui Arduino, ESP32, ESP8266 e Raspberry Pi, senza dover realizzare separatamente il circuito di alimentazione e l’adattamento dei livelli logici.
Nel nostro progetto utilizzeremo il modulo attraverso l’interfaccia I²C, lasciando quindi al microcontrollore il compito di configurare il BME280 e leggere i valori di temperatura e pressione forniti dal sensore.
Dove trovare il modulo BME280
Il sensore BME280 può essere acquistato anche presso il sito FUTURA ELETTRONICA, il codice prodotto è 1606-GY-BME280.
Gli abbonati alla rivista riceveranno uno sconto del 10% sul costo del sensore.

Il sensore BME280 potrà essere acquistato anche presso il sito Homotix, codice HMT280GY5
inserendo il codice di sconto “ADRIROBOT” dedicato agli utenti del sito adrirobot questi usufruiranno di uno sconto3%.
Altra possibilità è presso il sito TechMaker codice SKU: SE482816.
Inserire nel carrello il codice sconto “ADRIROBOT” per ottenere uno sconto del 3%.
Lettura valori su display OLED
Per mostrare i dati rilevati dal sensore utilizzeremo un scheda ESP23-C3 supermini, i dati saranno mostrati su un display OLED 0.96″ 128×64 – SSD1306 .
Per interfacciare il modulo, il display utilizzeremo l’interfaccia seriale I2C che richiede solo due pin di dati. Sia il sensore che il display utilizzano la line I2C, ma avendo due indirizzi diversi non ci sono problemi.
Per altri tipi di display vedere l’articolo Panoramica display LCD, TFT, OLED.
Materiale necessario
Scheda ESP32-C3 Supermini |
Breadboard |
Sensore BME280 |
|
cavi per breadboard forma di U senza saldatura |
Schema dei collegamenti
Sotto è riportato lo schema dei collegamenti


Librerie utilizzate
Libreria Adafruit BME280
Per semplificare la gestione del BME280 possiamo utilizzare la libreria Adafruit BME280 Library, disponibile direttamente attraverso il Gestore Librerie dell’IDE Arduino.
Per installarla è sufficiente aprire Gestore Librerie, cercare Adafruit BME280 e selezionare la libreria sviluppata da Adafruit.
Nella versione utilizzata per questo progetto è disponibile la versione 2.3.0.

La libreria richiede inoltre alcune librerie di supporto, in particolare Adafruit BusIO e Adafruit Unified Sensor. Come mostrato nella finestra di installazione dell’IDE Arduino, è quindi consigliabile selezionare “INSTALLA TUTTO”, in modo da installare automaticamente anche tutte le dipendenze necessarie.

Una volta completata l’installazione, sarà possibile includere nello sketch la libreria con:
#include <adafruit_bme280.h>
Libreria per la gestione del display OLED
Per gestire il display OLED SSD1306 da 0,96″ con risoluzione 128×64 pixel utilizzeremo la libreria Adafruit SSD1306, disponibile direttamente attraverso il Gestore Librerie dell’IDE Arduino.
Per installarla è sufficiente aprire il Gestore Librerie, cercare Adafruit SSD1306 e selezionare la libreria sviluppata da Adafruit.
Nel progetto utilizzato per questo articolo è installata la versione 2.5.17, come mostrato nella schermata.

La libreria è specificamente progettata per controllare display OLED monocromatici basati sul controller SSD1306 e supporta, tra le altre, le risoluzioni 128×64 e 128×32 pixel.
Per utilizzare la libreria nello sketch è sufficiente inserire:
#include <adafruit_ssd1306.h>
La Adafruit SSD1306 Library utilizza inoltre le funzionalità grafiche fornite dalla libreria Adafruit GFX, che deve essere installata insieme alle relative dipendenze qualora non sia già presente nell’IDE Arduino.
Nel nostro progetto la libreria verrà utilizzata per inizializzare il display OLED tramite l’interfaccia I²C e visualizzare i dati rilevati dal BME280, in particolare temperatura, pressione atmosferica e altitudine calcolata.
Vedete anche l’articolo Arduino – Tutorial, come installare una libreria
Gestione del modulo da parte dell’IDE
Installazione del pacchetto EPS32
Se non abbiamo mai utilizzato un modulo ESP32, per prima cosa abbiamo bisogno del pacchetto ESP32 nell’IDE di Arduino.
Quindi si dovrà aprire l’IDE di Arduino e andare su File -> Preferenze.
E immettere il seguente indirizzo nelle impostazioni predefinite:
https://espressif.github.io/arduino-esp32/package_esp32_index.json
Quindi confermare poi con OK .
Ora si vai su Strumenti -> GESTORE SCHEDE e si cercherà “ESP32”
Nota: attualmente è disponibile la versione 3.3.11

Una volta installato il pacchetto, i modelli ESP32 saranno disponibili nell’IDE di Arduino.
Impostazione corretta della scheda
Per caricare il proprio sketch occorre selezionare la nostra scheda.
Per cui si andrà sotto “Gestore Schede“, “esp32” e si sceglierà “ESP32C3 Dev Module”

si dovrà anche verificare la sua impostazione. Il mio consiglio è di modificare due impostazioni
- “USB CDC On Boot” ponendola su “Enabled“
- “Erase All Flash Before Sketch Upload” ponendola su “Enabled“

A questo punto si potrà collegare la scheda e quando il SO riconoscerà la scheda si verificherà su quale porta è stata collegata, nel nostro caso su “COM4“.


Ora la scheda è pronta per essere utilizzata.
Sketch utilizzato
Lo sketch utilizza il sensore BME280 per rilevare i principali parametri ambientali: temperatura, umidità relativa e pressione atmosferica. Il sensore comunica con l’ESP32-C3 SuperMini tramite il bus I²C, utilizzando i pin GPIO 8 e GPIO 9 configurati rispettivamente come SDA e SCL.
All’avvio vengono inizializzati il display OLED SSD1306 e il sensore BME280. Il programma verifica la corretta presenza dei due dispositivi e, in caso di mancata comunicazione con il sensore, visualizza un messaggio di errore sul display interrompendo l’esecuzione.§
Nel ciclo principale vengono effettuate le letture dei valori ambientali, che vengono visualizzati sul display OLED e contemporaneamente inviati al Monitor Seriale.
Oltre ai tre parametri principali, viene calcolata anche un’indicazione dell’altitudine, utilizzando come riferimento una pressione atmosferica standard di 1013,25 hPa.
Il BME280 non richiede una taratura manuale per il normale utilizzo, poiché dispone di coefficienti di calibrazione memorizzati dal produttore, utilizzati automaticamente dalla libreria. Per questo progetto non è stata quindi prevista alcuna procedura di calibrazione aggiuntiva.
È tuttavia importante ricordare che il valore dell’altitudine può essere reso più preciso impostando la pressione atmosferica locale al livello del mare anziché utilizzare il valore standard.
#include <wire.h>
//#include <adafruit_sensor.h>
#include <adafruit_bme280.h>
#include <adafruit_gfx.h>
#include <adafruit_ssd1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BME280 bme;
// Pin I2C ESP32-C3 SuperMini
#define SDA_PIN 8
#define SCL_PIN 9
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED non trovato");
while (1)
;
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
if (!bme.begin(0x76)) { // Cambiare in 0x77 se necessario
display.clearDisplay();
display.setCursor(0, 0);
display.println("BME280");
display.println("NON TROVATO");
display.display();
Serial.println("BME280 non trovato");
while (1)
;
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20, 20);
display.println("BME280");
display.display();
delay(2000);
}
void loop() {
float temperatura = bme.readTemperature();
float umidita = bme.readHumidity();
float pressione = bme.readPressure() / 100.0F;
float altitudine = bme.readAltitude(1013.25);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 0);
display.println("SENSORE BME 280");
display.setCursor(15,9);
display.println("WWW.ADRIROBOT.IT");
display.setCursor(0, 18);
display.print("Temperatura: ");
display.print(temperatura, 1);
display.print((char)247);
display.print("C");
display.setCursor(0, 30);
display.print("Umidita: ");
display.print(umidita, 1);
display.print("%");
display.setCursor(0, 42);
display.print("Press.: ");
display.print(pressione, 1);
display.print(" hPa");
display.setCursor(0, 54);
display.print("Alt: ");
display.print(altitudine, 1);
display.print(" m");
display.display();
Serial.print("T=");
Serial.print(temperatura);
Serial.print(" H=");
Serial.print(umidita);
Serial.print(" P=");
Serial.print(pressione);
Serial.print(" Alt=");
Serial.println(altitudine);
delay(2000);
}
Raccolta di sensori di temperatura e umidità
Oltre al sensore BME280, potete trovare altri modelli di sensore potete visitare la Raccolta di sensori di temperatura e umidità. Sono presenti sensori: misuratori di sola temperatura di tipo analogico o con uscita digitale, misuratori di temperatura IR, sensori di sola umidità, dispositivi che possono misurare sia la temperatura che l’umidità, altri ancora misurano anche altri parametri.











