lunedì 18 luglio 2022

Termostato con DHT22

Questo articolo dimostra come implementare un termostato impiegando il sensore di temperatura DHT22. L'articolo precedente (questo) descrive un termostato basato su una sonda di temperatura NTC. La domanda mi viene spontanea, quanto codice del precedente articolo posso riusare?

Una caratteristica qualitativa del codice è la riusabilità, se nel precedente articolo ho scritto codice di qualità eccellente mi devo aspettare una riusabilità eccellente.

Il motto è scrivi una sola volta il codice e riusalo tutte le volte che serve. Il codice scritto nel precedente articolo non è eccellente ma è riusabile e questa non è una caratteristica da sottovalutare. 

Sicuramente la funzione checkTermostat() è riusabile come pure la parte di codice presente nella funzione loop() che mi permette di regolare il setpoint tramite il potenziometro. Le funzioni analog16samples() e getTemperature() non servono più e vengono quindi rimosse. Di seguito la funzione loop() modificata per lavorare con il DHT22:

void loop() {
// Non possiamo leggere il sensore ad intervalli
// di tempo inferiori di 2 secondi.
if (millis() - g_timer2sec >= 2000) {
g_timer2sec = millis();
int chk = dht22.read22(DHTPIN);
if (chk == DHTLIB_OK) {
dtostrf(dht22.temperature, 6, 1, temperatureBuffer);
lcd.setCursor(0, 1);
lcd.print(temperatureBuffer);
// da floart x 10 a int16_t
g_temperature = dht22.temperature * 10;
// chiama la funzione termostato
bool thState = checkThermostate(digitalRead(g_relayPin));
digitalWrite(g_relayPin, thState);
// visualizza ON/OFF sul display
lcd.setCursor(10, 0);
lcd.print(onoff[thState]);
} else {
// qui la gestione degli errori relativi al DHT22
}
}
// usa struttura di supporto
mySetpoint._old = analogRead(A1);
if (mySetpoint._old != mySetpoint._new) {
mySetpoint._new = mySetpoint._old;
float stpf = mySetpoint._new / 13.3;
g_setpoint = stpf * 10; // da float x 10 a uint16_t
dtostrf(stpf, 6, 1, temperatureBuffer);
lcd.setCursor(0, 0);
lcd.print(temperatureBuffer);
}
} // end void loop()

Nel loop ci serve eseguire del codice con temporizzazione di 2 secondi, a questo serve la if (millis() - g_timer2sec .... Ogni due secondi interroghiamo il DHT22, la temperatura viene visualizzata sul display, poi convertita a int16_t e il valore salvato nella variabile g_temperature. Il resto del codice è quasi uguale a quello presente nel precedente articolo.

Per la conversione a int16_t moltiplichiamo per 10 (es. 24.1°C x 10 = 241), il risultato della moltiplicazione viene assegnato alla variabile g_temperature e la conversione da tipo float a tipo int16_t viene fatta magicamente dal compilatore.

Moltiplichiamo per 10 poiché il sensore ha risoluzione di 0.1°C (decimi di grado), mentre con il sensore NTC moltiplicavamo per 100 così da avere risoluzione di 0.01°C (centesimi di grado).

  • Nota sul relay: Il relay presente nel progetto è connesso direttamente ad un pin di arduino, ciò è possibile solo con il simulatore, nella pratica non si fa per non guastare arduino.

Poiché moltiplichiamo la temperatura per 10, facciamo la stessa cosa con il setpoint e l'isteresi. La modifica per il setpoint si riduce a:

g_setpoint = stpf * 10; // da float x 10 a uint16_t

Come sempre, per concludere il link al progetto con il simulatore online wokwi.

Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale

Nessun commento:

Posta un commento