#define DHT_PIN 2
void setup() {
Serial.begin(9600);
}
void loop() {
float temperatura, umidita;
leggiDatiDHT22(temperatura, umidita);
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print("°C, Umidità: ");
Serial.print(umidita);
Serial.println("%");
delay(2000);
}
void leggiDatiDHT22(float &temperatura, float &umidita) {
byte dati[5];
trasmettiSegnale();
attesaRisposta();
attesaTrasmissione();
for (int i = 0; i < 5; i++) {
dati[i] = leggiByte();
}
temperatura = combinaByte(dati[2], dati[3]) / 10.0;
umidita = combinaByte(dati[0], dati[1]) / 10.0;
}
void trasmettiSegnale() {
pinMode(DHT_PIN, OUTPUT);
digitalWrite(DHT_PIN, LOW);
delay(18);
digitalWrite(DHT_PIN, HIGH);
delayMicroseconds(40);
}
void attesaRisposta() {
pinMode(DHT_PIN, INPUT);
while (digitalRead(DHT_PIN) == LOW);
}
void attesaTrasmissione() {
while (digitalRead(DHT_PIN) == HIGH);
}
byte leggiByte() {
byte valore = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(DHT_PIN) == LOW);
valore |= (durataAlto() > 50) << (7 - i);
}
return valore;
}
unsigned long durataAlto() {
unsigned long inizioTempo = micros();
while (digitalRead(DHT_PIN) == HIGH);
return micros() - inizioTempo;
}
unsigned int combinaByte(byte MSB, byte LSB) {
return (MSB << 8) | LSB;
}