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.

Video
Schema circuito

Codice sorgente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 DHT22 Temperatura e umidità (con display LCD)
4// ─────────────────────────────────────────
5// Legge temperatura e umidità dal DHT22 ogni 2 s e le mostra su un LCD I2C
6// 16x2. Se una lettura fallisce, lo schermo mostra un avviso su cablaggio
7// e pull-up.
8//
9// Pin:
10// GPIO 4 -> DATA del DHT22
11// Pull-up da 10k tra DATA e VCC
12// GPIO 21 -> SDA dell'LCD, GPIO 22 -> SCL dell'LCD
13// DHT22 VCC -> 3V3, VCC dell'LCD -> 5V (VIN)
14// Tutti i GND in comune
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18#include <DHT.h>
19
20// Definizione dei pin
21const int DHT_PIN = 4;
22#define DHT_TYPE DHT22
23
24DHT dht(DHT_PIN, DHT_TYPE);
25
26// Indirizzo dell'LCD 0x27 o 0x3F
27LiquidCrystal_I2C lcd(0x27, 16, 2);
28
29// Il DHT22 richiede almeno 2 s tra una lettura e l'altra
30const unsigned long READ_INTERVAL = 2000;
31unsigned long lastRead = 0;
32
33void setup() {
34 // Pin I2C predefiniti della DevKit V1
35 Wire.begin(21, 22);
36 lcd.init();
37 lcd.backlight();
38
39 // Schermata iniziale 3 s
40 lcd.setCursor(3, 0);
41 lcd.print("BlueGrays");
42 lcd.setCursor(3, 1);
43 lcd.print("DHT22 v1.0");
44 delay(3000);
45 lcd.clear();
46
47 dht.begin();
48}
49
50void loop() {
51 // Leggere ogni 2 s senza delay()
52 if (millis() - lastRead >= READ_INTERVAL) {
53 lastRead = millis();
54
55 float h = dht.readHumidity();
56 float t = dht.readTemperature();
57
58 lcd.clear();
59
60 // NaN = problema di cablaggio/pull-up
61 if (isnan(h) || isnan(t)) {
62 lcd.setCursor(0, 0);
63 lcd.print("Sensor okunamadi");
64 lcd.setCursor(0, 1);
65 lcd.print("Kablo+10k pullup");
66 } else {
67 // Temperatura
68 lcd.setCursor(0, 0);
69 lcd.print("Sicaklik:");
70 lcd.print(t, 1);
71 lcd.print("C");
72 // Umidità, il DHT22 dà i decimali
73 lcd.setCursor(0, 1);
74 lcd.print("Nem :");
75 lcd.print(h, 1);
76 lcd.print("%");
77 }
78 }
79}
80FAQ
Qual è la differenza tra il DHT22 e il DHT11?▾
Il DHT22 è più preciso (±0,5 °C, ±2–5% di umidità), misura in un intervallo più ampio (da −40 a 80 °C) e offre una risoluzione di 0,1. Il DHT11 è più economico, ma è limitato a una precisione di ±2 °C e a una risoluzione in numeri interi.
È necessario un resistore pull-up da 10 kΩ?▾
Per la linea dati del sensore DHT22 non rivestito è necessario un pull-up da 10 kΩ. Nei moduli a 3 pin montati sulla scheda, la resistenza è solitamente già presente.
LCD 5 V, ESP32 3,3 V; sono compatibili?▾
I moduli LCD I2C offrono un'immagine più nitida con 5 V. Se le resistenze pull-up sulle linee SDA/SCL del modulo alimentato a 5 V sono collegate a 5 V, l'uso di un convertitore di livello è la soluzione più sicura; sebbene molti lo colleghino direttamente, ciò mette a dura prova i limiti dell'ESP32.
Posso inviare i dati su Internet?▾
Sì, grazie al Wi-Fi dell'ESP32 puoi inviare le misurazioni a ThingSpeak, Blynk o al tuo server e visualizzare i grafici dal telefono.
