Guide · 18 min di lettura

Sensori di temperatura per Arduino: confronto tra 8 modelli

Sensori di temperatura per Arduino a confronto: DHT11, DHT22, DS18B20, LM35, NTC, BME280, MAX6675 e MLX90614 per precisione, intervallo, cavo e prezzo.

Scegliere bene tra i vari sensori di temperatura per Arduino conta più di quanto sembri: un DHT11 e un DS18B20 nella stessa stanza possono differire di 2 °C, ed è del tutto possibile fondere un sensore cercando di misurare un forno a 300 °C con il modello sbagliato. Nell'elettronica hobbistica dominano otto sensori di temperatura: DHT11, DHT22, DS18B20, LM35, il termistore NTC, BME280, MAX6675 (termocoppia tipo K) e MLX90614 (a infrarossi, senza contatto). Ognuno ha un intervallo di misura, una precisione, un tipo di collegamento e un prezzo diversi. Quale sia quello giusto dipende da cosa devi misurare: l'aria di una stanza, l'acqua, un forno o un motore in rotazione che non puoi toccare?

In questa guida mettiamo gli otto sensori uno accanto all'altro in due grandi tabelle: intervallo di misura, precisione, risoluzione, velocità di lettura, interfaccia, tensione di alimentazione, lunghezza del cavo e prezzo relativo. Poi vedrai come funziona ciascuno, i suoi punti di forza e di debolezza, i collegamenti per Arduino Uno, ESP32 e Raspberry Pi Pico, codice di esempio per NTC, MAX6675 e MLX90614, un banco di prova che mette tre sensori in gara tra loro e quale scegliere per quale progetto. Per la maggior parte di questi sensori abbiamo anche tutorial dettagliati; trovi i link nelle sezioni corrispondenti.

Modulo sensore di temperatura e umidità DHT11
Modulo sensore di temperatura e umidità DHT11
Modulo sensore di temperatura e umidità DHT22 (AM2302)
Modulo sensore di temperatura e umidità DHT22 (AM2302)
Sonda di temperatura DS18B20 impermeabile
Sonda di temperatura DS18B20 impermeabile
Modulo sensore di temperatura, umidità e pressione BME280
Modulo sensore di temperatura, umidità e pressione BME280
Termistore NTC
Termistore NTC

Cosa guardare quando scegli un sensore di temperatura?

Prima di confrontare i sensori devi leggere correttamente i termini dei datasheet. La coppia che si confonde più spesso è precisione e risoluzione. La precisione indica quanto la tua lettura si avvicina alla temperatura reale; la risoluzione è il passo più piccolo che il sensore riesce a distinguere. Il BME280 fornisce la temperatura a passi di 0,01 °C, ma la sua precisione è di circa ±1 °C: le ultime due cifre dei 23,47 °C sul display servono quindi a seguire piccole variazioni, non a conoscere la temperatura reale con quella finezza. Per scegliere, guarda questi sette criteri:

  • Intervallo di misura: il sensore deve coprire comodamente la temperatura più bassa e quella più alta che vuoi misurare. Il DHT11 non vede sotto lo zero; per un frigorifero serve un DS18B20, per un forno una termocoppia.
  • Precisione: per un termometro da stanza ±2 °C va bene, ma un acquario o un'incubatrice richiedono ±0,5 °C.
  • Interfaccia: i sensori analogici richiedono un pin dell'ADC, quelli digitali uno o più pin digitali e quasi sempre una libreria. Il numero di pin liberi sulla tua scheda decide quanti sensori puoi collegare.
  • Lunghezza del cavo: se il sensore starà a 5 metri dalla scheda, in giardino o sul fondo di un serbatoio, i sensori analogici e I2C vanno in difficoltà; l'1-Wire e il protocollo a filo singolo dei DHT reggono molto meglio le lunghe distanze.
  • Tempo di risposta: una sonda in una guaina d'acciaio o un DHT nel suo involucro di plastica colgono un cambio brusco di temperatura solo dopo secondi o addirittura minuti; un piccolo NTC nudo è molto più rapido.
  • Misure aggiuntive: se ti serve anche l'umidità, basta un DHT22 o un BME280; se ti servono anche pressione e altitudine, il BME280 fa tutto in un solo modulo.
  • Tensione di alimentazione: su ESP32 e Pico, che lavorano a 3,3 V, fai attenzione a sensori come l'LM35 che richiedono almeno 4 V, e assicurati che all'ingresso dell'ADC non arrivino mai più di 3,3 V.

Tabella di confronto di 8 sensori di temperatura

La prima tabella riassume le prestazioni di misura, la seconda collegamento e costi. I valori provengono dai datasheet; salvo diversa indicazione, la precisione vale intorno alla temperatura ambiente e peggiora verso gli estremi dell'intervallo.

