Stazione ambientale ESP32: BME280 e display OLED via I2C
Nel tutorial precedente abbiamo acceso un LED e preso confidenza con PlatformIO. Ora facciamo il passo successivo: leggere un sensore ambientale reale via I2C (il BME280, che misura temperatura, umidità e pressione) e mostrare i dati su un piccolo display OLED, senza bisogno del cavo USB o del Serial Monitor per vedere i risultati.
Cosa ti serve
- Una dev board ESP32 (va bene qualunque variante: ESP32, ESP32-S3, ESP32-C6)
- Modulo sensore BME280 (breakout I2C, es. GY-BME280)
- Display OLED SSD1306 128×64 I2C (0.96″)
- Breadboard e jumper wires
Cos’è il bus I2C
I2C è un bus seriale a 2 fili che permette di collegare più periferiche sugli stessi due pin: SDA (dati) e SCL (clock). Ogni dispositivo sul bus ha un indirizzo univoco (es. il BME280 di solito risponde a 0x76 o 0x77, l’SSD1306 di solito a 0x3C). È il motivo per cui possiamo collegare sensore e display sugli stessi due pin senza conflitti.
| Segnale | ESP32 (DevKitC) | ESP32-S3 | ESP32-C6 |
|---|---|---|---|
| SDA | GPIO21 | GPIO8 (default) | GPIO6 (default) |
| SCL | GPIO22 | GPIO9 (default) | GPIO7 (default) |
I pin di default variano tra le varianti: verifica sempre il pinout della tua specifica dev board, oppure imposta i pin esplicitamente in codice con Wire.begin(SDA, SCL) come faremo qui sotto.
Collegamento
- BME280 VCC → 3.3V, GND → GND, SDA → SDA, SCL → SCL
- SSD1306 VCC → 3.3V, GND → GND, SDA → SDA, SCL → SCL (in parallelo al BME280, stesso bus)
Librerie necessarie
Nel file platformio.ini del progetto, aggiungi:
lib_deps =
adafruit/Adafruit BME280 Library@^2.2.4
adafruit/Adafruit SSD1306@^2.5.13
adafruit/Adafruit GFX Library@^1.11.10
adafruit/Adafruit BusIO@^1.16.1
Il codice
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SDA_PIN 21
#define SCL_PIN 22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
#define BME_ADDR 0x76
Adafruit_BME280 bme;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
if (!bme.begin(BME_ADDR, &Wire)) {
Serial.println("BME280 non trovato, controlla i collegamenti");
while (1) delay(10);
}
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("Display OLED non trovato");
while (1) delay(10);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
}
void loop() {
float temp = bme.readTemperature();
float hum = bme.readHumidity();
float pres = bme.readPressure() / 100.0F;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Stazione ambientale");
display.setTextSize(2);
display.setCursor(0, 16);
display.printf("%.1f C\n", temp);
display.setTextSize(1);
display.setCursor(0, 40);
display.printf("Umidita: %.1f %%\n", hum);
display.printf("Pressione: %.0f hPa", pres);
display.display();
Serial.printf("T=%.1fC H=%.1f%% P=%.0fhPa\n", temp, hum, pres);
delay(2000);
}
Come funziona
Wire.begin(SDA_PIN, SCL_PIN)inizializza il bus I2C sui pin specificati — importante impostarlo esplicitamente perché i default cambiano tra le varianti ESP32bme.begin(BME_ADDR, &Wire)inizializza il sensore all’indirizzo indicato; se il tuo modulo non risponde, prova0x77invece di0x76(dipende dal collegamento del pin SDO sul modulo)readTemperature(),readHumidity(),readPressure()restituiscono le letture correnti del sensore- Il display viene ridisegnato ogni 2 secondi con
clearDisplay()+display(): questo pattern (cancella, disegna, mostra) è lo standard per qualunque display grafico
Non trovi i dispositivi sul bus?
Se sensore o display non rispondono, il problema più comune è l’indirizzo I2C sbagliato. Puoi fare uno scan del bus con un piccolo sketch dedicato (I2C scanner) che stamperà tutti gli indirizzi trovati — utile da tenere sempre a portata di mano quando si aggiungono nuovi moduli I2C.
Va oltre
Ora hai una mini stazione ambientale autonoma con display locale. Nel prossimo tutorial del percorso colleghiamo l’ESP32 al Wi-Fi e inviamo queste misure via MQTT verso Home Assistant, per costruire uno storico e delle automazioni.
