Perchè questo progetto
Questo progetto nasce dalla necessità di controllare il livello d’acqua della cisterna di casa.
Purtroppo l’acqua in casa non arriva ogni giorno per cui è necessario avere dei recipienti o una cisterna per la raccolta della stessa quando è disponibile. A tal proposito nasceva l’esigenza di controllarne il livello in modo automatico perchè il controllo manuale della valvola mi esponeva a possibili (già successi) rischi di rimanere senz’acqua o di fuoriuscita dell’acqua se troppo piena.
Così ho deciso di realizzare un progetto a basso costo che automatizzasse il processo di riempimento della cisterna con controllo “troppo pieno”.
Materiali utilizzati
Per prima cosa ho comprato una valvola motorizzata a 2 vie DN20 (3/4) – 3 fili, circa 30 € su Amazon.
e l’ho montata all’interno della cisterna, sul tubo di entrata dell’acqua.
Altro componente necessario era il sensore di livello, in particolare ne ho comprati 5 a poco meno di un 1 € l’uno su Aliexpress.
Per quello che mi serviva andava bene usarne solo uno, ma con l’occasione ho voluto metterne di più per sapere in ogni momento il livello dell’acqua nella cisterna.
Realizzazione progetto
Così ho proceduto con la realizzazione dell’asta che tenesse distanziati i vari sensori di livello come si evince in foto
collegando fra loro un polo dei sensori. Alla fine del lavoro i fili di quest’asta che portavo fuori dalla cisterna erano 6, 5 fili uno per ogni sensore e il comune di tutti.
Di seguito pubblico il vecchio schema (per mancanza di tempo non l’ho mai riportato al pc) così da rendere l’idea di come ho effettuato i collegamenti:
In particolare, i sensori sono collegati alle 5 porte analogiche dell’arduino (da A0 a A4), dal pin 2 al pin 6 ci sono i led di livello (il 2 è il più basso), pin 7 e 8 sono i led di stato della valvola, utile per capire in ogni istante se è chiusa o aperta. Gli ultimi due pin sono collegati ai relè di apertura/chiusura della valvola motorizzata.
In realtà i led per indicare il livello dell’acqua sono solo 4 e altrettanti i sensori di livello, il 5 l’ho messo solo per emergenza, nel caso in cui ad esempio il sensore n. 4 dovesse bloccarsi e non rilevare quindi il livello, con conseguente fuoriuscita dell’acqua.
Questo a lavoro finito:
Come funziona
Il funzionamento del codice è il seguente:
- all’avvio apre la valvola (sia che era chiusa o aperta) e accende il led corrispondente
- ogni minuto di contatto chiuso del singolo sensore apre la valvola (per i primi 3 sensori)
- dal 4° sensore invece avviene il controllo inverso, se il sensore chiude il circuito allora chiude la valvola, se lo apre allora riapre la valvola.
- il 5° sensore, a contatto chiuso, serve solo per chiudere la valvola (ma non dovrebbe mai succedere, dato che dovrebbe essere compito del 4° sensore)
Sketch Arduino
A seguire invece lo sketch per arduino:
//Sketch arduino con sensore orizzontale livello acqua int sensore1 = A0; // Analog Input int sensore2 = A1; int sensore3 = A2; int sensore4 = A3; int sensore5 = A4; int led1 = 2; //livello basso ROSSO 330 Ω int led2 = 3; //livello medio-basso ROSSO int led3 = 4; //livello medio GIALLO int led4 = 5; //livello medio-alto VERDE int led5 = 6; //livello alto BLU int led_val_open = 7; int led_val_closed = 8; int threshold = 700; int valvola_apri = 9; int valvola_chiudi = 10; int stato_valvola = 1; //1 aperta, 0 chiusa int contatore1 = 0; int contatore2 = 0; int contatore3 = 0; int contatore4 = 0; int contatore5 = 0; int primo_avvio = 1; // the setup routine runs once when you press reset: void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led_val_open, OUTPUT); pinMode(led_val_closed, OUTPUT); pinMode(valvola_apri, OUTPUT); //relè apri valvola pinMode(valvola_chiudi, OUTPUT); //relè chiudi valvola } void loop() { if(primo_avvio == 1){ digitalWrite(valvola_chiudi, HIGH); // High per disattivarlo delay(1000); Serial.println("Apertura valvola all'avvio Arduino..."); digitalWrite(valvola_apri, LOW); // relè è 5V attivo basso, quindi low per attivarlo delay(20000); digitalWrite(valvola_apri, HIGH); // High per disattivarlo stato_valvola = 1; digitalWrite(led_val_open, HIGH); Serial.println("Valvola aperta!"); primo_avvio = 0; } //sensore 1 int sensore1_val = analogRead(sensore1); Serial.println(sensore1_val); if(analogRead(sensore1) < threshold){ while (analogRead(sensore1) < threshold && contatore1 < 60) { Serial.println(contatore1); contatore1++; delay(1000); } if (contatore1 == 60){ if( digitalRead(led1) != HIGH ){ digitalWrite(led1, HIGH); } } contatore1 = 0; } else { digitalWrite(led1, LOW); if(stato_valvola == 0){ digitalWrite(valvola_apri, LOW); Serial.println("Apertura valvola da sensore 1 in corso..."); delay(20000); Serial.println("Valvola aperta!"); digitalWrite(valvola_apri, HIGH); stato_valvola = 1; digitalWrite(led_val_open, HIGH); digitalWrite(led_val_closed, LOW); } } //sensore 2 if(analogRead(sensore2) < threshold){ while (analogRead(sensore2) < threshold && contatore2 < 60) { contatore2++; delay(1000); //Serial.println("Contatore partito per sensore 2"); Serial.println(contatore2); //int sensore2_val = analogRead(sensore2); //Serial.println(sensore2_val); } if(contatore2 == 60){ if( digitalRead(led2) != HIGH ){ digitalWrite(led2, HIGH); } } contatore2 = 0; } else { digitalWrite(led2, LOW); if(stato_valvola == 0){ digitalWrite(valvola_apri, LOW); Serial.println("Apertura valvola da sensore 2 in corso..."); delay(20000); digitalWrite(valvola_apri, HIGH); Serial.println("Valvola aperta!"); stato_valvola = 1; digitalWrite(led_val_open, HIGH); digitalWrite(led_val_closed, LOW); } } //sensore 3 if(analogRead(sensore3) < threshold){ while (analogRead(sensore3) < threshold && contatore3 < 60) { contatore3++; delay(1000); Serial.println("Contatore partito per sensore 3"); Serial.println(contatore3); } if(contatore3 == 60){ if( digitalRead(led3) != HIGH ){ digitalWrite(led3, HIGH); } } contatore3 = 0; } else { digitalWrite(led3, LOW); if(stato_valvola == 0){ digitalWrite(valvola_apri, LOW); Serial.println("Apertura valvola da sensore 3 in corso..."); delay(20000); digitalWrite(valvola_apri, HIGH); stato_valvola = 1; digitalWrite(led_val_open, HIGH); digitalWrite(led_val_closed, LOW); } } //sensore 4 if(analogRead(sensore4) < threshold){ while (analogRead(sensore4) < threshold && contatore4 < 60) { contatore4++; delay(1000); Serial.println("Contatore partito per sensore 4"); Serial.println(contatore4); //int sensore4_val = analogRead(sensore4); //Serial.println(sensore4_val); } if(contatore4 == 60){ //Serial.println(bitRead(PORTD,4)); if( digitalRead(led4) != HIGH ){ digitalWrite(led4, HIGH); Serial.println("Led 4 high"); Serial.println("Chiusura valvola da sensore 4 in corso..."); digitalWrite(valvola_chiudi, LOW); delay(20000); digitalWrite(valvola_chiudi, HIGH); stato_valvola = 0; digitalWrite(led_val_open, LOW); digitalWrite(led_val_closed, HIGH); } } contatore4 = 0; } else { if (digitalRead(led4) == HIGH){ digitalWrite(led4, LOW); Serial.println("Led 4 low"); Serial.println("Apertura valvola da sensore 4 in corso..."); digitalWrite(valvola_apri, LOW); //Apre la valvola delay(20000); digitalWrite(valvola_apri, HIGH); stato_valvola = 1; digitalWrite(led_val_open, HIGH); digitalWrite(led_val_closed, LOW); } } //sensore 5 if(analogRead(sensore5) < threshold){ while (analogRead(sensore5) < threshold && contatore5 < 20) { contatore5++; delay(1000); Serial.println("Contatore partito per sensore 5"); Serial.println(contatore5); //int sensore5_val = analogRead(sensore5); //Serial.println(sensore5_val); } if(contatore5 == 20){ if ( digitalRead(led5) == LOW){ digitalWrite(led5, HIGH); contatore5 = 0; Serial.println("Led 5 high"); Serial.println("Chiusura valvola da sensore 5 in corso..."); digitalWrite(valvola_chiudi, LOW); delay(20000); digitalWrite(valvola_chiudi, HIGH); stato_valvola = 0; digitalWrite(led_val_open, LOW); digitalWrite(led_val_closed, HIGH); } } contatore5 = 0; } else { digitalWrite(led5, LOW); } }
Per qualsiasi informazione commentate qui sotto.