Codice Arduino e video per il sensore di temperatura e umidità DHT22 con display TM1637 e relè
In questo tutorial esploreremo come utilizzare un sensore di temperatura e umidità DHT22 in combinazione con un display TM1637 e un relè per controllare un carico in corrente alternata, come un riscaldatore o una ventola. L'obiettivo è accendere il carico quando la temperatura raggiunge i 50 gradi Celsius e spegnerlo quando scende al di sotto di tale soglia. Questa configurazione è ideale per mantenere i livelli di temperatura desiderati in un ambiente controllato.

Per ottenere questo, scriveremo un programma Arduino che legge i dati di temperatura e umidità dal sensore DHT22, visualizza la temperatura sul display TM1637 e controlla il relè in base alle letture della temperatura. Per maggiore chiarezza, puoi consultare il video (nel video al 10:00).
Hardware spiegato
Le componenti principali di questo progetto includono il sensore DHT22, il display TM1637, il modulo relè e una scheda Arduino. Il sensore DHT22 è responsabile della misurazione della temperatura e dell'umidità, fornendo un'uscita digitale che l'Arduino può leggere facilmente. Il display TM1637 viene utilizzato per mostrare le letture della temperatura in un formato intuitivo, mentre il modulo relè ci permette di controllare in modo sicuro dispositivi ad alta tensione come riscaldatori e ventilatori.
Il sensore DHT22 ha tre pin: VCC (alimentazione), GND (massa) e DATA (uscita). Il display TM1637 utilizza quattro pin per alimentazione, massa, clock e comunicazione dei dati. Il modulo relè si collega all'Arduino e funge da interruttore per il carico in corrente alternata, garantendo un funzionamento sicuro quando si controllano dispositivi che richiedono tensioni più elevate.
Dettagli della scheda tecnica
| Produttore | Adafruit |
|---|---|
| Numero di parte | DHT22 |
| Tensione logica/IO | 3.3 V - 5.5 V |
| Tensione di alimentazione | 3,3 V - 6 V |
| Corrente di uscita (per canale) | 0.5 mA |
| Corrente di picco (per canale) | 2,5 mA |
| Linee guida sulla frequenza PWM | Non applicabile |
| Soglie logiche di ingresso | 0.3 V - 0.7 V |
| Caduta di tensione / RDS(on)/ saturazione | Non applicabile |
| Limiti termici | -40°C a 80°C |
| Pacchetto | involucro a 3 pin |
| Note / varianti | Noto anche come AM2302 |
- Assicurarsi di fornire un'alimentazione adeguata (3,3 V - 6 V) al DHT22.
- Usare resistenze di pull-up sulla linea dati se necessario.
- Lasciare che le letture del sensore si stabilizzino per ottenere dati accurati.
- Ricontrollare i collegamenti dei pin per evitare errori di comunicazione.
- Fai attenzione ai carichi in corrente alternata (AC); assicurati di avere un adeguato isolamento e di rispettare le norme di sicurezza.
- Prevedere un dissipatore di calore per il relè se si controllano carichi elevati.
- Utilizzare tecniche di debounce, se necessario, durante la lettura dei dati del sensore.
- Proteggi il sensore DHT22 dalla luce solare diretta per misurazioni accurate.
Istruzioni di cablaggio

Per collegare i componenti, inizia collegando il sensore DHT22. Collega il pin VCC al pin 5V dell'Arduino, il pin GND alla massa (GND) e il pin DATA al pin digitale 9 dell'Arduino.
Successivamente, collegare il display TM1637. Collegare il pin VCC al pin 5V dell'Arduino, il pin GND a massa, il pin CLK (clock) al pin digitale 2 e il pin DIO (data) al pin digitale 3. Per il modulo relè, collegare il pin VCC al pin 5V, il pin GND a massa e il pin di controllo (segnale) al pin digitale 7. Infine, assicurarsi che il carico in corrente alternata sia collegato in modo sicuro al modulo relè seguendo le indicazioni del produttore.
Esempi di codice e guida passo-passo
Il codice seguente inizializza il sensore DHT22 e il display TM1637. Configura i pin necessari e si prepara a leggere i dati di temperatura.
#include
#define CLK 2
#define DIO 3
#define DHTPIN 9
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
pinMode(RELAY, OUTPUT);
dht.begin();
}
In questo frammento di codice includiamo le librerie necessarie e definiamo i pin per il display TM1637 e il sensore DHT22. La funzione setup inizializza la comunicazione seriale e imposta il pin del relè come uscita.

