Arduino temperatura con isteresi

Arduino temperatura con isteresi è nata come idea di progetto in questi caldi giorni di Agosto 2019.

La temperatura elevata ti ha, probabilmente, fatto pensare alla possibilità di gestire il condizionatore di casa o di realizzarti un ventilatore portatile.

I progetti arduino che coinvolgono la temperatura sono solitamente più frequenti per le centraline di controllo caldaia ( o  stufa ).

In alternativa trovi molti progetti di monitoraggio delle temperature di ambienti casalinghi.

E’ più complesso trovare centraline di controllo per condizionatore ( o ventilatore ) anche se di fatto presentano un funzionamento identico ai primi.

Probabilmente le centraline sono più richieste in inverno o, semplicemente, d’estate siamo al mare e tralasciamo i progetti con Arduino.

Centralina di condizionamento Arduino

Il progetto che leggi: arduino temperatura con isteresi è applicabile sia alle centraline di controllo della caldaia invernale sia per il controllo del condizionatore d’estate.

La differenza è solo nelle condizioni di controllo applicate, leggerai di seguito dove.

Usando il tool thinkercad puoi realizzare e testare un esempio di controllo della temperatura simulato:

in particolare nello sketch che ho realizzato per questo progetto l’accensione e lo spegnimento è simulato con due led:

  • Rosso per l’impianto spento
  • Verde per l’impianto acceso

e nel video seguente puoi vedere una demo del comportamento:

in cui l’isteresi interviene tra la soglia minima e la soglia massima impostate.

Come funziona il progetto Arduino temperatura con isteresi

La definizione di isteresi la trovi su wikipedia:

ed è il fenomeno che utilizza il progetto arduino temperatura con isteresi per evitare il fastidioso accendi/spegni al passaggio tra un valore di temperatura ed il suo precedente.

In pratica l’isteresi risolve il problema della soglia unica, ossia se imposti la temperatura di azione del condizionatore a 18°C e non applichi alcun meccanismo di isteresi ottieni il fenomeno per cui sopra i 18°C ( da 19 in poi ) si accende e sotto i 18°C ( ossia da 17 in giù ) si spegne.

Questo causa un accendi/spegni/accendi continuo perché non considera un valore di tolleranza ma cambia stato sulla base di un singolo valore istantaneo.

Utilizzando un algoritmo di isteresi avrai due soglie impostate, ad esempio, la minima e la massima.

In questo esempio trovi 18°C come minima e 22°C come soglia massima.

La temperatura rilevata viene continuamente confrontata con queste due soglie e con l’ultimo valore rilevato in modo che il passaggio di stato sia mitigato da quest’ultimo.

Come hai visto nel video se la temperatura passa da 16 a 18 gradi centigradi il sistema persevera nella precedente condizione ( spento ) fino al raggiungimento della soglia massima dei 22 gradi impostati.

Sopra i 22 gradi centigradi il condizionatore resta acceso per abbassare la temperatura dell’ambiente.

Arrivando dai 25-24-23 gradi verso i 22 gradi e proseguendo con 21, 20,19 il condizionatore resta acceso fino al superamento della soglia inferiore ( 18°C ) momento in cui si spegne.

Sketch del progetto

Il progetto arduino temperatura con isteresi lo puoi trovare qui ed è il seguente:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define pinTemp A0
#define pinR 6
#define pinG 7

float min = 18.0;
float max = 22.0;

byte grad[8] = {
  B01100,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000,
};

void setup() {
  Serial.begin( 9600 );
  pinMode( pinTemp,INPUT );
  
  pinMode( pinR,OUTPUT );
  pinMode( pinG,OUTPUT );
  
  lcd.begin(16, 2);
  lcd.createChar(0, grad);
  lcd.print("Temperature:");
}

void loop() {
  float temp = ((analogRead(pinTemp) * (5.0/1024))-0.5 )/0.01;
  
  digitalWrite( pinG,isteresi(temp) );
  digitalWrite( pinR,!isteresi(temp) );
  
  lcd.setCursor(0, 1);
  lcd.print("       ");
  lcd.setCursor(0, 1);
  lcd.print( temp );
  lcd.write(byte(0));
  
  Serial.println( temp );
  delay( 1000 );
}

bool oldRetCode;

bool isteresi(float temp) {

  bool retCode = false;
  if (temp > max) {
    retCode = true;
    showLcd(" on");
  } else if ( temp < min ) {
    retCode = false;
    showLcd("off"); 
  } else {
    retCode = oldRetCode;
  }
  
  oldRetCode = retCode;
  return retCode;
}

void showLcd(String valore) {
  
  lcd.setCursor(13, 1);
  lcd.print("   ");
  lcd.setCursor(13, 1);
  lcd.print( valore );
}

in cui la logica è inserita nelle linee 37 e 38 in cui i due led sono uno acceso e l’altro pento in funzione del valore restituito dalla funzione booleana isteresi presente alle linee 52-67;

linea 52: definisci la funzione di tipo boolean, ossia in grado di restituire un valore booleano, e che accetta in ingresso un valore di temperatura sulla base del quale esegue e valutazioni.

linea 54: imposta il valore di ritorno della funzione come false;

linee 55-57: confronta il valore di temperatura con la soglia massima ed al superamento imposta a true il return code;

linee 58-60: confronta il valore di temperatura con la soglia minima ed al superamento imposta a false il return code;

linea 62: in caso di valore sia compreso tra la soglia minima e quella massima restituisci il valore precedentemente salvato nella variabile oldRetCode;

linee 65-66: reimposta il valore di oldRetCode come retCode in modo da salvare il valore corrente prima di restituirlo alla funzione chiamante ( loop ); e restutuisci il valore con il comando return.

Si tratta di uno degli algoritmi di isteresi più semplice.

In questo modo avrai sempre la situazione precedente quando sei nell’intervallo dei valori di soglia impostati e cambierai stato solo fuori da tale intervallo di valori.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/arduino-temperatura-con-isteresi.html

2 commenti

    • Giorgio il 2 Dicembre 2020 alle 19:35
    • Rispondi

    buongiorno, il progetto è molto interessante, vorrei chiedere se è possibile sostituire il sensore con un DS18B20? con il tmp36 ho troppe fluttuazioni, però con il nuovo sensore non riesco ad impostare la boleana, ho aggiunto anche un rtc, con cui sarebbe possibile variare la T in notturna, ed ho un lcd 2004 i2c, poi pensavo anche ad un potenziometro per modificare al volo la T max (da 5 antigelo a 22), ed impostare all’interno del programma non Tmin ma deltaT
    Grazie, Giorgio

    1. Ciao Giorgio,
      per rispondere alla tua domanda, si è possibile, dovrai sostituire il codice di lettura della sonda tmp36 con quello della lettura del DS18B20 e ovviamente cambiare lo schema elettronico per adattare i collegamenti di quest’ultima.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.