Termostato e sensore di livello con Arduino

Oggi ti racconto il progetto di Stefano: Termostato e sensore di livello con arduino. Tutto ha avuto inizio quando Stefano commentando l’articolo sull’RTC mi ha chiesto una mano per il suo progetto a cui ho risposto ( leggi risposte nei commenti )

Termostato e sensore di livello con arduino e DS18B20

Oggi mi ha scritto per informarmi di aver realizzato quello a cui stava lavorando e la volontà di condividere con altri appassionati il suo lavoro.

Non ho saputo resistere e siccome questo blog è nato anche con lo scopo di diffondere tutti i progetti e le idee che riguardano le passioni che ci accomunano ho voluto dedicare a Stefano questo articolo.

Lo schema del Termostato e sensore di livello con arduino

Lo schema realizzato da Stefano è quello che hai visto in copertina e che ti ripropongo per leggerlo insieme:

Termostato e sensore di livello con arduino e DS18B20

Il Termostato e sensore di livello con Arduino si basa sui seguenti componenti:

  • n.1 arduino UNO
  • n.1 sonda temperatura DS18B20
  • n.1 sonda di livello
  • n.1 Lcd 16×2
  • n.1 relay shield
  • n. 2 pulsanti n.a.
  • n.1 potenziometro da 20Kohm
  • n.3 resistenze di pull-up da 10Kohm ciascuna
  • n.1 resistenza da 4,7Kohm

I collegamenti nello schema sono chiari:

la sonda è connessa al pin 13 di arduino mediante la resistenza da 4,7Kohm;

il display LCD 16×2 è collegato ai pin 2,3,4,10,11 e 12;

la sonda di livello è connessa al pin A3 ( Analogico 3 ) mediante una delle resistenze di pull-up da 10Kohm;

i pulsanti sono connessi al pin A1 ed A2 mediante le altre due resistenza di pull-up da 10Kohm.

Lo sketch del Termostato e sensore di livello con Arduino

Lo sketch lo puoi prelevare direttamente dal sito di Stefano, lo riporto per completezza dell’articolo:

/*
Termostatino antigelo:
Lettura sensore termico ds18b20, visualizzazione su display 16x2,
modifica soglia con 2 pulsanti + e - su ingressi analogici,
visualizzazione soglia durante la modifica,
Sensore di livello ad immersione tramite ingresso analogico e
comando relais.
Pin Analogico 1 = pulsante incremento temperatura soglia
Pin Analogico 2 = pulsante riduzione temperatura soglia
Pin Analogico 3 = sonda di livello
Pin Digitali 2, 3, 4, 10, 11, 12 = lcd DB7, DB6, DB5, DB4, E, RS
Pin digitali 5, 6, 7, 8 = modulo relais
Pin Digital 13 = linea dati sensore DS18B20
Piedinatura DS18B20: pin 1 = GND, pin 2 = DQ, pin 3 = Vdd (Valida tra 3,3V e 5V)
*/

#include <OneWire.h>         //libreria per ds18b20
#include <DallasTemperature.h>      //libreria per conversione valore
#include <swRTC.h>                      //libreria per RTC
#include <LiquidCrystal.h>              //libreria per lcd
#define ONE_WIRE_BUS 13                   // Il terminale data del sensore è connesso alla porta 13 di Arduino

OneWire oneWire(ONE_WIRE_BUS);           // Imposto la comunicazione oneWire per il ds18b20
DallasTemperature sensors(&oneWire);   // Passo le info di oneWire alla DallasTemperature
LiquidCrystal lcd(12, 11, 10, 4, 3, 2); //stabilisco le uscite digitali per lcd 4 bit
swRTC rtc;                              //creo un'istanza della libreria RTC

  int rele_out1 = 5;     //stabilisco l'uscita digitale per il relè 1
  int rele_out2 = 6;     //stabilisco l'uscita digitale per il relè 2
  int rele_out3 = 7;     //stabilisco l'uscita digitale per il relè 3
  int rele_out4 = 8;     //stabilisco l'uscita digitale per il relè 4
  int pulsantepiu;       //pulsante incremento temperatura di soglia
  int pulsantemeno;      //pulsante diminuisco temperatura di soglia
  int tx;                //temperatura di soglia
  int cont;              //contatore usato per ottenere un valore medio di temperatura
  int temperatura;       //temperatura rilevata
  int durata;            //conteggio minuti per temporizzazione
  int livello;       //ingresso sonda livello 170 cm

  byte grado[8] = {      //creo i dati per il carattere °
  0b00010,
  0b00101,
  0b00010,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
};

void setup(){

  Serial.begin(9600);           //inizializzo la seriale
  sensors.begin();      //inizializzo la libreria per leggere il sensore
  lcd.createChar(0, grado);     //associo i dati del ° al carattere custom 0
  lcd.begin(16, 2);             //dichiaro il tipo di lcd
  pinMode(rele_out1, OUTPUT);   //assegno il modo uscita digitale al pin 5
  pinMode(rele_out2, OUTPUT);   //assegno il modo uscita digitale al pin 6
  pinMode(rele_out3, OUTPUT);   //assegno il modo uscita digitale al pin 7
  pinMode(rele_out4, OUTPUT);   //assegno il modo uscita digitale al pin 8

  tx = 1;                       //temperatura di soglia iniziale (valore di sicurezza in caso di interruzioni di alimentazione)
  pulsantepiu = 0;              //assegno valore 0 iniziale al pulsantepiù
  pulsantemeno = 0;             //assegno valore 0 iniziale al pulsantemeno
  livello = 0;         //assegno valore 0 iniziale alla sonda di livello

  rtc.stopRTC();                //blocco RTC per inserire i valori iniziali
  rtc.setTime(0, 00, 00);       //metto valori a zero perché
  rtc.setDate(01, 01, 2012);    //devo usare RTC solo come timer
  rtc.startRTC();               //avvio RTC

}