SensoreIntervallo di misuraPrecisioneRisoluzioneVelocità di lettura
DHT110 … +50 °C±2 °C1 °C1 al secondo
DHT22 (AM2302)−40 … +80 °C±0,5 °C0,1 °C1 ogni 2 secondi
DS18B20−55 … +125 °C±0,5 °C (da −10 a +85 °C)0,0625 °C (12 bit)750 ms (12 bit), 94 ms (9 bit)
LM35DZ0 … +100 °C (LM35: −55 … +150 °C)Tipica ±0,6 °C, garantita ±1,5 °C0,49 °C su Uno (rif. 5 V), 0,11 °C (rif. 1,1 V)Istantanea (velocità dell'ADC)
NTC 10 kΩ, B 3950−40 … +125 °C (in vetro ≈ 300 °C)A 25 °C: ±0,25 °C (1 %) … ±1 °C (5 %)≈ 0,1 °C a temperatura ambiente su UnoIstantanea (velocità dell'ADC)
BME280−40 … +85 °C±0,5 °C (25 °C), ±1 °C (0 … 65 °C)0,01 °CDecine al secondo
MAX6675 + termocoppia tipo K0 … +1023,75 °CQualche °C (convertitore ≈ ±2 °C, giunto freddo fino a ±3 °C)0,25 °C≈ 4 al secondo (conversione di 0,22 s)
MLX90614Oggetto −70 … +380 °C, ambiente −40 … +125 °C±0,5 °C (intorno alla temperatura ambiente)0,02 °CDiverse volte al secondo
SensoreInterfacciaAlimentazioneLunghezza del cavoMisura aggiuntivaPrezzo relativo
DHT11Digitale a filo singolo, 1 pin3–5,5 VFino a 20 mUmiditàMolto basso
DHT22Digitale a filo singolo, 1 pin3,3–6 VFino a 20 mUmiditàMedio
DS18B201-Wire, molti sensori su 1 pin3,0–5,5 VDecine di metriNessunaBasso
LM35Analogica, 1 pin dell'ADC4–30 VCorta, ≈ 1 m (oltre servono accorgimenti)NessunaBasso
NTCAnalogica, 1 pin dell'ADC tramite partitore3,3 o 5 V tramite il partitoreQualche metroNessunaIl più basso
BME280I2C (2 pin) o SPIChip 1,71–3,6 V; modulo con regolatore 5 VCorta, sotto i 50 cmUmidità e pressioneMedio
MAX6675SPI, 3 pin (sola lettura)3,0–5,5 VIl filo della termocoppia può essere lungo metriNessunaMedio
MLX90614I2C (SMBus), 2 pinVersione da 3 V o 5 V (il modulo può avere un regolatore)Corta (I2C); misura senza contattoTemperatura ambienteAlto
A grandi linee, la classifica dei prezzi è questa: il più economico è l'NTC, seguito da DHT11, LM35 e DS18B20; DHT22 e BME280 sono di fascia media, il modulo MAX6675 con la sonda a termocoppia costa un po' di più e l'MLX90614 è il più caro della lista. Le copie dei sensori economici sono molto diffuse; soprattutto per DS18B20, LM35 e BME280 i cloni possono non raggiungere la precisione del datasheet. Lasciare due sensori nello stesso punto e confrontarne le letture è il modo più semplice per capire se puoi fidarti del tuo.

DHT11 e DHT22: temperatura e umidità insieme

Dentro la griglia di plastica di un sensore DHT ci sono un elemento per l'umidità (resistivo nel DHT11, capacitivo nel DHT22), un termistore e un piccolo controller che digitalizza le misure. Il sensore invia il risultato su un'unica linea dati come pacchetto di 40 bit: 16 bit di umidità, 16 bit di temperatura e 8 bit di checksum. Questo protocollo non è 1-Wire ma un protocollo a filo singolo proprio del produttore; per questo ogni DHT richiede un pin dedicato. Il DHT11 è economico e basta per la temperatura di una stanza, ma l'intervallo di 0–50 °C e l'errore di ±2 °C lo rendono debole per l'esterno e per i lavori di precisione. Con gli stessi collegamenti, il DHT22 (AM2302) misura da −40 a +80 °C con ±0,5 °C di precisione e fornisce l'umidità dallo 0 al 100 %; in cambio fa solo una lettura ogni due secondi. Entrambi hanno un difetto comune, la lentezza: mostrano le variazioni in ritardo perché l'aria nella griglia deve prima mettersi in equilibrio con l'ambiente. Per collegamenti, installazione della libreria e codice, consulta Sensore di temperatura e umidità DHT11; lo stesso codice funziona con il DHT22 cambiando una sola parola.

Se usi un DHT nudo a 4 piedini, devi inserire una resistenza di pull-up da 10 kΩ tra la linea dati e VCC; nei moduli a 3 pin questa resistenza è già sulla scheda. Leggere un DHT più spesso di una volta ogni due secondi non dà una nuova misura: la libreria restituisce il valore precedente oppure nan.

DS18B20: impermeabile, robusto e molti sensori su un pin

Sonda di temperatura DS18B20 impermeabile
Sonda DS18B20 impermeabile: un sensore digitale in una guaina d'acciaio inox con cavo a tre fili (rosso VDD, nero GND, giallo dati).

Il DS18B20 misura la temperatura all'interno del chip e la invia come numero digitale con una risoluzione selezionabile da 9 a 12 bit. Misura da −55 a +125 °C, offre ±0,5 °C di precisione tra −10 e +85 °C e, grazie al protocollo 1-Wire, puoi collegare decine di sensori a un unico pin dati; ognuno ha un indirizzo univoco a 64 bit scritto in fabbrica. La versione a sonda impermeabile con guaina in acciaio inox è imbattibile per acquari, serbatoi d'acqua, tubi del riscaldamento, terreno e congelatori. L'unico requisito è una resistenza di pull-up da 4,7 kΩ tra linea dati e alimentazione; senza, la libreria restituisce −127 °C. In modalità 12 bit una conversione dura 750 ms, quindi per seguire una temperatura che cambia in fretta potresti dover ridurre la risoluzione. Il codice per più sensori e la lettura non bloccante su ESP32 sono in Sensore di temperatura DS18B20.

LM35: il sensore analogico più semplice, senza librerie

L'LM35 converte la temperatura direttamente in tensione: la sua uscita sale di 10 mV per grado e dà 250 mV a 25 °C. Non serve alcuna libreria; ottieni il risultato con la formula temperatura = analogRead × 5,0 / 1024 × 100. Questa semplicità ne fa un primo passo perfetto per imparare l'ADC. I suoi punti deboli nascono dallo stesso punto: con riferimento a 5 V, l'ADC a 10 bit di Arduino Uno dà solo passi di circa 0,49 °C, ogni scostamento dei 5 V della USB finisce direttamente nella temperatura e, più il cavo è lungo, più disturbi raccoglie l'uscita. La maggior parte degli LM35 in commercio sono LM35DZ, garantiti solo per 0–100 °C. Inoltre richiede almeno 4 V, quindi su ESP32 e Pico va alimentato dal pin a 5 V. Sulle schede a 3,3 V un'alternativa analogica più pratica è il TMP36: funziona da 2,7 a 5,5 V, misura da −40 a +125 °C e fornisce anch'esso 10 mV/°C, ma poiché dà 500 mV a 0 °C la formula diventa temperatura = (V − 0,5) × 100. La sua precisione tipica è di ±1 °C a 25 °C e di ±2 °C su tutto l'intervallo. Spieghiamo passo per passo come ridurre il passo a 0,11 °C con il riferimento interno da 1,1 V in Sensore di temperatura LM35, e come funziona l'ADC in conversione analogico-digitale.

L'LM35 e il DS18B20 arrivano nello stesso contenitore TO-92 nero e sembrano quasi identici, ma i loro piedini di alimentazione sono invertiti. Un sensore collegato al contrario diventa in pochi secondi troppo caldo da toccare. Alla prima accensione tocca il sensore con un dito; se si scalda, togli subito l'alimentazione e leggi la sigla stampata.

Termistore NTC: il sensore più economico e più veloce

Un termistore NTC (Negative Temperature Coefficient, a coefficiente di temperatura negativo) è una resistenza il cui valore diminuisce all'aumentare della temperatura. Il più comune nei progetti hobbistici è quello da 10 kΩ a 25 °C con coefficiente B di 3950 K. Poiché Arduino non può misurare direttamente una resistenza, l'NTC si collega formando un partitore di tensione con una resistenza fissa e si legge la tensione del punto centrale su un pin analogico. Questo circuito ha un bel vantaggio: quando il partitore è alimentato dagli stessi 5 V usati come riferimento dall'ADC, la misura è raziometrica; il risultato non cambia anche se l'alimentazione è di 4,8 o 5,1 V. Puoi calcolare facilmente le tensioni del partitore con lo strumento partitore di tensione.

La resistenza di un NTC varia con la temperatura in modo esponenziale, non lineare, quindi non basta un semplice fattore come per l'LM35. In pratica si usa l'equazione Beta: 1/T = 1/T0 + (1/B) × ln(R/R0). Qui T è la temperatura in kelvin, T0 = 298,15 K (25 °C), R0 = 10 kΩ e B = 3950. A temperatura ambiente la sensibilità è molto alta: secondo la formula B/T², la resistenza cambia di circa il 4,4 % per grado. Per questo un NTC con tolleranza dell'1 % sbaglia solo di circa ±0,25 °C a 25 °C; verso gli estremi dell'intervallo, però, entra in gioco la tolleranza del coefficiente B e l'errore cresce. Per una precisione maggiore su un intervallo ampio si usa l'equazione di Steinhart-Hart a tre punti; i dettagli sono in termistore NTC.

C++ (Arduino IDE)
1const int NTC_PIN = A1;          // bölücünün orta noktası / divider midpoint
2const float R_FIXED = 10000.0;   // 5V ile A1 arasındaki direnç / resistor between 5V and A1
3const float R0 = 10000.0;        // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float BETA = 3950.0;       // B katsayısı (veri sayfası) / B coefficient (datasheet)
5const float T0 = 298.15;         // 25 °C Kelvin cinsinden / 25 °C in kelvin
6const int SAMPLES = 16;          // ortalama için ölçüm sayısı / samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;
19
20  if (adc < 1.0 || adc > 1022.0) {                    // kopuk ya da kısa devre / open or shorted
21    Serial.println(F("NTC baglantisini kontrol et / Check the NTC wiring"));
22    delay(1000);
23    return;
24  }
25
26  float r = R_FIXED * adc / (1023.0 - adc);           // NTC direnci (ohm) / NTC resistance (ohm)
27  float invT = 1.0 / T0 + log(r / R0) / BETA;         // Beta denklemi / Beta equation
28  float tempC = 1.0 / invT - 273.15;                  // Kelvin -> °C
29
30  Serial.print(F("R: "));
31  Serial.print(r, 0);
32  Serial.print(F(" ohm  Sicaklik / Temp: "));
33  Serial.print(tempC, 1);
34  Serial.println(F(" C"));
35  delay(1000);
36}

In questo circuito la resistenza fissa da 10 kΩ sta tra 5V e A1, l'NTC tra A1 e GND. Quando la temperatura sale, la resistenza dell'NTC, e con essa la tensione su A1, scende. Il codice calcola prima la resistenza dell'NTC dal valore grezzo, poi la temperatura in kelvin con l'equazione Beta, e la converte in gradi Celsius; la media di 16 letture riduce il rumore dell'ADC a un quarto. A temperatura ambiente un passo dell'ADC di Uno corrisponde a circa 0,09 °C, quindi la risoluzione è cinque volte migliore di quella dell'LM35 con riferimento a 5 V. Nei moduli NTC già pronti (per esempio il KY-013) il lato in cui si trova la resistenza fissa cambia da scheda a scheda; se la lettura scende quando tocchi l'NTC con qualcosa di caldo, inverti la formula della resistenza: r = R_FIXED × (1023 − adc) / adc.

BME280: temperatura, umidità e pressione in un unico modulo

Il BME280 di Bosch misura temperatura, umidità relativa e pressione atmosferica su un chip di soli 2,5 × 2,5 mm e comunica via I2C (indirizzo 0x76 o 0x77) o SPI. Per la temperatura offre una risoluzione di 0,01 °C e una precisione di ±0,5 °C a 25 °C e di ±1 °C tra 0 e 65 °C; può fare decine di letture al secondo e in sospensione consuma molto meno di 1 µA. Per questo è ideale per le stazioni meteo a batteria. Il chip di per sé non sopporta più di 3,6 V: i moduli viola a 6 pin di solito sono solo a 3,3 V, mentre quelli a 4 pin con regolatore si possono collegare a 5 V. Quando misura di continuo, il chip si scalda un po' e può segnare qualche decimo di grado in più; per misure meteo basta la modalità forzata (forced) con poche letture al minuto. Spieghiamo come funziona il bus I2C in Cos'è l'I2C?.

Una parte dei moduli venduti come BME280 è in realtà un BMP280, che non misura l'umidità. I due sono quasi identici a vista; il modo sicuro per distinguerli è leggere il registro di identificazione (chip ID): il BME280 restituisce 0x60, il BMP280 0x58. In questo caso l'esempio della libreria Adafruit BME280 stampa il messaggio "Could not find a valid BME280 sensor". Il codice per leggere l'ID e la soluzione sono in BME280 e BMP280.

MAX6675 e termocoppia tipo K: fino a 1000 °C

Una termocoppia è formata da due fili di metalli diversi saldati a un'estremità. La differenza di temperatura tra la saldatura (giunto caldo) e il punto in cui i fili si collegano allo strumento (giunto freddo) genera nei fili una tensione minuscola; in una termocoppia tipo K è di circa 41 µV per grado. L'ADC di Arduino non riesce a leggere una tensione così piccola, e inoltre bisogna conoscere la temperatura del giunto freddo. Il MAX6675 fa entrambe le cose: amplifica la tensione della termocoppia, applica la compensazione del giunto freddo misurando la propria temperatura e fornisce il risultato via SPI a 12 bit, con risoluzione di 0,25 °C. L'intervallo va da 0 a +1023,75 °C: è l'unica scelta di questa lista per i posti in cui gli altri sensori non sopravvivono, come saldatore, forno per pizza, barbecue, forno per ceramica o scarico.

Conosci anche i limiti del MAX6675: non misura sotto 0 °C; l'errore del convertitore è di circa ±2 °C tra 0 e 700 °C, e a questo si sommano fino a ±3 °C di errore della compensazione del giunto freddo e la tolleranza del filo della termocoppia. Aspettati quindi una precisione complessiva di qualche grado; in un forno a 800 °C questa differenza non conta. Una conversione dura 0,17–0,22 secondi, quindi tra due letture bisogna aspettare almeno 250 ms. Se ti servono anche temperature negative, il più recente MAX31855 (da −200 a +1350 °C, 14 bit) è la scelta migliore. Come funziona il bus SPI lo trovi in Cos'è l'SPI?. Installa la libreria MAX6675 library di Adafruit dal Gestore librerie dell'Arduino IDE e carica questo codice:

C++ (Arduino IDE)
1#include "max6675.h"
2
3const int thermoDO  = 4;    // SO: veri çıkışı / data out
4const int thermoCS  = 5;    // CS: çip seçimi / chip select
5const int thermoCLK = 6;    // SCK: saat / clock
6
7MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
8
9void setup() {
10  Serial.begin(9600);
11  delay(500);                                   // ilk ölçümü bekle / wait for the first conversion
12}
13
14void loop() {
15  float c = thermocouple.readCelsius();
16  if (isnan(c)) {                               // D2 biti: termokupl açık / bit D2: thermocouple open
17    Serial.println(F("Termokupl takili degil / Thermocouple not connected"));
18  } else {
19    Serial.print(F("Sicaklik / Temp: "));
20    Serial.print(c, 2);
21    Serial.println(F(" C"));
22  }
23  delay(500);                                   // en az 250 ms bekle / wait at least 250 ms
24}
I fili della termocoppia hanno una polarità: collega i fili segnati + e − ai morsetti con lo stesso segno sul modulo; se li inverti, la lettura scende mentre la sonda si scalda. Non mettere il modulo accanto all'apparecchio che si scalda: poiché il MAX6675 corregge il giunto freddo con la propria temperatura, ogni riscaldamento della scheda finisce direttamente nella misura. Se la sonda non è collegata o il filo è interrotto, la libreria restituisce nan.

MLX90614: misurare la temperatura senza contatto

L'MLX90614 è un sensore di temperatura senza contatto che rileva con una termopila la radiazione infrarossa emessa dagli oggetti. Fornisce due valori contemporaneamente: la temperatura ambiente, cioè quella del suo stesso corpo (da −40 a +125 °C), e la temperatura dell'oggetto, quella della superficie inquadrata (da −70 a +380 °C). Intorno alla temperatura ambiente offre ±0,5 °C di precisione e 0,02 °C di risoluzione; è calibrato in fabbrica, comunica via I2C (SMBus) all'indirizzo 0x5A e la velocità del bus non deve superare i 100 kHz. È ideale per misurare senza toccarli un motore in rotazione, un cuscinetto, un chip caldo su una scheda o una padella sul fuoco.

La misura senza contatto ha due accorgimenti. Il primo è il campo visivo: il sensore misura la media di tutto ciò che entra nel suo cono di visione. La versione più diffusa, l'MLX90614ESF-BAA, ha un campo visivo di 90°: a 5 cm di distanza fa quindi la media di un'area di circa 10 cm di diametro. Per misurare un oggetto piccolo avvicina il sensore o scegli una versione ad angolo stretto come 35° (BCC) o 5° (BCI). Il secondo è l'emissività: di fabbrica il sensore è impostato su 1,0. Per vernice opaca, plastica, legno, pelle e acqua questo coefficiente è tra 0,9 e 0,98, quindi il risultato è quasi corretto; le superfici metalliche lucide, invece, emettono pochissima radiazione e sembrano molto più fredde di quanto siano. Attaccarci un pezzo di nastro nero opaco è una soluzione semplice ed efficace. Installa la libreria Adafruit MLX90614 dal Gestore librerie e prova questo codice:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MLX90614.h>
3
4Adafruit_MLX90614 mlx = Adafruit_MLX90614();
5
6void setup() {
7  Serial.begin(9600);
8  if (!mlx.begin()) {                           // varsayılan adres 0x5A / default address 0x5A
9    Serial.println(F("MLX90614 bulunamadi / not found"));
10    while (true) delay(10);
11  }
12  Serial.print(F("Emisivite / Emissivity: "));
13  Serial.println(mlx.readEmissivity(), 2);      // fabrika ayarı 1.00 / factory default 1.00
14}
15
16void loop() {
17  Serial.print(F("Ortam / Ambient: "));
18  Serial.print(mlx.readAmbientTempC(), 2);      // sensör gövdesi / sensor body
19  Serial.print(F(" C   Nesne / Object: "));
20  Serial.print(mlx.readObjectTempC(), 2);       // baktığı yüzey / surface in view
21  Serial.println(F(" C"));
22  delay(500);
23}
L'MLX90614 non vede attraverso il vetro: il suo filtro ottico lascia passare lunghezze d'onda di 5,5–14 µm e il vetro in questo intervallo è quasi opaco. Se punti il sensore fuori da una finestra, misuri il vetro, non l'esterno. Inoltre, se lo porti da una stanza fredda a una calda, può misurare male per qualche minuto, finché il suo corpo non raggiunge l'equilibrio.

Riepilogo dei collegamenti: Arduino Uno, ESP32 e Raspberry Pi Pico

Sensore e pinArduino UnoESP32Raspberry Pi Pico
DHT11 / DHT22: DATAD2GPIO 27GP15
DS18B20: DQ (+ pull-up da 4,7 kΩ)D3GPIO 4GP22
LM35: Vout (alimentazione 5 V)A0GPIO 34 (ADC1)GP26 (ADC0)
NTC: punto centrale del partitoreA1 (partitore da 5V)GPIO 35 (ADC1, partitore da 3V3)GP27 (ADC1, partitore da 3V3)
BME280: SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
MLX90614: SDA / SCLA4 / A5 (stesso bus I2C)GPIO 21 / 22GP4 / GP5
MAX6675: SO / CS / SCKD4 / D5 / D6GPIO 19 / 23 / 18GP16 / GP17 / GP18
Alimentazione (VCC)5V (3.3V per il BME280 a 6 pin)3V3 (5V/VIN per l'LM35)3V3(OUT) (VBUS per l'LM35)

ESP32 e Pico lavorano a 3,3 V; se alimenti il partitore dell'NTC da 3V3, all'ingresso dell'ADC non può arrivare una tensione pericolosa. Sull'ESP32 collega i sensori analogici solo ai pin dell'ADC1 (GPIO 32–39), perché quelli dell'ADC2 non funzionano con il Wi-Fi attivo; per le linee dati bidirezionali come quelle di DHT e DS18B20 evita invece i GPIO 34–39, che sono solo ingressi. BME280 (0x76) e MLX90614 (0x5A) hanno indirizzi diversi e possono quindi condividere senza problemi gli stessi due fili I2C. Trovi tutti i pin della tua scheda nello strumento Pinout e il codice colori delle resistenze di pull-up nello strumento codice colori resistenze.

Test di confronto con l'ESP32: tre sensori nello stesso punto

Il modo migliore per vedere le differenze tra i sensori è osservarle con i tuoi occhi. Il codice ESP32 qui sotto legge contemporaneamente un DS18B20, un DHT22 e un BME280 e mostra i risultati come tre linee separate nel Serial Plotter dell'Arduino IDE. Metti i sensori uno accanto all'altro sulla breadboard, ad almeno 10 cm dall'ESP32; l'ESP32 si scalda mentre lavora e influenza qualsiasi sensore vicino. Il codice richiede le librerie OneWire, DallasTemperature, DHT sensor library e Adafruit BME280.

C++ (Arduino IDE)
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <DHT.h>
4#include <Wire.h>
5#include <Adafruit_Sensor.h>
6#include <Adafruit_BME280.h>
7
8const int ONE_WIRE_PIN = 4;     // DS18B20 DQ (4,7 kΩ pull-up -> 3V3)
9const int DHT_PIN = 27;         // DHT22 DATA
10
11OneWire oneWire(ONE_WIRE_PIN);
12DallasTemperature ds(&oneWire);
13DHT dht(DHT_PIN, DHT22);
14Adafruit_BME280 bme;            // I2C: SDA GPIO 21, SCL GPIO 22
15bool bmeOk = false;
16
17void setup() {
18  Serial.begin(115200);
19  ds.begin();
20  dht.begin();
21  bmeOk = bme.begin(0x76) || bme.begin(0x77);   // iki adresi de dene / try both addresses
22  if (!bmeOk) Serial.println("BME280 bulunamadi / not found");
23}
24
25void loop() {
26  ds.requestTemperatures();                     // 12 bitte ~750 ms sürer / takes ~750 ms at 12-bit
27  float tDs  = ds.getTempCByIndex(0);           // sensör yoksa -127 / -127 if missing
28  float tDht = dht.readTemperature();           // hata olursa NAN / NAN on error
29  float tBme = bmeOk ? bme.readTemperature() : NAN;
30
31  // Seri Çizici için etiket:değer biçimi / label:value format for the Serial Plotter
32  Serial.printf("DS18B20:%.2f,DHT22:%.1f,BME280:%.2f\n", tDs, tDht, tBme);
33  delay(2000);                                  // DHT22 en fazla 2 sn'de bir / DHT22 at most every 2 s
34}

Per prima cosa aspetta qualche minuto e osserva quanto sono distanti le linee: differenze di 0,5–1 °C rientrano nei limiti di precisione di questi sensori. Poi metti accanto un bicchiere d'acqua tiepida o soffia delicatamente su tutti e tre. DS18B20 e BME280 reagiscono in pochi secondi, mentre la linea del DHT22 resta nettamente indietro a causa della sua griglia di plastica. Se il BME280 resta sempre qualche decimo sopra gli altri, è l'autoriscaldamento del chip. Questo piccolo esperimento ti mostra differenze che non trovi in nessun datasheet. Per registrare le misure a lungo puoi usare un modulo per scheda SD o inviare i dati a Google Sheets.

Misurare la temperatura con Raspberry Pi Pico e MicroPython

Il firmware MicroPython del Pico include già i moduli dht, onewire e ds18x20, quindi per DHT e DS18B20 non devi copiare file aggiuntivi sul Pico. Inoltre il chip RP2040 ha un sensore di temperatura interno collegato al canale 4 dell'ADC. Il codice seguente li legge tutti e tre insieme:

MicroPython
1from machine import Pin, ADC
2import dht, onewire, ds18x20, time
3
4dht22 = dht.DHT22(Pin(15))                          # DHT22 DATA -> GP15
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22)))      # DS18B20 DQ -> GP22 (4,7 kΩ pull-up)
6roms = ds.scan()                                    # hattaki sensörler / sensors on the bus
7cpu = ADC(4)                                        # RP2040 dahili sensörü / internal sensor
8
9def cpu_temp():
10    v = cpu.read_u16() * 3.3 / 65535                # ham değer -> volt / raw value -> volts
11    return 27 - (v - 0.706) / 0.001721              # RP2040 veri sayfası formülü / datasheet formula
12
13while True:
14    t_ds = None
15    if roms:
16        ds.convert_temp()                           # ölçümü başlat / start conversion
17        time.sleep_ms(750)                          # 12 bit dönüşüm süresi / 12-bit conversion time
18        t_ds = round(ds.read_temp(roms[0]), 2)
19    try:
20        dht22.measure()
21        t_dht, nem = dht22.temperature(), dht22.humidity()
22    except OSError:                                 # okuma hatası / read error
23        t_dht = nem = None
24    print("DS18B20:", t_ds, "DHT22:", t_dht, "Nem / RH:", nem,
25          "Pico:", round(cpu_temp(), 1))
26    time.sleep(2)

