rubinetto automatico

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
}
}

Perche' non usi semplicemente una fotocellula o fotoresistenza, per vedere quando e' buio ed attivare il circuito ? :wink:

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 ? :wink:

Mi sembra un'ottima idea :wink:

altrimenti potresti usare un rtc. Eviteresti che ti si accenda il circuito se un gabbiano ti si siede sul sensore :grin: (o se ci finisce una foglia sopra)

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.

Saluti,
Ivan

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”.

Grazie a tutti comunque.

Con questo non hai bisogno del reset.

// Progetto di apertura automatica dell'acqua di riempimento della piscina

#define ELETTROVALVOLA 12
#define SENSORE 11
#define INTERVALLO 28800000UL

unsigned long currenttime;
unsigned long starttime = 0;

void setup ()
{
	pinMode(ELETTROVALVOLA, OUTPUT);
	pinMode(SENSORE, INPUT);
}

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.

PaoloP:
Con questo non hai bisogno del reset.

// Progetto di apertura automatica dell'acqua di riempimento della piscina

#define ELETTROVALVOLA 12
#define SENSORE 11
#define INTERVALLO 28800000UL

unsigned long currenttime;
unsigned long starttime = 0;

void setup ()
{
pinMode(ELETTROVALVOLA, OUTPUT);
pinMode(SENSORE, INPUT);
}

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

Prego.

Di solito non si quota il messaggio immediatamente precedente. :wink: