aiuto per pompa rabbocco

salve

avrei bisogno del vostro aiutino forse per voi una sciocchezza invece per me un bel problema :confused:

praticamente devo far attivare una pompa di rabbocco in una vasca con acqua regolata da un interruttore galleggiante e fin qui tutto molto semplice ho scritto 2 righe di codice che mi attiva e disattiva la pompa in base al livello del acqua regolato dal galleggiate ora il mio problema che non riesco a fare ho provato in vari modi ma non mi funziona dovrei aggiungere una specie di protezione contro la rottura al galleggiate che rimanga sempre attivato quindi di evitare che continui a tenere la pompa accesa praticamente vorrei che una volta attivata la pompa, quando il galleggiante si attiva, ci sia un conteggio di 10 secondi dove entro questo tempo il galleggiante deve tornare a off se questo non avviene per qualsiasi motivo la pompa deve essere fermata e magari attivare un allarme ma quello ci penso io logicamente il tutto deve avvenire una sola volta

questo e quello che ho provato ma non mi funziona attendendo i 10 secondi con il galleggiante attivato la pompa non si ferma

if (digitalRead (sensorerabbocco) == LOW)

{
   if (allarme_rabbocco == false)
    {
      digitalWrite(pinrabbocco, HIGH);
      

            if (millis() - temporabbocco > 10000)
   
        {
          digitalWrite(pinrabbocco, LOW);
          allarme_rabbocco = true;
          temporabbocco = millis();
        } 
            
    }

}
else
 {
  digitalWrite(pinrabbocco, LOW);
  temporabbocco = millis();
 }

potresti postare l’intero codice? In particolare le dichiarazioni delle variabili utilizzate.
Forse sbaglio ma a prima vista non trovo l’errore…

non le avevo postate perché mi viene compilata correttamente comunque sono queste

const byte sensorerabbocco = 49;
const byte pinrabbocco = 47;
boolean allarme_rabbocco = false;
unsigned long temporabbocco = 0;



(setup)

pinMode(sensorerabbocco, INPUT_PULLUP);
pinMode(pinrabbocco, OUTPUT);

nessuno riesce ad aiutarmi?????

grazie mille

  1. come ti √® stato chiesto, magari il codice COMPLETO invece che "pezzi e bocconi" renderebbe pi√Ļ facile la comprensione

  2. [u]prima però[/u] ... COMMENTA il codice e, per ogni passo, spiega perché lo fai/cosa fa !

[u]IMPARATE a commentare il codice[/u], che se ci dovete mettere le mani tra sei mesi manco vi ricordate pi√Ļ perch√© lo avete scritto !!!

Guglielmo

ecco il codice completo che sto utilizzando anche con un mcp23017 per le uscite aggiuntive

#include <Wire.h>
#include "Adafruit_MCP23017.h"

const byte sensorerabbocco = 1;     // pin sensore sump rabbocco su MPC23017
const byte pinrabbocco = 2;         // pin pompa rabbocco osmosi

boolean allarme_rabbocco = false;
unsigned long temporabbocco = 0;
Adafruit_MCP23017 mcp;

void setup() 
{
 mcp.begin();                              // inizializza MPC 23017 sul indirizzo 0x20 (0)
 mcp.pinMode(sensorerabbocco, INPUT);    //pin 1 MCP23017 galleggiante in sump
 mcp.pullUp(sensorerabbocco, HIGH);      //pin 1 MCP23017 pullup (galleggiante in sump)
 mcp.pinMode(pinrabbocco, OUTPUT);       // pin 2 MCP23017   (pompa rabbocco acqua)
}

void loop() 
{
  if (mcp.digitalRead (sensorerabbocco) == LOW)  // se galleggiate attivo livello basso acqua
 {
  if (allarme_rabbocco == false)   // se non è attiva nessun allarme procedi
    {
      mcp.digitalWrite(pinrabbocco, HIGH);  // attiva pin rabbocco acqua pompa
      
        if (millis() - temporabbocco > 10000)  // passati 10 sec se il galleggente non è tornato a off procedi
         {
          mcp.digitalWrite(pinrabbocco, LOW);  //disattiva pompa
          allarme_rabbocco = true;    // attiva allarme 
          temporabbocco = millis();   // reset temporabbocco
         }  
    }
 }
 else
 {
  mcp.digitalWrite(pinrabbocco, LOW);   // entro i 10 secondi il galleggiente passa a disattivato spegni pompa
  temporabbocco = millis();             // reset temporabbocco
 }
}

il codice funziona ma non mi disattiva la pompa se passano pi√Ļ di 10 secondi con il galleggiate attivato

grazie

Allora, la logica che segui è sbagliata ...

... il tempo lo devi misurare dal momento [u]in cui inizia l'evento[/u], per cui, dovrai inizializzare "temporabbocco = millis();" nel momento in cui accendi la pompa e lo dovrai fare [u]UNA sola volta/u quindi, probabilmente, ti occorrerà verificare se la pompa è già accesa o meno prima di farlo.

NON lo devi invece rifare dove lo fai adesso, perché così riattivi semplicemente un ciclo di 10 secondi che a te NON serve (quello si fa quando devi, ad esempio, ripetere ciclicamente, con un certo intervallo, sempre la stessa cosa).

Guglielmo

ho modificato cosi pensi che potrebbe andare bene?

void loop() 
{
  if (mcp.digitalRead (sensorerabbocco) == LOW)  // se galleggiate attivo livello basso acqua
 {
  if (allarme_rabbocco == false)   // se non è attiva nessun allarme procedi
    {
      if (mcp.digitalRead (pinrabbocco) == LOW)
         {
          temporabbocco = millis();  //reset temporabbocco
         }
            mcp.digitalWrite(pinrabbocco, HIGH);  // attiva pin rabbocco acqua pompa
      
        if (millis() - temporabbocco > 10000)  // passati 10 sec se il galleggente non è tornato a off procedi
         {
          mcp.digitalWrite(pinrabbocco, LOW);  //disattiva pompa
          allarme_rabbocco = true;    // attiva allarme 
          
         }  
    }
 }
 else
 {
  mcp.digitalWrite(pinrabbocco, LOW);   // entro i 10 secondi il galleggiente passa a disattivato spegni pompa
  
 }

... una cosa prima ... tu hai un solo sensore di livello ? Chi ti dice quando il livello è troppo basso (richiede rabbocco) e quando il livello è quello giusto (fermare pompa rabbocco) ?

NON hai DUE galleggianti (uno inferiore ed uno superiore) ?

Guglielmo

no uso solo 1 galleggiante

si certo sarebbe meglio usarne 2 ma quello che pi√Ļ mi interessa √® il pieno in modo che non mi si allaghi la casa se il galleggiante si blocca sulla posizione attivato (rabbocco on) con (pompa on)

il livello basso non mi serve a saperlo perché acqua deve stare sempre allo stesso livello

... quindi, tu devi nel loop():

  1. verfica galleggante
  2. gallegiante su, pompa spenta, torna a 1.
  3. gallegiante gi√Ļ, accendi pompa, memorizzi tempo e vai a 4.
  4. leggi galleggiante e se tornato a livello, spegni pompa e vai ad 1, altrimenti vai a 4.1 4.1 controlla tempo, tutto ok torna a 4, se tempo scaduto vai a 4.2 4.2 ALLARME, blocca pompa e resta qui poiché c'è un guasto nel sistema

Verifica se la descrizione delle varie fasi è corretta, se non lo è corregila e poi ... si passa a fare il codice.

Guglielmo

Chiarire bene cosa si vuole ottenere attraverso una "lista" o un "diagramma" mi sembra una buona idea. Comunque ho testato il programma con un pulsante come sensore ed un led come attuatore e funziona, il led si spegne correttamente quando premo il pulsante per pi√Ļ di 10 secondi, per cercare errori nel software √® meglio semplificare l'elettronica al massimo. Quindi la mia idea √® che il galleggiante mandi un segnale un poco disturbato (magari dovuto alle oscillazioni meccaniche dell'acqua) e quindi Arduino legge qualche falso positivo che azzera il contatore prima che possano passare 10 secondi... puoi verificarlo facilmente facendogli accendere un led per 1 secondo ogni volta che legge positivo, quindi vedere se si accende mentre il galleggiante √® gi√Ļ

gpb01: ... quindi, tu devi nel loop():

  1. verfica galleggante
  2. gallegiante su, pompa spenta, torna a 1.
  3. gallegiante gi√Ļ, accendi pompa, memorizzi tempo e vai a 4.
  4. leggi galleggiante e se tornato a livello, spegni pompa e vai ad 1, altrimenti vai a 4.1 4.1 controlla tempo, tutto ok torna a 4, se tempo scaduto vai a 4.2 4.2 ALLARME, blocca pompa e resta qui poiché c'è un guasto nel sistema

Verifica se la descrizione delle varie fasi è corretta, se non lo è corregila e poi ... si passa a fare il codice.

Guglielmo

si esatto

... beh ... allora è abbastanza semplice, hai un loop principale per il quale puoi usare direttamente la loop() di Arduino e, in una certa condizione, un loop secondario (dal punto 4) che puoi tranquillamnete realizzare con un ciclo while().

Preoccupati ora quindi di scrivere un codice, il pi√Ļ chiaro e semplice possibile, che si occupi solo di queste due parti, lasciando stare la parte del tempo che aggiungiamo in una seconda fase.

Già ci dovrai lavorare un po' per far funzionare bene questo dato che, come ti è stato detto da paofanello, c'è da tenere conto che il gallegiante NON è affatto un interruttore ideale che attacca e stacca in modo ben preciso e solo in due condizioni, ma che, a secondo del movimento dell'acqua, può creare condizioni di "attacca - stacca" a ripetizione e piuttosto rapide. Per questo preferisco senz'altro la versione a DUE galleggianti (Minimo - Massimo) che, di per se, crea già una separazione tra le due condizioni senza i rischi di cattiva interpretazione.

Guglielmo

l'acqua è praticamente ferma in sump quindi con ce problema del secondo galleggiate io devo reintegrare acqua evaporata

ma quello che ho fatto io gia prima non potrebbe andare bene????

Ti ho gi√† risposto, ho testato il tuo programma e mi sembra funzionare, farei un programma per testare se il segnale del galleggiante √® netto, o se √® molto disturbato, basta fare in modo che si accenda un led per mezzo secondo se legge che il galleggiante √® su (livello acqua buono) e vedere se si accende mentre il galleggiante √® gi√Ļ