L’HTU21D è un sensore digitale di temperatura e umidità relativa. Un componente molto diffuso nei progetti di elettronica e IoT grazie alla sua precisione, alle dimensioni compatte e alla semplicità di integrazione tramite interfaccia I²C. In questo post vedremo nel dettaglio cos’è, come funziona e come utilizzarlo tramite una scheda breakout.

Indice
Descrizione del sensore HTU21D
L’HTU21D (datasheet) è un sensore digitale di temperatura e umidità relativa, prodotto originariamente da Measurement Specialties (ora parte di TE Connectivity).
È progettato per applicazioni che richiedono misure affidabili e a basso consumo, come stazioni meteo, sistemi domotici, dispositivi IoT e data logger ambientali.
Il sensore integra al suo interno sia l’elemento sensibile sia l’elettronica di conversione analogico-digitale, fornendo i dati direttamente in formato digitale tramite bus I²C

HTU21D VS Si7021
Oltre al sensore HTU21D è possibile trovare il sensore Si7021, entrambi sono sensori di temperatura e umidità I2C quasi identici, con spesso compatibilità di footprint (impronta sulla scheda).
Entrambi offrono alta precisione (0-80% RH, da -10 a 85°C) e comunicazione digitale.
HTU21D risponde più velocemente (~3s), ideale per misurazioni rapide, mentre Si7021 potrebbe mostrare una isteresi maggiore ma è considerato affidabile.
Funzionamento interno del sensore HTU21D
Il sensore integra due sistemi distinti in un unico chip:
- Sensore di umidità capacitivo
- Sensore di temperatura band-gap
Il tutto gestito da un microcontrollore interno con ADC.

Misura dell’umidità (principio capacitivo)
Il cuore della misura dell’umidità è un condensatore microscopico (MEMS).
Questo è composto da:
- due elettrodi
- un materiale polimerico igroscopico (assorbe acqua)
Come funziona ?
- L’umidità dell’aria cambia
- Il polimero assorbe o rilascia molecole d’acqua
- Cambia la costante dielettrica del materiale
- Cambia la capacità elettrica
In pratica: Più umidità → più acqua nel materiale → capacità maggiore
Conversione del segnale
La capacità non viene letta direttamente: il sensore usa un circuito interno che:
- converte la capacità in una frequenza o tensione
- la invia a un ADC (convertitore analogico-digitale)
- produce un valore digitale
Misura della temperatura
La temperatura viene misurata con un sensore band-gap, che è un circuito elettronico che sfrutta la variazione della tensione nei semiconduttori in funzione della temperatura.
Il vantaggi sono che è molto stabile, è già calibrato in fabbrica e ed a basso consumo
Elaborazione interna
Il sensore non restituisce valori “grezzi”, ma si occupa internamente dei eseguire la conversione.
Tra le altre cose effettua una compensazione termica dell’umidità, effettua la linearizzazione del segnale
utilizzando la calibrazione di fabbrica (memorizzata in ROM).
Comunicazione I²C
Quando il tuo microcontrollore (es. ESP32-C3 SuperMini) richiede una misura sono eseguiti questi passi:
- Invii comando I²C (misura temperatura o umidità)
- Il sensore esegue la conversione (~50 ms)
- Restituisce: 2 byte di dati + CRC (controllo errore)
Conversione nei valori reali
Il valore restituito NON è direttamente in °C o %, serve una formula (già applicata dalle librerie):

Fattori che influenzano la misura
Per un uso corretto, occorre considerare che :
🌬️ Condizioni ambientali: aria ferma → risposta lenta, condensa → errore elevato
🔥 Temperatura: influisce direttamente sull’umidità relativa
🧪 Contaminazione: polvere o sostanze chimiche → degrado del polimero
Precisione di misura
Il sensore HTU21D è in grado di misurare l’umidità relativa su un intervallo completo da 0 a 100% con una precisione tipica di ±2% nell’intervallo dal 5% al 95% di umidità relativa.
Il termometro ha un intervallo di temperatura massimo compreso tra -40 e 125 °C. La sua precisione tipica è di ±0,3 °C nell’intervallo da 0 a 70 °C.
Nella sua modalità normale per la misurazione di umidità e temperatura, il sensore ha una risoluzione di 0,7% UR e 0,040 °C con tempi di conversione rispettivamente di 2 ms e 11 ms.
Per esigenze più stringenti, il sensore consente di aumentare la risoluzione a scapito di un maggiore tempo di conversione.
In modalità di massima risoluzione, l’HTU21D può fornire una risoluzione di 0,04% UR con un tempo di conversione di 14 ms e di 0,01 °C con un tempo di conversione di 44 ms
Schema elettrico del modulo HTU21D
Lo schema del modulo breakout è stato realizzato in origine dalla ADAFRUIT azienda leader nel settore dell’elettronica open source e del movimento “maker”.
Come visibile mostra il design di una breakout board (un modulo pronto all’uso) per il sensore HTU21D. Il circuito è progettato per rendere il sensore “tollerante” a diverse tensioni, permettendogli di funzionare sia con microcontrollori a 3.3V che a 5V.