Il sensore interno misura la temperatura del chip, non quella della stanza, e piccoli scostamenti del riferimento dell'ADC possono spostare il risultato di qualche grado. Non serve quindi a misurare l'ambiente, ma è utile per controllare se la scheda si surriscalda. Non dimenticare la pull-up da 4,7 kΩ sulla linea dati del DS18B20; le pull-up interne del Pico sono troppo deboli per l'1-Wire. Se il Pico è una novità per te, comincia da Cos'è il Raspberry Pi Pico?.

Quale sensore di temperatura per quale progetto?

Progetto o esigenzaSensore consigliatoPerché?
Primo progetto, termometro da stanzaDHT11Il più economico, dà anche l'umidità; ±2 °C bastano per una stanza
Stazione meteo per interni ed esterniBME280 o DHT22Scende fino a −40 °C e dà l'umidità; il BME280 misura anche pressione e altitudine
Acquario, serbatoio d'acqua, acqua della caldaiaSonda impermeabile DS18B20Guaina inox, ±0,5 °C, cavo lungo
Frigorifero e congelatoreDS18B20Misura fino a −55 °C; il DHT11 non vede sotto lo zero
Misura in molti punti (stanze, serra, impianti)DS18B20Decine di sensori su un pin, ognuno con il proprio indirizzo
Incubatrice per uovaDHT22 o BME280±0,5 °C intorno a 37,5 °C più il controllo dell'umidità
Forno, barbecue, saldatoreMAX6675 + termocoppia tipo KResiste fino a 1000 °C
Hotend di stampante 3D, pacco batterieTermistore NTCPiccolo, economico e veloce; le stampanti 3D usano NTC da 100 kΩ in vetro
Motore, cuscinetto, circuito stampato, parti in movimentoMLX90614Misura senza contatto
Imparare l'ADC e la misura analogicaLM35 o NTCNessuna libreria, funziona con una formula