La funzione loop recupera la temperatura e controlla il relè in base alla lettura della temperatura. Se la temperatura supera i 50 gradi, il relè viene attivato.
void loop() {
delay(TEST_DELAY);
int temp = round(getTemp("c"));
display.showNumberDec(temp, false, 3, 1);
if(temp > 50) {
digitalWrite(RELAY, LOW);
} else {
digitalWrite(RELAY, HIGH);
}
}
Questo frammento di codice dimostra come leggere la temperatura, visualizzarla e controllare il relè. La temperatura viene arrotondata e visualizzata sul TM1637, e il relè viene acceso o spento in base alla soglia di temperatura.
Per una comprensione più approfondita, si prega di consultare il codice completo caricato sotto l'articolo.
Dimostrazione / Cosa aspettarsi
Quando esegui il programma, dovresti vedere la temperatura visualizzata sul TM1637. Quando la temperatura supera i 50 gradi Celsius, il relè si attiverà, accendendo il carico AC collegato. Viceversa, quando la temperatura scende sotto i 50 gradi, il relè si disattiverà, spegnendo il carico. Fai attenzione alla polarità invertita e assicurati che i collegamenti siano corretti per evitare danni ai componenti (nel video a 12:30).
Marcatori temporali del video
- 00:00- Introduzione
- 02:15- Spiegazione del cablaggio
- 05:00- Analisi guidata del codice
- 10:00- Dimostrazione
- 12:30- Problemi comuni
/*
* Original code from TM1637 https://github.com/avishorp/TM1637
* Original code and library for DHT22 https://github.com/adafruit/DHT-sensor-library
* Watch the video for this code https://youtu.be/xD8wHXDzLkQ
* Other Arduino library and videos https://robojax.com
*/
/*
* Modified for Robojax video on January 10, 2018
* by Ahmad Nejrabi, in Ajax, Ontario, Canada
*/
// ****** Start of TM1637 Display code
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
// The amount of time (in milliseconds) between tests
#define TEST_DELAY 1000
TM1637Display display(CLK, DIO);
// ****** end of TM1637 Display code
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
// updated by Ahmad for Robojax.com videos.
// on January 10, 2018 in Ajax, Ontario, Canada
// ****** Start of DHT code
#include "DHT.h"
#define DHTPIN 9 // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
// ********** end of DHT22 code
#define RELAY 7 // the pin connected to relay
void setup()
{
Serial.begin(9600);
Serial.println("DHT22 Robojax Test with Display");
pinMode(RELAY,OUTPUT);// set RELAY pin as output
dht.begin();
}
void loop()
{
delay(TEST_DELAY);// wait
// **** TM1637 code start
display.setBrightness(0x0f);// set brightness
uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 };// clear display values
display.setSegments(data);//clear display
// **** TM1637 code end
// Robojax.com test video
Serial.println(getTemp("c"));
int temp = round(getTemp("c"));
display.showNumberDec(temp, false, 3,1);
if(temp >50 )
{
digitalWrite(RELAY, LOW);
}else{
digitalWrite(RELAY, HIGH);
}
}// loop end
/*
* getTemp(String req)
* returns the temperature related parameters
* req is string request
* getTemp("c") will return temperature in Celsius
* getTemp("hic") will return heat index in Celsius
* getTemp("f") will return temperature in Fahrenheit
* getTemp("hif") will return temperature in Fahrenheit
* getTemp("h") will return humidity
*/
float getTemp(String req)
{
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return 0.0;
}
// Compute heat index in Kelvin
float k = t + 273.15;
if(req =="c"){
return t;//return Celsius
}else if(req =="f"){
return f;// return Fahrenheit
}else if(req =="h"){
return h;// return humidity
}else if(req =="hif"){
return hif;// return heat index in Fahrenheit
}else if(req =="hic"){
return hic;// return heat index in Celsius
}else if(req =="k"){
return k;// return temperature in Kelvin
}else{
return 0.000;// if no request found, return 0.000
}
}
Cose di cui potresti avere bisogno
-
AmazonModulo relè a 4 canali su Amazonamzn.to
-
AliExpressAcquista modulo relè a 1 2 4 6 8 canali 5v 12vs.click.aliexpress.com
Risorse e riferimenti
-
Esterno
File📁
Librerie Arduino (zip)
-
Modulo PCB DHT22 rosso
DHT22-module-red.fzpz0.01 MB
File Fritzing
-
Sensore di temperatura DHT11
Temperature Sensor DHT11.fzpz0.01 MB -
Sensore di umidità e temperatura DHT22
DHT22 Humidity and Temperature Sensor.fzpz0.01 MB -
Modulo PCB DHT22 rosso
DHT22-module-red.fzpz0.01 MB -
Modulo DHT22 bianco
DHT22-module-white.fzpz0.01 MB -
Modulo a sette segmenti TM1637
TM1637.fzpz0.01 MB -
Sensore di Umidità e Temperatura DHT11 (3 pin)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB
Manuale dell'utente
-
Manuale dell'utente del sensore di temperatura e umidità DHT22
robojax-DHT22_manual.pdf0.36 MB