![]() | ![]() |
Ecco l’analisi dei blocchi principali:
Regolatore di Tensione (U2)
Il sensore HTU21D lavora nativamente tra 1.5V e 3.6V. Per alimentarlo anche a 5V è presente un MIC5225-3.3 (Regolatore LDO), in ingresso possiamo fornire i +5V (dal pin VIN) che saranno stabilizzati a +3.3V per alimentare il sensore e il resto del circuito. C2 e C3 (10μF) sono condensatori di filtro per stabilizzare la tensione in entrata e in uscita, riducendo i disturbi elettrici.
Il Sensore (U1)
Il sensore HTU21D, è il cuore del modulo, un sensore digitale che misura umidità relativa e temperatura. Comunica tramite protocollo I2C (SDA e SCL).
C1 (0.1μF) è un piccolo condensatore di bypass posto vicino ai pin di alimentazione del sensore per filtrare i rumori ad alta frequenza.
Convertitore di Livelli Logici (Q1, Q2)
Questa è la parte più interessante: permette al sensore (che parla a 3.3V) di dialogare con una scheda a 5V (come un Arduino Uno) senza bruciarsi. Il convertitore è formato da due MOSFET BSS138 (Q1 e Q2) e quattro resistenze da 10kΩ (R1, R2, R3, R4).
Si tratta di un traslatore di livello bidirezionale. Le resistenze di “pull-up” tengono le linee alte, mentre i MOSFET permettono ai segnali SDA e SCL di passare da 3.3V a 5.0V (e viceversa) in modo sicuro.
Connettore di Interfaccia (JP1)
È la morsettiera fisica dove si collegano i cavi:
- +5V / +3V3: Pin di alimentazione.
- GND: Massa comune.
- SDA / SCL: Linee dati e clock per la comunicazione I2C.
Comparazione con vari tipi di moduli
Il sensore HTU21D si può trovare su varie tipologie di moduli breakout, sotto alcuni esempi
![]() | ![]() | ![]() |
NOTA: su alcuni moduli, sulla scheda breakout sono presenti due resistori da 4,7 kΩ che portano a livello alto le linee SDA e SCL. Se sono presenti altri dispositivi sul bus I²C, potrebbe essere necessario disabilitare i resistori integrati. Per fare ciò, è necessario scollegare il ponticello di saldatura sulla scheda.
In questo modo i resistori verranno scollegati da VCC e dal bus I2C.
Dove trovare il modulo HTU21D
Il sensore HTU21DF potrà essere acquistato online presso:
![]() | ![]() |
![]() | ![]() |
Test base per la lettura del sensore HTU21D
Vediamo ora come leggere il sensore HTU21D con l’utilizzo di un ESP32-C3 Super Mini.
Materiale occorrente
![]() | ![]() |
| Scheda ESP32-C3 Super Mini | Sensore HTU21DF |
![]() | ![]() |
| Bread board | Cavi colorati M/M |
Schema dei collegamenti

Nota: in alternativa alla scheda ESP32-C3 Super Mini si può utilizzare alche una scheda Arduino UNO, in questo caso i collegamenti sono quelli riportati sotto

Libreria di gestione per sensore HTU21D
L’utilizzo del sensore HTU21D con un ESP32-C3 Super Mini è molto semplice grazie alla specifica libreria.
Questa è valida anche se lo collegherete ad una scheda Arduino UNO.


