In questo tutorial imparerai a misurare la temperatura e l’umidità relativa utilizzando il sensore Si7021 e un Arduino.
Il sensore Si7021 è una scelta molto diffusa per misurare temperatura e umidità nei progetti fai-da-te. È un sensore affidabile e preciso che comunica tramite I2C, rendendolo facile da integrare con microcontrollori come Arduino ed ESP32. Grazie all’ampio intervallo operativo e al basso consumo energetico, il Si7021 è adatto a molte applicazioni, tra cui stazioni meteo, dispositivi smart home e sistemi di monitoraggio ambientale. Le sue dimensioni compatte e l’interfaccia semplice lo rendono ideale sia per principianti che per maker esperti che vogliono aggiungere funzionalità di rilevamento ambientale ai propri progetti.
Iniziamo con i componenti necessari.
Componenti necessari
Ovviamente, ti servirà un sensore di temperatura e umidità Si7021. Di solito non si acquista il sensore grezzo, ma una breakout board che include alcuni componenti aggiuntivi per facilitare il collegamento del sensore.
Inoltre, avrai bisogno di un microcontrollore. Io ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino o anche un ESP32/ESP8266 andrà benissimo.
Infine, vogliamo visualizzare i dati di temperatura e umidità rilevati. Io ho scelto un OLED, ma puoi anche optare per un LCD display .

Sensore di Temperatura & Umidità Si7021

Arduino Uno

Cavo USB per Arduino UNO

Set di cavi Dupont

Breadboard

Display OLED
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.
Il sensore di Temperatura & Umidità Si7021
Il Si7021 è un sensore di temperatura e umidità molto piccolo, a basso consumo, con elettronica integrata. È calibrato in fabbrica per misurazioni accurate e comunica tramite interfaccia I2C. L’immagine qui sotto mostra il diagramma a blocchi funzionale del Si7021:

Come puoi vedere, contiene gli elementi sensibili per umidità e temperatura, un convertitore analogico-digitale (ADC), la logica di controllo con memoria per i fattori di calibrazione e l’elettronica per l’interfaccia I2C.
Specifiche tecniche
L’elemento sensore di temperatura del Si7021 può misurare temperature da –10 a 85 °C con una precisione di ±0,4 °C. Il sensore di umidità misura l’umidità relativa da 0 a 80% RH con una precisione di ±3% RH.
Il sensore funziona da 1,9 a 3,6 V e il consumo durante il funzionamento è di 150μA (60nA in modalità standby).
Una caratteristica unica del sensore è l’elemento riscaldante integrato, che può essere usato per aumentare la temperatura del sensore e rimuovere la condensa, oppure per misurare il punto di rugiada. Nota che attivando il riscaldatore il consumo sale fino a 94,20mA (a 3,3V). Per maggiori dettagli consulta il datasheet:
Circuito applicativo tipico
Per utilizzare il Si7021 in una vera applicazione, di solito è necessario aggiungere delle resistenze di pull-up per l’interfaccia I2C e un condensatore per stabilizzare l’alimentazione. L’immagine qui sotto mostra il circuito applicativo tipico:

Nella maggior parte dei casi, però, conviene usare una breakout board che ha già questi componenti integrati.
Breakout board per SI7021
L’immagine qui sotto mostra una tipica breakout board per il SI7021. Include le resistenze di pull-up menzionate e un regolatore di tensione, che permette di alimentare la scheda sia a 3,3V che a 5V.

Nota che molte breakout board sono etichettate come “SI7021” ma in realtà contengono un sensore diverso, anche se simile. Nell’esempio sopra, puoi vedere la scritta “SI7021” sulla scheda e le etichette “HTU21” e “SHT21” subito sotto il sensore.
Il SI7021, HTU21 e SHT21 sono intercambiabili per quanto riguarda specifiche e protocolli di comunicazione e hanno anche lo stesso indirizzo I2C ( 0x40 ). Tuttavia, memorizzano i numeri di serie in un formato diverso, il che causa un piccolo problema quando si usano le librerie Adafruit_Si7021 o SparkFun_Si7021 . Ne parleremo più avanti.
Infine, nota che SHT21, HTU21 e Si7021 sono disponibili con o senza una membrana protettiva in PTFE sopra l’elemento sensibile. Vedi l’immagine seguente per i due tipi:

Collegare il Si7021 ad Arduino
Grazie all’interfaccia I2C, collegare il sensore Si7021 ad Arduino è molto semplice. Prima collega i pin SCL e SDA della breakout board Si7021 ai corrispondenti pin sulla scheda Arduino come mostrato sotto. Poi collega il ground e il VIN.

La breakout board funziona sia a 5V che a 3,3V e puoi usare uno dei due per il VIN. Nel collegamento sopra, sto usando 3,3V per il VIN.
Ora scriviamo un po’ di codice semplice per testare il funzionamento del sensore Si7021.
Codice per leggere i dati dal Si7021
Prima di poter leggere i dati di temperatura e umidità dal sensore Si7021, dobbiamo installare una libreria. Due scelte comuni sono Adafruit_Si7021 o SparkFun_Si7021 . Io userò la libreria Adafruit_Si7021 .
Apri il Library Manager, cerca “Si7021” e install la libreria Adafruit_Si7021 come mostrato sotto.