Idee di progetto con i sensori di temperatura

  • Serra intelligente: misura temperatura e umidità dell'aria con un DHT22 e la temperatura del terreno con una sonda DS18B20; gestisci ventola e irrigazione con un modulo relè. Per il progetto completo, guarda il progetto della serra intelligente.
  • Riscaldatore per acquario con termostato: mantieni l'acqua tra 25 e 26 °C con un DS18B20 impermeabile; usa un'isteresi di 0,5 °C perché il relè non scatti a ogni minima variazione.
  • Stazione meteo a batteria: abbina un BME280 alla modalità deep sleep dell'ESP32 e misura ogni dieci minuti, così il sistema funziona per mesi a batteria.
  • Termometro per forno da pizza o barbecue: mostra la temperatura del forno con cifre grandi su un display OLED usando un MAX6675 e una sonda tipo K.
  • Allarme temperatura motore senza contatto: controlla con un MLX90614 la temperatura superficiale di un motore o del piano di una stampante 3D e fai suonare un buzzer quando supera una soglia.
  • Domotica: invia la temperatura di ogni stanza a Home Assistant via MQTT con un ESP32 e gestisci il riscaldamento di conseguenza.
  • Guardiano del congelatore: con un DS18B20 fai scattare un allarme se l'interno del congelatore sale sopra i −12 °C e mostra il valore su un display LCD I2C.