void loop() {

   sensors.requestTemperatures();    // Invia il comando di lettura delle temperatura
   int durata = rtc.getMinutes();    //acquisisco i minuti 

   if (durata > 10){                       //se durata è maggiore di 10 minuti
      rtc.stopRTC();                  //blocco RTC
      rtc.setTime(0, 00, 00);         //azzero i valori
      rtc.setDate(01, 01, 2012);      //per poter riconteggiare da zero
      rtc.startRTC();                 //riavvio rtc
   }

   int pulsantepiu = analogRead(A1);    //lettura ingresso analogico 1 e assegnazione del valore a pulsantepiù
   int pulsantemeno = analogRead(A2);   //lettura ingresso analogico 2 e assegnazione del valore a pulsantemeno

   if (pulsantepiu == 0){                        //se il pulsantepiù vieno premuto verso il negativo
      tx = tx ++;                           //la variabile temperatura di soglia tx incrementa di una unita
      lcd.clear();               //cancello il display
      lcd.print("Temperatura di");         //scrivo un testo
      lcd.setCursor(0, 1);                 //riposiziono il cursore
      lcd.print("soglia: ");            //scrivo di nuovo un testo
      lcd.print(tx,DEC);            //scrivo il valore impostato della temperatura di soglia
      lcd.write((byte)0);            //scrivo il °
      lcd.print ("C");                      //scrivo il C di Celsius
      delay(1000);                          //ritardo di 1 secondi per la lettura
   }

   if (pulsantemeno == 0){                       //se il pulsantemeno vieno premuto verso il negativo
      tx = tx --;                           //la variabile temperatura di soglia tx decrementa di una unità
      lcd.clear();               //cancello il display
      lcd.print("Temperatura di");         //scrivo un testo
      lcd.setCursor(0, 1);                 //riposiziono il cursore
      lcd.print("soglia: ");            //scrivo di nuovo un testo
      lcd.setCursor(10, 1);            //riposiziono il cursore
      lcd.print(tx,DEC);            //scrivo il valore impostato della temperatura di soglia
      lcd.write((byte)0);            //scrivo il °
      lcd.print ("C");                      //scrivo il C di Celsius
      delay(1000);                          //ritardo di 1 secondi per la lettura
   }

    while (analogRead(A3) == 0) {         //lettura ingresso analogico A3 e confronto con valore 0 (CONTATTO CHIUSO)
      lcd.clear();            //con il livello troppo alto avviso su display
      lcd.print ("! Livello Alto !");      //che il livello  è alto e
      lcd.print(" Valvola Aperta ");      //che apro la valvola
      digitalWrite(rele_out1, HIGH);      //comando anche il rele 1 di apertura valvola
      digitalWrite(rele_out2, HIGH);      //comando anche il rele 2 di apertura valvola
      digitalWrite(rele_out3, HIGH);      //comando anche il rele 3 di apertura valvola
      digitalWrite(rele_out4, HIGH);      //comando anche il rele 4 di apertura valvola
   }

/*Lettura temperatura con ds18b20 */
    int temperatura = sensors.getTempCByIndex(0);   //lettura ingresso digitale 13 e assegnazione del valore alla variabile temperatura

   if(temperatura <= tx && durata == 10){           //se la temperatura rilevata è minore o uguale rispetto
      lcd.clear();            //alla temperatura di soglia e il tempo
      lcd.print("Temperatura ");      //trascorso dall'ultimo ciclo è di 10 minutì
      lcd.print(temperatura,DEC);             //scrivo sul display il valore e
      lcd.write((byte)0);                     //avviso che il contatto è chiuso
      lcd.print("C");
      lcd.setCursor(0, 1);                    //con la scritta " Valvola Aperta "
      lcd.print(" Valvola Aperta ");          //per finire
      digitalWrite(rele_out1, HIGH);           //comando anche il rele 1 di apertura valvola
                digitalWrite(rele_out2, HIGH);           //comando anche il rele 2 di apertura valvola
      digitalWrite(rele_out3, HIGH);      //comando anche il rele 3 di apertura valvola
                digitalWrite(rele_out4, HIGH);          //comando anche il rele 4 di apertura valvola
      delay(60000);                           // e comando i relè per un minuto
   }else{                  //altrimenti scrivo
      lcd.clear();            //sempre sul display
      lcd.print("  Temperatura");      //il valore
      lcd.setCursor(0, 1);
      lcd.print("rilevata:  ");
      lcd.print(temperatura,DEC);
      lcd.write((byte)0);
      lcd.print("C");
      digitalWrite(rele_out1, LOW);      //mantengo bassa l'uscita digitale 5
      digitalWrite(rele_out2, LOW);      //mantengo bassa l'uscita digitale 6
      digitalWrite(rele_out3, LOW);      //mantengo bassa l'uscita digitale 7
      digitalWrite(rele_out4, LOW);      //mantengo bassa l'uscita digitale 8

        }
/*invio le inforamazioni anche al serial monitor della IDE*/

        Serial.print ("temperatura di soglia = ");
   Serial.println (tx, DEC);
        Serial.println (" ");
        Serial.print ("Temperatura rilevata = ");
        Serial.println (temperatura, DEC);
        Serial.println (" ");
        Serial.println (" ");
   Serial.println("durata");
   Serial.println(durata,DEC);
   Serial.println(rtc.getSeconds(),DEC);
        Serial.println (" ");
        Serial.println (" ");
}

Grazie Stefano !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/termostato-e-sensore-di-livello-con-arduino.html

Lascia un commento

Your email address will not be published.

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