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 )
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:
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
31 pings
Skip to comment form