Errori comuni e come risolverli

SintomoCausa probabileSoluzione
DHT: nan o "Failed to read from DHT sensor!"Tipo sbagliato nel codice (DHT11/DHT22), pull-up assente o letture troppo frequentiCorreggi il tipo, aggiungi una pull-up da 10 kΩ, aspetta 2 secondi tra le letture
DS18B20: −127 °CSensore non trovato: pull-up assente, cavo difettoso o pin sbagliatoMetti 4,7 kΩ tra DQ e VCC, controlla i collegamenti
DS18B20: sempre 85 °CLetto prima della fine della conversione o alimentazione insufficienteAttendi il tempo di conversione, alimenta VDD direttamente
LM35: valore anormalmente alto, il sensore si scaldaPiedini di alimentazione invertitiTogli subito l'alimentazione e correggi l'ordine dei piedini
LM35 o NTC: il valore salta di continuoRumore dell'ADC, cavo lungo, alimentazione USB instabileFai la media, aggiungi un condensatore da 0,1 µF, accorcia il cavo
NTC: la temperatura scende quando si scaldaIl verso del partitore non corrisponde al codiceInverti la formula della resistenza
BME280: "Could not find a valid BME280 sensor"Indirizzo sbagliato (0x76/0x77) o il chip è in realtà un BMP280Cambia indirizzo, leggi il chip ID (0x60 / 0x58)
BME280 o DHT: 1–3 °C in piùAutoriscaldamento, ESP32 o regolatore viciniAllontana il sensore dalla scheda, misura meno spesso, applica un offset
MAX6675: nanTermocoppia non collegata o filo interrottoControlla i morsetti e la sonda
MAX6675: il valore scende quando si scaldaPolarità della termocoppia invertitaScambia i fili + e −
MLX90614: il metallo lucido sembra freddissimoEmissività bassaAttacca del nastro nero opaco o imposta l'emissività
MLX90614: oggetto piccolo misurato maleCampo visivo più grande dell'oggettoAvvicina il sensore o usa una versione ad angolo stretto
Qualunque sensore tu scelga, la principale fonte di errore spesso non è il sensore in sé, ma dove lo metti. Un sensore al sole, subito accanto a un regolatore di tensione o a un ESP32, o chiuso in una scatola sigillata misura la temperatura del proprio intorno, non quella della stanza. Allontana il sensore dalla scheda, mettilo in un punto ventilato, confrontalo una volta con un termometro affidabile e correggi nel codice la differenza costante. Per ammorbidire valori ballerini, dai un'occhiata ai metodi per filtrare i dati dei sensori.