Codice di base per lettura dati del sensore
Sotto è riportato il codice base per la lettura dei dati tramite il monitor seriale. L’output dovrebbe essere simile a quello visibile in figura

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <Wire.h> #include "Adafruit_HTU21DF.h" // Collegare Vin a 3-5 V CC // Collegare GND a massa // Collegare SCL al pin clock I2C (A5 su UNO - GPIO8/SDA su ESP32C3) // Collegare SDA al pin dati I2C (A4 su UNO - GPIO9/SCL su ESP32C3) // Definiamo i pin I2C per l'ESP32-C3 SuperMini #define I2C_SDA 8 #define I2C_SCL 9 Adafruit_HTU21DF htu = Adafruit_HTU21DF(); void setup() { Serial.begin(115200); delay(1000); // Piccolo delay per stabilizzare la seriale Serial.println("HTU21DF Test"); // Inizializziamo I2C con i pin specifici del SuperMini if (!Wire.begin(I2C_SDA, I2C_SCL)) { Serial.println("Errore nell'inizializzazione del bus I2C!"); while (1); } if (!htu.begin()) { Serial.println("Sensore HTU21DF non trovato! Controlla i cablaggi."); while (1); } } void loop() { float temp = htu.readTemperature(); float rel_hum = htu.readHumidity(); Serial.print("Temperatura: "); Serial.print(temp); Serial.print(" °C\t"); Serial.print("Umidità: "); Serial.print(rel_hum); Serial.println(" %"); delay(2000); } |
Lettura dei dati su display OLED
Vediamo ora un’esempio più completo, i dati saranno mostrati su un display OLED, connesso anche questo tramite il bus I2C.
Per maggiori informazioni sul display OLED 0.96″ 128×64 – SSD1306 utilizzato e come fare per utilizzarlo leggete il post Display OLED 0.96″ 128×64 – SSD1306.
Materiale occorrente
![]() | ![]() |
| Scheda ESP32-C3 Super Mini | Sensore HTU21DF |
![]() | ![]() |
| OLED da 0.96 ” 128×64 pixel | Bread board |
![]() | |
| Cavi colorati M/M |
Schema dei collegamenti


Libreria di gestione per il display OLED
Per utilizzare il display OLED è necessario installare l’apposita libreria. Può essere cercata tra le librerie installabili nell’IDE, basterà inserire nel campo di ricerca “Adafruit_SSD1306“.
Sarà anche mostrata una finestra che segnala che la libreria ha una dipendenza con la libreria grafica “Adafruit GFX Library“. Procedete premendo su “Install all”.
Per altre informazioni su come installare le librerie vedete l’articolo Arduino – Tutorial, come installare una libreria
Codice di base per lettura dati del sensore su display OLED
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <Wire.h> #include <Adafruit_HTU21DF.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define SDA_PIN 8 #define SCL_PIN 9 Adafruit_HTU21DF htu = Adafruit_HTU21DF(); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { Serial.begin(115200); Wire.begin(SDA_PIN, SCL_PIN); if (!htu.begin()) { Serial.println("Errore sensore HTU21D!"); while (1); } if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("Errore OLED"); while (1); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); } void loop() { float temperature = htu.readTemperature(); float humidity = htu.readHumidity(); display.clearDisplay(); display.setCursor(0, 0); display.println("HTU21D Sensor"); display.println("----------------"); display.print("Temp: "); display.print(temperature, 1); display.println(" C"); display.print("Hum: "); display.print(humidity, 1); display.println(" %"); display.display(); delay(2000); } |
Lettura dei dati su smartphone o PC desktop
Un altro esempio: oltre alla visualizzazione su display, i dati potranno essere consultati tramite un’interfaccia web moderna e professionale, dotata di:
- Layout responsive (ottimizzato per smartphone e PC).
- Design “card” in stile dashboard.
- Aggiornamento automatico ogni 10 secondi, senza ricaricare la pagina (tecnica AJAX/Fetch).
- Architettura disaccoppiata: separazione tra backend (API JSON) e frontend, per un approccio più pulito e scalabile.
Per implementare queste funzionalità, è necessario includere due librerie standard già integrate nell’ambiente di sviluppo:
| 1 2 | #include <WiFi.h> #include <WebServer.h> |
Come visualizzare i dati sullo smartphone
- Dopo aver effettuato il download del codice, dovrete aprire il monitor seriale, in questo modi vi verrà mostrato l’indirizzo IP a cui collegarvi.

- Collegare lo smartphone alla stessa rete Wi-Fi dell’ESP32-C3 Super Mini
- Aprite il browser
- Digitate l’indirizzo IP mostrato nel terminale (es.
192.168.1.190) - Vedrete la temperatura e umidità in tempo reale

Codice per lettura dati del sensore su Smartphone
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | #include <Wire.h> #include <WiFi.h> #include <WebServer.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_HTU21DF.h> /* ========================= CONFIGURAZIONE WIFI ========================= */ const char* ssid = "TUO_WIFI"; const char* password = "TUA_PASSWORD"; /* ========================= OLED SSD1306 ========================= */ #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); /* ========================= SENSORE HTU21D ========================= */ Adafruit_HTU21DF htu = Adafruit_HTU21DF(); /* ========================= WEB SERVER ========================= */ WebServer server(80); /* ========================= PAGINA WEB HTML ========================= */ const char MAIN_page[] PROGMEM = R"rawliteral( <!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ESP32 Sensor Dashboard</title> <style> body { font-family: 'Segoe UI', Tahoma, sans-serif; background: linear-gradient(135deg, #1e3c72, #2a5298); margin: 0; padding: 0; color: #fff; } .container { max-width: 420px; margin: 40px auto; text-align: center; } h1 { margin-bottom: 30px; } .card { background: rgba(255, 255, 255, 0.18); border-radius: 15px; padding: 25px; margin-bottom: 20px; box-shadow: 0 10px 25px rgba(0,0,0,0.3); } .label { font-size: 1.1em; opacity: 0.9; } .value { font-size: 2.8em; font-weight: bold; } .unit { font-size: 0.5em; } .footer { font-size: 0.8em; opacity: 0.8; } </style> </head> <body> <div class="container"> <h1>🌡️ Sensore HTU21D</h1> <h2>WWW.ADRIROBOT.IT</h2> <div class="card"> <div class="label">Temperatura</div> <div class="value"> <span id="temp">--</span><span class="unit"> °C</span> </div> </div> <div class="card"> <div class="label">Umidità</div> <div class="value"> <span id="hum">--</span><span class="unit"> %</span> </div> </div> <div class="footer"> Aggiornamento automatico ogni 10 secondi </div> </div> <script> function updateData() { fetch('/data') .then(response => response.json()) .then(data => { document.getElementById('temp').innerHTML = data.temperature.toFixed(1); document.getElementById('hum').innerHTML = data.humidity.toFixed(1); }); } updateData(); setInterval(updateData, 10000); </script> </body> </html> )rawliteral"; /* ========================= HANDLER PAGINA PRINCIPALE ========================= */ void handleRoot() { server.send_P(200, "text/html", MAIN_page); } /* ========================= HANDLER DATI JSON ========================= */ void handleData() { float temp = htu.readTemperature(); float hum = htu.readHumidity(); String json = "{"; json += "\"temperature\":" + String(temp, 2) + ","; json += "\"humidity\":" + String(hum, 2); json += "}"; server.send(200, "application/json", json); } /* ========================= SETUP ========================= */ void setup() { Serial.begin(115200); /* I2C (ESP32-C3 SuperMini) */ Wire.begin(8, 9); // SDA, SCL /* OLED */ if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("Errore OLED"); while (true); } /* HTU21D */ if (!htu.begin()) { Serial.println("Errore HTU21D"); while (true); } /* WIFI */ WiFi.begin(ssid, pass); Serial.print("Connessione WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnesso!"); Serial.print("IP: "); Serial.println(WiFi.localIP()); /* WEB SERVER */ server.on("/", handleRoot); server.on("/data", handleData); server.begin(); Serial.println("Web server avviato"); } /* ========================= LOOP ========================= */ void loop() { server.handleClient(); float temp = htu.readTemperature(); float hum = htu.readHumidity(); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("Sensore HTU21D"); display.setCursor(0, 25); display.printf("Temp: %.1f C\n", temp); display.setCursor(0, 45); display.printf("Hum: %.1f %%\n", hum); display.display(); delay(2000); } |
Raccolta di sensori di temperatura e umidità
Oltre al sensore HTU21D Sensore temperatura umidità, 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.


