Ora possiamo scrivere un semplice codice di test. Iniziamo includendo la libreria Adafruit_Si7021 e creando l’oggetto sensore. Nella funzione setup() inizializziamo il sensore tramite sensor.begin() , e nella funzione loop leggiamo e stampiamo i valori di umidità e temperatura.
#include "Adafruit_Si7021.h"
Adafruit_Si7021 sensor = Adafruit_Si7021();
void setup() {
Serial.begin(9600);
sensor.begin();
}
void loop() {
Serial.print("Hum:");
Serial.println(sensor.readHumidity(), 2);
Serial.print("Temp:");
Serial.println(sensor.readTemperature(), 2);
delay(1000);
}
Se carichi ed esegui questo codice dovresti vedere il seguente output sul Serial Monitor. Assicurati che il baud rate sia impostato correttamente a 9600 baud.

Puoi anche aprire il Serial Plotter e soffiare sul sensore. Dovresti vedere un aumento dell’umidità e della temperatura rilevate. Nell’immagine sotto la linea blu mostra l’umidità che arriva al 100% e un leggero aumento della temperatura (linea rossa).

Se il sensore non funziona, assicurati che sia collegato correttamente e che venga rilevato come dispositivo I2C. Puoi verificarlo eseguendo uno scanner I2C.
#include "I2CScanner.h"
I2CScanner scanner;
void setup() {
Serial.begin(9600);
while (!Serial) {};
scanner.Init();
}
void loop() {
scanner.Scan();
delay(5000);
}
Se carichi ed esegui il codice sopra dovrebbe stampare il seguente output sul Serial Monitor
--- Scan started --- I2C device found at address 0x40 !
dove 0x40 è l’indirizzo I2C predefinito del sensore Si7021. Se non lo vedi, o i collegamenti non sono corretti, o il sensore è guasto, oppure ha un indirizzo I2C diverso (cosa che non dovrebbe succedere).
Did not find Si7021 sensor
Se provi a eseguire il codice di esempio si7021.ino che trovi nella libreria Adafruit_Si7021 , potresti vedere il messaggio di errore “Did not find Si7021 sensor!”. L’errore è generato dal seguente pezzo di codice nella funzione setup() :
void setup() {
...
if (!sensor.begin()) {
Serial.println("Did not find Si7021 sensor!");
while (true)
;
}
...
}
Vedrai questo messaggio anche se lo scanner I2C conferma che il sensore Si7021 è rilevato all’indirizzo 0x40 e in realtà funziona correttamente.
Ho analizzato meglio l’inizializzazione code del sensore e l’errore è causato dalla chiamata della funzione _readRegister8() nel codice qui sotto.
bool Adafruit_Si7021::begin() {
if (!i2c_dev->begin())
return false;
reset();
if (_readRegister8(SI7021_READRHT_REG_CMD) != 0x3A)
return false;
readSerialNumber();
_readRevision();
return true;
}
Il motivo è che molte breakout board etichettate “Si7021” in realtà usano un sensore SHT21 o HTU21. Questi sensori sono simili al Si7021 ma apparentemente memorizzano il numero di serie in un formato/indirizzo diverso, causando questo errore.
Il modo più semplice per aggirare il problema è chiamare la funzione begin() ma ignorare il valore di ritorno, come ho fatto nell’esempio sopra. Il sensore e il resto del codice funzionano perfettamente, ma non potrai stampare il numero di serie o la versione del sensore.
Ho provato anche la libreria SparkFun_Si7021 e ha lo stesso problema. Se non vuoi usare nessuna di queste due librerie e vuoi risolvere il problema, puoi implementare la funzionalità da solo. Non è difficile. Il post sul blog Bare Si7021 temperature/relative humidity sensor mostra come fare.
Per un’applicazione pratica, probabilmente vorrai mostrare i dati di temperatura e umidità su un display invece che stamparli sul Serial Monitor. È proprio quello che faremo nella prossima sezione: aggiungeremo un OLED e mostreremo lì i dati del sensore.
Aggiungere un OLED per visualizzare i dati del Si7021
Poiché anche l’OLED è un dispositivo I2C, il collegamento è semplice. Basta collegare SDA e SCL agli stessi pin a cui è collegato il sensore Si7021. Poiché l’OLED funziona a 3,3V, possiamo condividere anche le linee di alimentazione. L’immagine sotto mostra il collegamento completo.

Se hai difficoltà con l’OLED, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . L’immagine sotto mostra il collegamento completo su una breadboard reale:

Codice per visualizzare i dati del Si7021 su OLED
In questa sezione scriviamo il codice per mostrare su uno schermo OLED la temperatura e l’umidità rilevate dal sensore Si7021. Per scrivere sull’OLED useremo la libreria Adafruit_SSD1306 . Puoi install it via the Library Manager come al solito:

Il codice qui sotto legge le misurazioni dal sensore Si7021 e visualizza i valori di temperatura e umidità sull’OLED. Dai un’occhiata al codice completo, poi vediamo i dettagli.
#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"
Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void centered(const char* text, int y) {
int16_t x1, y1;
uint16_t w, h;
oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
oled.setCursor(64 - w / 2, y);
oled.print(text);
}
void display() {
static char text[30];
float temp = sensor.readTemperature();
float hum = sensor.readHumidity();
oled.clearDisplay();
sprintf(text, "%.1f c", temp);
centered(text, 12);
sprintf(text, "%.1f %%", hum);
centered(text, 38);
oled.display();
}
void setup() {
oled_init();
sensor.begin();
}
void loop() {
display();
delay(1000);
}
Librerie e inizializzazione del display
Iniziamo includendo le librerie necessarie per il sensore Si7021 e per il display OLED Adafruit SSD1306. Poi inizializziamo il display OLED nella funzione oled_init() . Questa funzione configura il display, lo pulisce, imposta la dimensione e il colore del testo.
#include "Adafruit_Si7021.h"
#include "Adafruit_SSD1306.h"
Adafruit_Si7021 sensor = Adafruit_Si7021();
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Nota che l’indirizzo I2C del display OLED è impostato a 0x3C in oled.begin() . La maggior parte di questi piccoli OLED usa questo indirizzo, ma il tuo potrebbe essere diverso. Se non vedi nulla sull’OLED, probabilmente ha un indirizzo I2C diverso e dovrai cambiare l’indirizzo passato a oled.begin() . Se non conosci l’indirizzo I2C, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino .
Funzioni di visualizzazione
La funzione centered() viene usata per stampare il testo centrato sul display OLED a una coordinata y specifica. La funzione display() legge i dati di temperatura e umidità dal sensore e li mostra sullo schermo OLED.
void centered(const char* text, int y) {
// Function to center text on OLED
}
void display() {
// Function to display temperature and humidity on OLED
}
Funzione setup
Nella funzione setup() inizializziamo la comunicazione seriale per il debug, il display OLED e avviamo la comunicazione con il sensore Si7021. Come detto prima, se il sensore Si7021 non viene rilevato, controlla i collegamenti, l’indirizzo I2C e ignora il valore di ritorno di sensor.begin() .
void setup() {
oled_init();
sensor.begin();
}
Funzione loop
La funzione loop() richiama continuamente la funzione display() per aggiornare e visualizzare i valori sullo schermo OLED. Poi attende 1 secondo (1000ms) prima del prossimo aggiornamento.
void loop() {
display();
delay(1000);
}
Output su OLED
Se carichi ed esegui il codice, dovresti vedere la temperatura in gradi Celsius e l’umidità relativa in percentuale visualizzate sull’OLED.

Ed ecco pronto un bel sensore ambientale compatto!
Conclusioni
In questo tutorial hai imparato a usare il sensore di temperatura e umidità Si7021, un OLED e un Arduino Uno per costruire un sensore ambientale.
Poiché il Si7021 ha una modalità a basso consumo e funziona a 3,3V, è adatto anche per realizzare un sensore ambientale alimentato a batteria usando un ESP32. Dai un’occhiata al Simple ESP32 Internet Weather Station , dove ad esempio usiamo un ESP32 alimentato a batteria. Se vuoi ridurre ancora di più i consumi, ti consiglio un display e-Paper invece di un OLED. Il tutorial Weather Station on e-Paper Display potrebbe esserti utile.
Nota che esistono moltissimi altri sensori di temperatura (e umidità) che puoi usare. Ecco una lista di tutorial in cui utilizziamo alcuni di questi sensori.
- DHT11/DHT22 Sensor with Arduino Tutorial (2 Examples)
- Interfacing Arduino To An NTC Sensor
- AM2320 I2C Temperature and Humidity Sensor Arduino …
- LM35 Temperature Sensor Arduino Tutorial (3 Examples)
- DS18B20 Temperature Sensor Arduino Tutorial (4 Examples)
- TMP36 Temperature Sensor Arduino Tutorial (2 Examples)
- How To Use BME280 Pressure Sensor With Arduino
Il più simile, per consumo, facilità d’uso e precisione, è probabilmente il sensore BME280 . C’è un ottimo comparison of Temperature/Humidity sensors , che vale la pena leggere.
Infine, se preferisci l’ESP32 all’Arduino, dai un’occhiata ai seguenti tutorial.
- Interfacing ESP32 And LM35 Temperature Sensor
- Interfacing ESP32 And DS18B20 Digital 1-wire Thermometer
- Interfacing ESP32 And LM35 Temperature Sensor
Spero ti sia divertito a costruire e sperimentare con questo progetto. Se hai domande, sentiti libero di scrivere nei commenti.
Buon divertimento con l’elettronica ; )

