Buongiorno a tutti
Dovrei creare un circuito che permetta di riaggiungere l’acqua alla piscina quando il livello è basso.
per rilevare il livello dell’acqua avrei pensato ad un sensore, mentre per immettere l’acqua la soluzione piu giusta mi sembra un’elettrovalvola. l’elettrovalvola necessita di 220v per funzionare, mentre arduino eroga al massimo 5v. Per risolvere tale problema ho deciso di usare un relè.
IL PROBLEMA PERO’, RIGUARDA LA PARTE SOFTWARE.
il sistema di aggiunta di acqua deve funzionare solo di notte, poichè di giorno quando c’è gente in piscina, il sensore darebbe un’impulso da alto a basso continuamente a causa del movimento dell’acqua. Ho iniziato a programmare e sono giunto al seguente problema. Se uso la funzione delay per variare il giorno dalla notte, non verrà contato il tempo in cui il rubinetto è aperto. avrei quindi pensato di usare la funzione millis e di collegare un pin al reset di arduino, in questo modo quando sono passate le 24 ore, l’arduino si riavvia automaticamente.
ci sono altri modi di risolvere questo problema?
grazie in anticipo
/progetto di apertura automatica dell’acqua di riempimento della piscina
viene collegato un cavo dal pin 10 al tasto di reset/
int orario=0; #define ELETTROVALVOLA 12 #define SENSORE 11 #define STOP 10
void setup (){
pinMode(ELETTROVALVOLA,OUTPUT);
pinMode(SENSORE,INPUT);
}
void loop (){
orario = millis();
if((SENSORE,LOW)and(orario<28800000)) { //se il livello è basso e sono trascorse meno di 8 ore…
digitalWrite(ELETTROVALVOLA,HIGH); //… accende l’elettrovalvola
}
else if((SENSORE,LOW)and(orario>28800000)) { //se il livello è basso ma sono trascorse piu di 8 ore…
} //non fare niente
else if(orario>28800000) { //se sono trascorse piu di 8 ore…
digitalWrite(ELETTROVALVOLA,LOW); //spengi l’elettrovalvola
}
else if((SENSORE,HIGH)and(orario<28800000)) { //il livello è alto è non sono trascorse 8 ore…
digitalWrite(ELETTROVALVOLA,LOW); //spengi l’elettrovalvola
}
else if(orario>86400000) { //dopo 24 ore…
digitalWrite(STOP,HIGH); //dai corrente al pin di reset e resetta il sistema
}
}
smanettone01:
in questo modo quando sono passate le 24 ore, l'arduino si riavvia automaticamente.
Non puoi usare un pin dell'Arduino per mandare a massa il reset. Non ce la farebbe.
Sul pin di reset il segnale basso deve durare un certo tempo, altrimenti il processo non si completa.
Non appena però il segnale basso viene "sentito", il chip si resetta: ma i pin inizialmente vengono settati come input, quindi il segnale basso verrebbe a mancare lasciando il processo di reset a metà.
Etemenanki:
Perche' non usi semplicemente una fotocellula o fotoresistenza, per vedere quando e' buio ed attivare il circuito ?
Ciao, ti hanno già risposto…
Puoi utilizzare una fotocellula che rileva la luminosità, e nel caso in cui la luminosità<parametro impostato effettui il controllo dell’altezza dell’acqua.
Oppure, per essere sicuri che sia veramente notte (non so se in prossimità della piscina sono presenti fonti di illuminazione) puoi utilizzare un RTC, come il DS1307; Puoi vedere come utilizzarlo nel mio seguente articolo: http://it.emcelettronica.com/realizziamo-temporizzatore-i-nostri-dispositivi-elettrici-fai-da-te.
I crepuscolari hanno isteresi e ritardi (che si possono introdurre anche via software), per evitare azionamenti frequenti ... inoltre mettendo il sensore in un contenitore opaco, riparato sotto una sporgenza e non rivolto verso eventuali luci,, eviti anche quei rischi ...
Ivan_Isk:
Ciao, ti hanno già risposto…
Puoi utilizzare una fotocellula che rileva la luminosità, e nel caso in cui la luminosità<parametro impostato effettui il controllo dell’altezza dell’acqua.
Oppure, per essere sicuri che sia veramente notte (non so se in prossimità della piscina sono presenti fonti di illuminazione) puoi utilizzare un RTC, come il DS1307; Puoi vedere come utilizzarlo nel mio seguente articolo: http://it.emcelettronica.com/realizziamo-temporizzatore-i-nostri-dispositivi-elettrici-fai-da-te.
Grazie mille per il link. Mi sembra un’ottima idea quella di usare un “temporizzatore”.
void loop ()
{
currenttime = millis();
if((digitalRead(SENSORE) == LOW) and (currenttime - starttime < INTERVALLO)) //se il livello è basso e sono trascorse meno di 8 ore…
{
digitalWrite(ELETTROVALVOLA, HIGH); //… accende l’elettrovalvola
}
else if((digitalRead(SENSORE) == LOW) and (currenttime - starttime > INTERVALLO)) //se il livello è basso ma sono trascorse piu di 8 ore…
{
} //non fare niente
else if(currenttime - starttime > INTERVALLO) //se sono trascorse piu di 8 ore…
{
digitalWrite(ELETTROVALVOLA, LOW); //spengi l’elettrovalvola
}
else if((digitalRead(SENSORE) == HIGH) and (currenttime - starttime < INTERVALLO)) //il livello è alto è non sono trascorse 8 ore…
{
digitalWrite(ELETTROVALVOLA, LOW); //spengi l’elettrovalvola
}
else if(currenttime - starttime > 86400000UL) //dopo 24 ore…
{
starttime = currenttime; //resetta il conteggio
}
}
C'erano diversi errori nel codice.
Potresti usare un Tiny85 per ridurre gli ingombri.
Grazie mille. Hai semplificato il tutto. Anche io avevo pensato di utilizzare la funzione millis, ma non avevo trovato il modo di usarla oltre le 24 ore.
Grazie ancora