Stazione ambientale ESP32: BME280 e display OLED via I2C

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 ESP32
  • bme.begin(BME_ADDR, &Wire) inizializza il sensore all’indirizzo indicato; se il tuo modulo non risponde, prova 0x77 invece di 0x76 (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.

Imprenditore, maker, MBSE enthusiast e co-autore di Web App Portal. Collegati su LinkedIn.