// Definizione del pin al quale è collegato il sensore DHT22
#define DHT_PIN 4
void setup() {
// Inizializzazione della comunicazione seriale a 9600 bps
Serial.begin(9600);
}
void loop() {
// Dichiarazione delle variabili per temperatura e umidità
float temperatura, umidita;
// Legge dati dal sensore DHT22
leggiDatiDHT22(temperatura, umidita);
// Visualizza i dati sulla porta seriale
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print("°C, Umidità: ");
Serial.print(umidita);
Serial.println("%");
// Ritardo di 2 secondi prima di effettuare una nuova lettura
delay(2000);
}
// Funzione per leggere i dati dal sensore DHT22
void leggiDatiDHT22(float &temperatura, float &umidita) {
// Array per memorizzare i dati ricevuti dal sensore
byte dati[5];
// Trasmissione del segnale di start al sensore
trasmettiSegnale();
// Attesa della risposta del sensore (LOW)
attesaRisposta();
// Attesa dell'inizio della trasmissione dei dati (HIGH)
attesaTrasmissione();
// Lettura di 5 byte di dati dal sensore
for (int i = 0; i < 5; i++) {
dati[i] = leggiByte();
}
// Calcolo della temperatura e dell'umidità dai dati letti
temperatura = combinaByte(dati[2], dati[3]) / 10.0;
umidita = combinaByte(dati[0], dati[1]) / 10.0;
}
// Funzione per trasmettere il segnale di start al sensore
void trasmettiSegnale() {
// Configura il pin del sensore come OUTPUT e invia il segnale di start
pinMode(DHT_PIN, OUTPUT);
digitalWrite(DHT_PIN, LOW);
delay(18);
digitalWrite(DHT_PIN, HIGH);
delayMicroseconds(40);
}
// Funzione per attendere la risposta del sensore (LOW)
void attesaRisposta() {
// Configura il pin del sensore come INPUT e attende che il sensore risponda (LOW)
pinMode(DHT_PIN, INPUT);
while (digitalRead(DHT_PIN) == LOW);
}
// Funzione per attendere l'inizio della trasmissione dei dati (HIGH)
void attesaTrasmissione() {
// Attende che il sensore inizi a trasmettere i dati (HIGH)
while (digitalRead(DHT_PIN) == HIGH);
}
// Funzione per leggere un byte dalla trasmissione del sensore
byte leggiByte() {
// Variabile per memorizzare il byte letto
byte valore = 0;
// Loop per leggere ciascun bit del byte
for (int i = 0; i < 8; i++) {
// Attesa dell'inizio di un bit (LOW)
while (digitalRead(DHT_PIN) == LOW);
// Misurazione della durata dell'impulso (HIGH)
valore |= (durataAlto() > 50) << (7 - i);
}
// Restituzione del byte letto
return valore;
}
// Funzione per calcolare la durata dell'impulso
unsigned long durataAlto() {
// Dichiarazione della variabile per memorizzare il tempo di inizio dell'impulso
unsigned long inizioTempo = micros();
// Attende che l'impulso diventi LOW
while (digitalRead(DHT_PIN) == HIGH);
// Restituzione della differenza tra il tempo attuale e l'inizio dell'impulso
return micros() - inizioTempo;
}
// Funzione per combinare due byte in un valore unsigned int
unsigned int combinaByte(byte MSB, byte LSB) {
// Combina i due byte in un valore unsigned int
return (MSB << 8) | LSB;
}