automazione in acquario

buona sera a tutti quanti, mi presento, mi chiamo Andrea, ho 25 anni e tra le mille passioni tra foto, pc, acquario, montagna, ecc.. ho scoperto anche questa nuova '' passione'' se così si può chiamare, L'Arduino....

è da molto poco che '' gioco'' con questo strumento a dir poco fantastico...

e come tutto eccoci qui con i primi problemi a cui devo iniziare a chiedere consiglio, a voi che siete ormai degli highlander.

vi posto il programma che ho fatto e quello che volevo farli fare..

int RELE1 = 11;    //osmosis pump 
int RELE2 = 10;    //return pump H2O
int GALLEG1 = 7;  //floating button 1 osmosis
int GALLEG2 = 6;  //floating button 2 osmosis
int GALLEG3 = 5;  //floating button 3 over full main tank
int PULS1 = 4;  //button for switch off the return pump H2O
int VAL1;
int VAL2;
int VAL3;
int VAL4;
int vec_VAL4;
int stato;

void setup() {                
  pinMode(GALLEG1, INPUT);
  pinMode(GALLEG2, INPUT);
  pinMode(GALLEG3, INPUT);
  pinMode(PULS1, INPUT);
  pinMode(RELE1, OUTPUT);
  pinMode(RELE2, OUTPUT);
  

}

void loop(){
  VAL1 = digitalRead(GALLEG1);
  VAL2 = digitalRead(GALLEG2);
  VAL3 = digitalRead(GALLEG3);
  VAL4 = digitalRead(PULS1);
  
  if ((VAL1==HIGH) && (VAL2 == HIGH)){  
    digitalWrite(RELE1, HIGH);  
  }
  else{
    digitalWrite(RELE1, LOW);
  }
  if (VAL3==LOW){
    digitalWrite(RELE2, HIGH);
  }
  else{
    digitalWrite(RELE2, LOW);
  }              //till here program work
                  //from here I have copy the program for switch off the returning pump 
                  //It doesn't work. RELE2 never off
  if ((VAL4 == HIGH) && (vec_VAL4 == LOW)) {  
    stato = 1 - stato;
  }  
  
  vec_VAL4= VAL4; 
  
  if (stato == 1) {
    digitalWrite(RELE2 , HIGH);    
  }
  else {  
    digitalWrite(RELE2, LOW);     
  }
}

ovviamente il programma non fa ciò che avevo in mente, quello che dovrebbe fare è molto easy da spiegare a parole, ma difficile da '' scrivere''. supponendo che io abbia 2 vasche su 2 piani, messe in comunicazione con una pompa ( pompa di risalita- RELE2) questa pompa deve spegnersi qualora il galleggiante (GALLEG3) posto nella vasca superiore, rilevi che ci sia una quantità superiore d'acqua al '' pelo dell'acqua'' e che la pompa torni in funzione quando il rischio allagamento sia cessato... poi sempre la stessa pompa deve spegnersi quando io premo un pulsante (PULS1) e che si riaccenda alla mia successiva pressione. vedi schizzo sotto per i collegamenti

https://www.dropbox.com/sh/f4h22cj4g23du4r/AABl2N13mLr5HDsW-rbrAaYpa

spero di essere stato in grado di spiegare il mio problema. ciao ciao a presto Andrea

Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0

due cose non mi sono chiare. 1. nella tua analisi parli solo di puls1, rele2 e galleg3, ma hai altro rele e altri gallegianti. 2. non mi è chiaro quello che vuoi fare con il pulsante. Se il tuo programma controlla attraverso rele2 e galleg3 il livello dell'acqua, cosa deve fare il puls1 ? Solo spegnere, quindi uno stop di emergenza ?

Per quel che ho potuto capire (tu hai stato con solo 2 valori): - devi crearti una variabile esempio StatoRele2 che può assumere tre valori, ACCESO, SPENTO e DISATTIVO; creati 3 costanti numeriche con questi nomi:

const byte DISATTIVO=0;
const byte SPENTO=1;
const byte ACCESO=2;
byte StatoRele2=SPENTO;
  • Parti con lo stato SPENTO nella setup()
  • lo stato lo cambi in base al livello galleg3 (ovvero controlli il galleggiante) solo se StatoRele2 è diverso da DISATTIVO; in base al galleg3 vari solo lo StatoRele2 tra ACCESO e SPENTO.
  • controlli il valore di puls1, se premuto e StatoRele2 diverso da DISATTIVO allora StatoRele2=DISATTIVO, se era DISATTIVO allora StatoRele2=SPENTO.
  • se lo StatoRele2 è ACCESO attivi il rele2, altrimenti lo disattivi. Quindi fai digitalWrite sul Rele in base allo StatoRele2 (3 stati ma solo 1 lo accende)

Il pulsante potrebbe darti qualche problema di rimbalzo, vedi in internet "debounce button arduino"

Consigli (opzionali): -quando definisci i pin, è meglio se usi delle costanti:

int PULS1 = 4;  //button for switch off the return pump H2O

sostituiscilo con

const byte int PULS1 = 4;  //button for switch off the return pump H2O

-le variabili VAL1-VAL4 possono essere byte e inoltre io gli darei un nome più legato al loro utilizzo, esempio VAR4 potrebbe essere ValPuls1 e cosi anche per i pin, potresti avere PinPuls1 invece di PULS1

nid69ita: Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0 FATTO e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0 FATTO - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0 - qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0 - qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

nid69ita: due cose non mi sono chiare. 1. nella tua analisi parli solo di puls1, rele2 e galleg3, ma hai altro rele e altri gallegianti. 2. non mi è chiaro quello che vuoi fare con il pulsante. Se il tuo programma controlla attraverso rele2 e galleg3 il livello dell'acqua, cosa deve fare il puls1 ? Solo spegnere, quindi uno stop di emergenza ?

Per quel che ho potuto capire (tu hai stato con solo 2 valori): - devi crearti una variabile esempio StatoRele2 che può assumere tre valori, ACCESO, SPENTO e DISATTIVO; creati 3 costanti numeriche con questi nomi:

const byte DISATTIVO=0;
const byte SPENTO=1;
const byte ACCESO=2;
byte StatoRele2=SPENTO;
  • Parti con lo stato SPENTO nella setup()
  • lo stato lo cambi in base al livello galleg3 (ovvero controlli il galleggiante) solo se StatoRele2 è diverso da DISATTIVO; in base al galleg3 vari solo lo StatoRele2 tra ACCESO e SPENTO.
  • controlli il valore di puls1, se premuto e StatoRele2 diverso da DISATTIVO allora StatoRele2=DISATTIVO, se era DISATTIVO allora StatoRele2=SPENTO.
  • se lo StatoRele2 è ACCESO attivi il rele2, altrimenti lo disattivi. Quindi fai digitalWrite sul Rele in base allo StatoRele2 (3 stati ma solo 1 lo accende)

Il pulsante potrebbe darti qualche problema di rimbalzo, vedi in internet "debounce button arduino"

ciao e grazie della risposta, gli altri sono dei galleggianti che comandano altre pompe (per ora funzionano..) il lavoro che voglio fare è: 1 pompa a questa pompa c'è un pulsante che mi consente di spegnera/accenderla (nel caso debba pulirla x esempio) e un galleggiante che qualora il livello fosse eccessivo interrompesse la pompa fino a che il livello torna nella norma...

quindi nel setup definisco gli stati con

const byte DISATTIVO=0;
const byte SPENTO=1;
const byte ACCESO=2;
byte StatoRele2=SPENTO;

poi nel loop al posto di if else uso byte statoRele2?? nel attesa della vostra rx cerco su internet/youtube alcuni esempi.. grazie mille ciaooo