Serbatoio Impianto Osmosi

i relè continuano a spegnersi e accendersi velocemente.....

@Patrick_M
Mi sembra giusto che il TO continui su questa discussione visto che ha problemi con lo stesso progetto.

@akuilotto
Usa i CODE TAG!! (icona </>)

Controlla i gallegianti. Ne avrai uno bloccato.
Visto che il Tuo sketch non prevede il caso di galleggiante minima aperto e gallegiante massima chiuso Ti fa questi scherzi di relé oscillanti.

Ciao Uwe

Grazie mille per la risposta, ho controllato e i galleggianti sembrano funzionare e non sono bloccati. Come cambio il codice per sistemare??

se fino ad ora ha funzionato correttamente, non devi toccare nulla nel programma. sicuramente c'è qualche problema esterno, magari un contatto ossidato (soprattutto se è acqua di mare). Innanzitutto verifica quale dei rele da problemi

e modifica il tuo post qui sopra come ti ha detto uwe

Tutti e 2 i rele fanno lo stesso scherzo, quando arrivano a livello massimo e il galleggiante va in 1 il relè continua ad aprirsi e a chiudersi velocemente. Non riesco proprio ad uscirne I relè li ho gia cambiati, ho cambiato le resistenze sui galleggianti, ho cambiato arduino 1. L'unica cosa che mi rimane da cambiare sono i galleggianti ma non penso siano quello il problema, visivamente sono perfetti, è acqua di osmosi, quindi priva di ogni sale e sostanze corrosive. Mi chiedevo solo se c'era un modo per migliorare il codice.

Forse sbaglio, ma hai provato a fare una “macchina a stati” usando delle flag che escludano gli altri stati finche’ uno e’ attivo ? …

Ad esempio … hai un galleggiante di minimo (rabbocco, credo), che ti dovrebbe aprire l’acqua per il rabbocco … quest’acqua deve rimanere aperta finche’ arriva al galleggiante di massimo ? … se si, quando leggi il galleggiante di minimo, apri l’acqua ed alzi una flag, che dira’ allo sketch di non richiuderla finche’ non sara’ scattato il galleggiante di massimo, ed allo stesso tempo impedira’ di rileggere quello di minimo … e cosi via …

E non usare gli else, usa dei semplici if consecutivi che controllino sia i galleggianti che le flag … come avevo gia scritto in un’altro post, else e’ “altrimenti” … significa che se if e’ vero fa una cosa, “altrimenti” ne fa un’altra … ma a te serve che una cosa venga fatta solo in un certo caso, un’altra solo in un’altro, e cosi via …

se fai ad esempio (pseudocodice)

if (!flag && minimo) {
   apri acqua;
   flag=true;
}
if (flag && massimo) {
   chiudi acqua;
   flag=false;
}

apri l’acqua solo se il galleggiante di minimo scatta e la flag e’ a 0 (che dovra’ essere lo stato iniziale nel setup, ovviamente), poi siccome li la metti ad 1 non fai piu nient’altro finche’ non scatta il massimo, e solo se la flag e’ 1, poi siccome li la rimetti a 0, ricomincia daccapo … sono semplicemente due stati che si escludono a vicenda, per cui il rele’ (o l’acqua) non dovrebbe mai continuare ad intervenire perche’ gli dai un singolo comando ogni volta …

EDIT: “flag” e’ una qualsiasi variabile byte, con il nome che preferisci tu, e ne puoi usare quante ne vuoi :wink:

Poi non ho capito bene perche’ controlli un valore e contemporaneamente il suo contrario …

ricaricaOsmo =digitalRead(min_osmo);
 ...

if ( ricaricaOsmo &&  digitalRead(max_osmo) )
   {
       delay(150);
       if ( !digitalRead(max_osmo) ) return;
       digitalWrite(rele1,HIGH);
       ricaricaOsmo = 0;
   }

Ad esempio … se tu entri qui e’ perche’ max_osmo e’ true (altrimenti non ci entri), quindi perche’ dentro l’if controlli se max_osmo e’ false con un’altro if ? … e’ ovvio che non puo esserlo, dato che sei entrato nell’if proprio perche’ era true …

Inoltre, subito prima hai messo ricaricaosmo al valore di MINosmo, per cui se poi controlli nell’if che MAXosmo sia true, e che ricaricaosmo sia true (che vorrebbe dire che anche MINosmo era true), come puoi entrarci ? (perche’ dubito che entrambi i galleggianti possano essere scattati contemporaneamente :wink: … ricaricaosmo lo puoi usare come flag, ma lo devi impostare tu con il valore corretto …

Poi non ho capito bene perche' controlli un valore e contemporaneamente il suo contrario ...

...omissis

Ad esempio ... se tu entri qui e' perche' max_osmo e' true (altrimenti non ci entri), quindi perche' dentro l'if controlli se max_osmo e' false con un'altro if ? ... e' ovvio che non puo esserlo, dato che sei entrato nell'if proprio perche' era true ...

... è un debounce, per effetto del riempimento hai un po di turbolenza e quindi il galleggiante ondeggia dando dei falsi positivi, al limite io proverei proprio ad aumentare il delay portandolo a 1000 (un secondo) o più

Un po di turbolenza non dovrebbe creare problemi ... se e' vuoto, ad esempio, apro l'acqua ed alzo la flag, poi controllo quello del pieno, dell'altro non me ne frega piu nulla, perche' si deve comunque continuare a riempire, quindi lo ignoro se la flag e' alta ... quando scatta il pieno, chiudo l'acqua ed abbasso la flag, se poi per effetto della turbolenza il pieno mi si apre perche' si era chiuso quando mancava qualche millimetro al massimo, anche li non me ne frega nulla, perche' intanto si e' comunque riempita a sufficenza ... o sbaglio ? ;)

Voglio dire, parliamo di vasche, non di una provetta, giusto ?

hai ragione anche tu :)

Se lo OP mi risponde alla domanda nell'altro topic, io ho una proposta....

Edit, mi ha risposto

Prova così:

#define osmosi 6  //relè1 collegato al pin digitale 6
#define rabbocco 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


#define minosmo !digitalRead(min_osmo)
#define maxosmo digitalRead(max_osmo)
#define minrabbo !digitalRead(min_rabbo)
#define maxrabbo digitalRead(max_rabbo)
#define go 0
#define nogo 1

void setup()
{
    pinMode(osmosi, OUTPUT); //relè 1 impostato come output
    pinMode(rabbocco, 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 (minosmo && !minrabbo)
    {
        digitalWrite(osmosi, go);
    }

    if (maxosmo)
    {
        digitalWrite(osmosi, nogo);
    }

    if (minrabbo)
    {
        digitalWrite(rabbocco, go);
        digitalWrite(osmosi, nogo);
    }

    if (maxrabbo)
    {
        digitalWrite(rabbocco, nogo);
    }

    delay(150); // non serve a nulla, se non a far girare un po' più lento
}

cos' dovrebbe andare, accende per galleggiante di minimo non impegnato, spegne per galleggiangte di massimo impegnato se la pompa e la valvola sono dirette invece che negate inverti le define di go e nogo Se invece i galleggianti fossero invertiti come logica inverti i punti esclamativi nelle define con le digitalread