Serbatoio Impianto Osmosi

Ciao ragazzi, sto costruendo un serbatoio per il mio impianto d'osmosi e vorrei renderlo automatico con arduino. Spiego il progetto: - serbatoio - galleggiante minimo - galleggiante massimo - elettrovalvola comandata da relè che apre l'acqua che passa per l'impianto e finisce nel serbatoio.

Premetto che sono poco pratico in programmazione...

Quello che vorrei fare è che quando l'acqua scende e attiva il galleggiante del minimo il relè dell'eletrovalvola va in on e deve stare fino a quando non raggiunge il galleggiante del livello di massimo. Con le sole istruzioni "IF" continuerebbe ad aprire e chiudere sul galleggiante del minimo. Anche temporizzando l'apertura, ci sarebbero troppe variabili (pressione dell'acqua, calcolo del tempo neccessario all'arrivo del galleggiante di massimo...) Che istruzione dovrei usare per dirgli ad arduino: se l'acqua va sotto il galleggiante del minimo apri l'elettrovalvola fino a quando non arrivi al galleggiante del massimo? Ne sto uscendo pazzo... un grazie a chi mi aiuta!!! :) :)

Ciao,

imposta una variabile di stato:

Quando sei al minimo imposti la variabile a "true" e fino a quando non cambia lasci l'acqua aperta. Quando sei al massimo la metti a "false" e fino a quando non cambia tieni l'acqua chiusa.

In pratica lo stato del'elettrovalvola (aperta/chiusa) cambia solo se cambia il valore della variabile.

Attilio

Ricordati il debounce sull'ingresso (condensatore da 100nF fra il pin e massa e resistenza da 100 ohm in serie al pin) ... tante volte i problemi sono causati dai rimbalzi dei contatti, che Arduino legge come una serie di chiusure ed aperture veloci, dato che e' abbastanza rapido da interpretarli come azioni distinte, anche se noi non li vediamo perche' durano centesimi di secondo ... ;)

E' piu' semplice di quel che credi. Con le istruzioni IF vai benissimo.

E' un normale SET - RESET. Accendi (SET) quando il c'è il galleggiante di minimo (se poi è NC oppure NO lo devi vedere tu) e spegni (RESET) quando c'è il galleggiante di massimo.

Occhio che se hai due galleggianti identici (magari a reed, filetto M6 in plastica, come quelli che uso io) che normalmente leggono NC, cioè quando il magnete è in basso (non c'è acqua), allora dovrai accendere la Ev alla chiusura del minimo e spegnere la Ev all'apertura del massimo, perchè il minimo deve essere letto quando è in basso, e il massimo deve essere letto quando è in posizione alta.... Forse ti incasinavi per quello.

Se sono “a bandiera” (cioe’ con il galleggiante che si inclina ad angolo), basta che li monti uno invertito rispetto all’altro … quello del minimo, in modo che si chiuda (galleggiante diritto) quando e’ sotto il livello (quindi montato in modo che si pieghi verso l’alto per galleggiamento), e quello del massimo montato invece in modo che si pieghi verso il basso per gravita’ (e che si raddrizzi per galleggiamento, chiudendo il contatto quando il livello e’ al massimo), per averli che funzionano tutti e due allo stesso modo … :wink:

Grazie mille per tutte le risposte, durante tutto sto tempo non son riuscito a far prove.
Per ora ho solo costruito l’impianto, posto il disegno schematico.
Come vedete, non contento ho complicato molto di più.
Ora vi spiego:
l’elettrovalvola apre con il galleggiante 2 (minimo vasca 1) e deve rimanere aperta fino al galleggiante 1 (massimo vasca 1). La pompa si accende e manda acqua nella vasca 2 con il galleggiante 4 (minimo vasca 2) e rimane accesa fino al galleggiante 3 (massimo vasca 2). La pompa non deve andare però nel caso in cui l’acqua sia sotto il galleggiante 2 se no si brucia.
Sto sbattendo la testa contro i muri…
Metto fin’ora un pezzetto di codice, qualche anima pia che mi aiuta…

// Programma per serbatoi acqua

int relè1 = 5; // relè che comanda elettrovalvola
int relè2 = 6; // relè che comanda pompa
int gall1 = ; // galleggiante livello massimo vasca 1
int gall2 = ; // galleggiante livello minimo vasca 1
int gall3 = ; // galleggiante livello massimo vasca 2
int gall4 = ; // galleggiante livello minimo vasca 2

void setup() {
pinMode (relè1, OUTPUT);
pinMode (relè2, OUTPUT);
gall1 = 0;
gall2 = 0;
gall3 = 0;
gall4 = 0;

}

void loop() {
// put your main code here, to run repeatedly:

}

#define VASCA_MIN 5
#define VASCA_MAX 6
#define VASCA_RELE 7

byte ricaricaVasca = 0;

void setup()
{
   pinMode(VASCA_MIN,INPUT);
   pinMode(VASCA_MAX,INPUT);
   pinMode(VASCA_RELE,OUTPUT);
}

void loop()
{
    if ( ricaricaVasca &&  digitalRead(VASCA_MAX) )
    {
        delay(150);
        if ( !digitalRead(VASCA_MAX) ) return;
        digitalWrite(VASCA_RELE,0);
        ricaricaVasca = 0;
    }
    else if ( !ricaricaVasca && !digitalRead(VASCA_MIN) )
    {
        delay(150);
        if ( digitalRead(VASCA_MIN) ) return;
        digitalWrite(VASCA_RELE,1);
        ricaricaVasca = 1;
    }    
}

Grazie, gentilissimo, non capisco però il "return"

Praticamente viene controllato lo stato del sensore poi fa una pausa e lo torna a controllare, questo è un'antirbalzo software e serve per assicurarsi di leggere il giusto valore. Ora in caso fallisca la seconda lettura esce dalla funzione loop e rinizia da capo i controlli, praticamente è una sorta di reset.

Perfetto, gentilissimo.
Il punto esclamativo che metti davanti a Digitalread a che serve?

digitalRead() restituisce due valori, 0 == LOW o 1 == HIGH questi due valori rientrano nella logica booleana e dunque 0 == false n == true. Detto ciò bisognerebbe studiarsi gli operatori booleani quale ! not && AND || OR dunque il punto esclamativo è una negazione, qualsiasi valore esso sia tra true o false esso sarà invertito. Unendo queste informazioni otteniamo:

if ( digitalread(3) )
//qui entro quando leggo 1 perché 1 == true

if ( !digitalRead(3) )
//qui entro quando leggo 0 perché 0 == false , !0 == true

Ok, sono riuscito a programmare e collegare tutto, tutto funziona per il meglio, fin quando faccio la prova di staccare la corrente, come nel caso se saltasse la corrente. Al ripristino della corrente, mi accorgo che se l'acqua è tra il galleggiante di minimo e quello di massimo il relè parte come dovrebbe essere, però arrivato al livello del massimo il relè non stacca. dopo prove e tentativi, la soluzione è che se il livello dell'acqua si trova a metà devo meccanicamente abbassare il galleggiante del minimo e farlo ritornare su, cosi fatto il relè all'arrivo del livello massimo stacca, cosa improponibile se saltasse la corrente e non mi trovo a casa allagherei tutto. Ecco il codice, cosa manca???

define rele1 6 //relè1 collegato al pin digitale 6

define rele2 7 //relè2 collegato al pin digitale 7

define min_osmo 5 //galleggiante del minimo vasca osmosi collegato al pin digitale 5

define max_osmo 4 //galleggiante del massimo vasca osmosi collegato al pin digitale 4

define min_rabbo 3 //galleggiante del minimo vasca rabbocco al pin digitale 3

define max_rabbo 2 //galleggiante del massimo vasca rabbocco al pin digitale 2

byte ricaricaOsmo =0; byte ricaricaRabbo = 0;

void setup() { pinMode(rele1, OUTPUT); //relè 1 impostato come output pinMode(rele2, OUTPUT); //relè 2 impostato come output pinMode(min_osmo, INPUT); //galleggiante minimo vasca osmosi impostato come input pinMode(max_osmo, INPUT); //galleggiante massimo vasca osmosi impostato come input pinMode(min_rabbo, INPUT); //galleggiante minimo vasca rabbocco impostato come input pinMode(max_rabbo, INPUT); //galleggiante massimo vasca rabbocco impostato come input

}

void loop() { if ( ricaricaOsmo && digitalRead(max_osmo) ) { delay(150); if ( !digitalRead(max_osmo) ) return; digitalWrite(rele1,HIGH); ricaricaOsmo = 0; } else if ( !ricaricaOsmo && !digitalRead(min_osmo) ) { delay(150); if ( digitalRead(min_osmo) ) return; digitalWrite(rele1,LOW); ricaricaOsmo = 1; } if ( ricaricaRabbo && digitalRead(max_rabbo) ) { delay(150); if ( !digitalRead(max_rabbo) ) return; digitalWrite(rele2,HIGH); ricaricaRabbo = 0; } else if ( !ricaricaRabbo && !digitalRead(min_rabbo) ) { delay(150); if ( digitalRead(min_rabbo) ) return; digitalWrite(rele2,LOW); ricaricaRabbo = 1; }

}

con il cut/paste te la sei cavata bene, con la logica un pò meno. nel setup leggi un paio di volte il minimo, e assegni il valore a ricaricaOsmo

cioè?? Aiutatemi, non so più dove sbattere la stessa, sto imparando pian piano assieme a voi...

famola semplice, nel setup ricaricaOsmo =digitalRead(min_osmo); dovresti però metterci un debounce come ho fatto io, per adesso provalo così

Allora vediamo:

define rele1 6 //relè1 collegato al pin digitale 6

define rele2 7 //relè2 collegato al pin digitale 7

define min_osmo 5 //galleggiante del minimo vasca osmosi collegato al pin digitale 5

define max_osmo 4 //galleggiante del massimo vasca osmosi collegato al pin digitale 4

define min_rabbo 3 //galleggiante del minimo vasca rabbocco al pin digitale 3

define max_rabbo 2 //galleggiante del massimo vasca rabbocco al pin digitale 2

byte ricaricaOsmo =0; byte ricaricaRabbo = 0;

void setup() { pinMode(rele1, OUTPUT); //relè 1 impostato come output pinMode(rele2, OUTPUT); //relè 2 impostato come output pinMode(min_osmo, INPUT); //galleggiante minimo vasca osmosi impostato come input pinMode(max_osmo, INPUT); //galleggiante massimo vasca osmosi impostato come input pinMode(min_rabbo, INPUT); //galleggiante minimo vasca rabbocco impostato come input pinMode(max_rabbo, INPUT); //galleggiante massimo vasca rabbocco impostato come input ricaricaOsmo =digitalRead(min_osmo); ricaricaRabbo =digitalRead(min_rabbo);

}

void loop() { if ( ricaricaOsmo && digitalRead(max_osmo) ) { delay(150); if ( !digitalRead(max_osmo) ) return; digitalWrite(rele1,HIGH); ricaricaOsmo = 0; } else if ( !ricaricaOsmo && !digitalRead(min_osmo) ) { delay(150); if ( digitalRead(min_osmo) ) return; digitalWrite(rele1,LOW); ricaricaOsmo = 1; } if ( ricaricaRabbo && digitalRead(max_rabbo) ) { delay(150); if ( !digitalRead(max_rabbo) ) return; digitalWrite(rele2,HIGH); ricaricaRabbo = 0; } else if ( !ricaricaRabbo && !digitalRead(min_rabbo) ) { delay(150); if ( digitalRead(min_rabbo) ) return; digitalWrite(rele2,LOW); ricaricaRabbo = 1; }

}

Non mi è chiaro il fatto del debounce... cerco in giro, non riesco a capire dove usare il debounce e come usarlo :( :(

Grazie mille che mi stai aiutando, pian piano riesco a capire dove sbaglio e perchè!!! :)

il debounce è lì nella funzione loop, te l'ho scritto prima! praticamente leggi e controlli che il valore letto non sia stato un caso.

ok, ora ho capito :) :) quindi aggiungendo quelle due stringhe nel setup ogni volta che salta la corrente vado a leggere i valori minimi e non dovrebbe più darmi problemi?? Sto pensando, e se saltasse appena la vasca e stata riempita?? non potrei forse aggiungere anche i digitalread dei valori massimi nel setup?? Grazie vbextreme per l'aiuto che mi stai dando!!! :)