In breve: DHT22 o BME280 per stanze e meteo, DS18B20 per acqua e freddo, LM35 o NTC per imparare la misura analogica e avere una risposta rapida, MAX6675 per le alte temperature e MLX90614 per le superfici che non puoi toccare sono i punti di partenza giusti. Se vuoi conoscere anche altri tipi di sensori, dai un'occhiata alla guida ai sensori per Arduino. Nell'app BlueGrays trovi progetti come la misura di temperatura e umidità con il DHT11, un termometro con NTC e LCD, un indicatore di temperatura con ESP32, DHT22 e LCD, un datalogger di temperatura con ESP32 e un'irrigazione intelligente, con schema elettrico e codice passo passo.

Domande frequenti

Qual è il sensore di temperatura più preciso per Arduino?

Tra i sensori hobbistici, i più precisi intorno alla temperatura ambiente sono DS18B20, DHT22, BME280 (a 25 °C) e MLX90614, tutti con ±0,5 °C. Il DS18B20 spicca per le misure via cavo e impermeabili, DHT22 o BME280 quando ti serve anche l'umidità. Qualunque sia la tua scelta, confrontare una volta il sensore con un termometro affidabile e correggere l'offset nel codice migliora molto la precisione.

Meglio il DHT11 o il DHT22?

Se vuoi solo tenere d'occhio in modo approssimativo temperatura e umidità di una stanza, il DHT11 basta. Per l'esterno, le temperature sotto lo zero o una precisione di ±0,5 °C prendi il DHT22: misura da −40 a +80 °C e fornisce anche un'umidità più precisa. Entrambi funzionano con la stessa libreria e lo stesso codice; nello sketch cambi solo il tipo di sensore.

Come misuro la temperatura dell'acqua con Arduino?

Il sensore più adatto per l'acqua è la sonda DS18B20 impermeabile con guaina in acciaio inox. Immergi la sonda nell'acqua e colleghi il filo dati a un pin digitale di Arduino con una resistenza di pull-up da 4,7 kΩ. Il cavo e le giunzioni di solito non sono pensati per restare a lungo in acqua calda, quindi immergi solo la punta in acciaio.

Si possono misurare alte temperature come 500 °C con Arduino?

Sì. Con una termocoppia tipo K e un modulo MAX6675 puoi misurare da 0 a circa 1024 °C. La punta della termocoppia va dentro il forno, mentre il modulo MAX6675 deve restare lontano dal calore. Controlla sempre fino a quale temperatura resistono la guaina e il cavo della sonda che hai acquistato.

Si può costruire un termometro senza contatto con Arduino?

Con un MLX90614 puoi costruire un termometro a infrarossi senza contatto collegato ad Arduino; la versione standard offre ±0,5 °C di precisione intorno alla temperatura ambiente. Per la temperatura corporea servono la versione a precisione medicale (±0,2 °C) e la giusta distanza di misura, e anche così questo montaggio non sostituisce un dispositivo medico. Durante la misura assicurati che la superficie riempia del tutto il campo visivo del sensore.

Perché il mio sensore di temperatura segna più del dovuto?

La causa più comune sono le fonti di calore vicino al sensore: un ESP32, un regolatore di tensione o la luce del sole. Sensori come il BME280 si scaldano anche un po' da soli quando misurano di continuo. Allontana il sensore di 10–15 cm dalla scheda, misura meno spesso e correggi nel codice la differenza costante che resta dopo il confronto con un termometro affidabile.

Vedi tutti i progetti
Temperatura e umidità con DHT11
#55Intermedio

Temperatura e umidità con DHT11

Quanti gradi ci sono nella tua stanza, e l'aria è umida o secca? Il sensore DHT11 misura temperatura e umidità, e l'Arduino scrive i valori su uno schermo LCD a due righe, aggiornandoli ogni paio di s

4.7(47)
73
Misura di temperatura con NTC e display Lcd 2x16
#44Principiante
Premium

Misura di temperatura con NTC e display Lcd 2x16

Misura la temperatura dell'ambiente con un sensore che sembra una piccola perlina. Questo componente, chiamato NTC, fa passare la corrente sempre più facilmente man mano che si scalda; l'Arduino legge

4.5(33)
44
ESP32 DHT22 Temperatura e umidità (con display LCD)
#117Intermedio

ESP32 DHT22 Temperatura e umidità (con display LCD)

Si tratta di un progetto che misura la temperatura e l'umidità dell'ambiente tramite il sensore DHT22 e le visualizza in tempo reale su un display LCD I2C 16x2. I dati vengono letti dal sensore utilizzando il protocollo one-wire tramite la libreria Adafruit DHT. Questo progetto costituisce la base per stazioni meteorologiche IoT, sistemi di automazione domestica intelligente o sistemi di monitoraggio ambientale nelle serre. La comunicazione con il DHT22 avviene tramite il pin GPIO 4 dell'ESP32.

4.8(38)
56
Data Logger di Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avanzato
Premium

Data Logger di Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Costruisci un data logger di temperatura con timestamp usando ESP32! Leggi temperatura/umidità dal DHT22 ogni minuto, ottieni l'ora reale dal DS1307 RTC e registra su scheda microSD in formato CSV. L'OLED mostra dal vivo temperatura (font grande), percentuale di umidità, timestamp e contatore di log. Il file /temp_log.csv sulla scheda SD si apre in Excel, Google Sheets o Python pandas per l'analisi — perfetto per il monitoraggio di serre, tracciamento della temperatura domestica, raccolta

4.7(7)
12
Orologio a matrice di punti, calendario e stazione meteo (MAX7219, DS1307)
#85Intermedio
Premium

Orologio a matrice di punti, calendario e stazione meteo (MAX7219, DS1307)

Un pannello a scritte scorrevoli per la scrivania o la parete che mostra a turno l'ora, la data e il clima della stanza. Sul display LED 8x32 compaiono prima la temperatura in Celsius e Fahrenheit, po

5.0(50)
66
Stazione di irrigazione intelligente
#83Avanzato
Premium

Stazione di irrigazione intelligente

Un giardiniere che annaffia le tue piante da solo, così non si seccano mentre sei in vacanza. Un sensore di umidità misura quanto è bagnata la terra; quando diventa secca, l'Arduino accende la pompa d

5.0(42)
57
Utilizzo dello schermo LCD con I2C
#32Principiante
Premium

Utilizzo dello schermo LCD con I2C

Regala al tuo Arduino uno schermo tutto suo e fagli scrivere il primo messaggio. Lo schermo LCD a due righe si collega con pochi fili; prima compare un saluto nella riga in alto, poi un secondo testo

4.8(53)
70