non sembra....

no, non c'è bisogno, prova a spegnere e riaccendere in tutti i casi poi ne riparliamo.

Ciao ragazzi, è passato molto tempo,l’impianto funzionava bene, ora inizia a ttivare e riattivare il relè subito quello di massima delle 2 vasce, cosa è successo, cosa posso cambiare???
Aitotatemi fra 2 giorni parto per le ferie e diventa davvero un casino per i poveri pescetti.
Allego il programma che sto usando ora:

#define rele1 6  //relè1 collegato al pin digitale 6
#define rele2 7  //relè2 collegato al pin digitale 7
#define min_osmo 5  //galleggiante del minimo  vasca osmosi collegato al pin digitale 5
#define max_osmo 4  //galleggiante del massimo vasca osmosi collegato al pin digitale 4
#define min_rabbo 3  //galleggiante del minimo vasca rabbocco al pin digitale 3
#define max_rabbo 2  //galleggiante del massimo vasca rabbocco al pin digitale 2
byte ricaricaOsmo =0;
byte ricaricaRabbo = 0;


void setup() {
 pinMode(rele1, OUTPUT); //relè 1 impostato come output
 pinMode(rele2, OUTPUT); //relè 2 impostato come output
 pinMode(min_osmo, INPUT);  //galleggiante minimo vasca osmosi impostato come input
 pinMode(max_osmo, INPUT);  //galleggiante massimo vasca osmosi impostato come input
 pinMode(min_rabbo, INPUT);  //galleggiante minimo vasca rabbocco impostato come input
 pinMode(max_rabbo, INPUT);  //galleggiante massimo vasca rabbocco impostato come input
 ricaricaOsmo =digitalRead(min_osmo);
 ricaricaRabbo =digitalRead(min_rabbo);

}

void loop() {
 if ( ricaricaOsmo &&  digitalRead(max_osmo) )
   {
       delay(150);
       if ( !digitalRead(max_osmo) ) return;
       digitalWrite(rele1,HIGH);
       ricaricaOsmo = 0;
   }
   else if ( !ricaricaOsmo && !digitalRead(min_osmo) )
   {
       delay(150);
       if ( digitalRead(min_osmo) ) return;
       digitalWrite(rele1,LOW);
       ricaricaOsmo = 1;
   }   
if ( ricaricaRabbo &&  digitalRead(max_rabbo) )
   {
       delay(150);
       if ( !digitalRead(max_rabbo) ) return;
       digitalWrite(rele2,HIGH);
       ricaricaRabbo = 0;
   }
   else if ( !ricaricaRabbo && !digitalRead(min_rabbo) )
   {
       delay(150);
       if ( digitalRead(min_rabbo) ) return;
       digitalWrite(rele2,LOW);
       ricaricaRabbo = 1;
   }   

}

AIUTO VI PREGO HO 2 GIORNI

Sketch_Impianto_Osmosi.ino (1.8 KB)