Come fermare loop arduino

Buonasera, sto utilizzando arduino per un controllo antiallagamento del mio depuratore posizionato sotto il lavello.
Il funzionamento è molto semplice , resistenza in pull-Down su piedino A0 , il sensore semplicemente è composto da un filo a GND e uno su A0. qundo l'acqua tocca i due fili la tensione su A0 passa da 1023 a 400 e attiva un rele che pilota una saracinesca motorizzata.
di seguito lo sketch da me realizzato

# define chiudi 13
# define reset 12
# define sensore A1
# define led 11
int valore ;

void setup() {
  pinMode(sensore,INPUT);
  pinMode(chiudi,OUTPUT);
  pinMode(reset,INPUT);
  pinMode(led,OUTPUT);
  Serial.begin(9600); 
 
}
void loop() {
  valore=analogRead(A1); 
  Serial.println(valore); 
  if(valore<500){
   
  digitalWrite(chiudi, HIGH);
  digitalWrite(led,HIGH);
  }
delay (3000);

digitalWrite (chiudi,LOW);

}

Il mio problema è che vorrei che la saracinesca motorizzata fosse pilotata solo una volta per il tempo prefissato (nel caso 3 secondi) e poi rimanesse non alimentata fino alla pressione del reset.
Ora nel mio schema la saracinesca al rilevamento dell'acqua eccita il relè di pilotaggio della saracinesca , dopo 3 secondi disecita il relè , ma.... siccome arduino continua a controllare rileva la presenza di acqua e rieccita nuovamente il relè in loop infinito.

Aggiungi questa riga come ultima riga del loop

while (analogRead(A1)<500){} // Rimarrà qui finché non sarà asciutto o 
//premere reset press 

Saluti

Mah, per fare quello che vuoi mi pare non sia complicato ma è proprio l'attuale codifica che non mi convince molto ossia non so se tu abbia ragionato abbastanza quando hai scritto quelle istruzioni. A parte l'indentazione (premi Ctrl-T) che è "secondaria" in listati corti come questo ma è bene abituarsi in generale, e le #define che vanno scritte senza lo spazio tra "#" e "define", il pin del sensore del quale hai messola #define ma che non usi nel loop(), e le costanti che per convenzione vanno scritte in maiuscolo. Ma per ora traliasciamo questi "dettagli".

Tu praticamente hai un loop che controlla ogni 3 secondi il valore letto, e se è minore di 500 attiva la saracinesca. Fin qui va bene, ma se dici che quando la attiva vorresti attendere 3 secondi e poi in attesa del tasto di reset (che, nota per @gonpezzi, non è il reset di Arduino ma un apposito pulsante che vedi nelle #define :wink: ) devi mettere dentro alla if() l'attesa di 3 secondi (non fuori), seguito dall'attesa del tasto ossia:

while(digitalRead(P_RESET) == LOW) { }

Insomma, vedi una cosa del tipo:

// Mettiamo le costanti dei pin con prefisso "P_"
#define P_CHIUDI 13
#define P_RESET 12
#define P_SENSORE A1
#define P_LED 11
int valore ;

void setup() 
{
  pinMode(P_SENSORE,INPUT);
  pinMode(P_CHIUDI,OUTPUT);
  pinMode(P_RESET,INPUT);
  pinMode(P_LED,OUTPUT);
  Serial.begin(9600); 
  digitalWrite (P_CHIUDI,LOW);
}

void loop() 
{
  valore=analogRead(P_SENSORE); 
  if(valore<500) {
    Serial.println(valore); 
    digitalWrite(P_CHIUDI, HIGH);
    digitalWrite(P_LED,HIGH);
    delay(3000); // Attendo almeno 3 secondi
    // Ora attendo il reset
    while(digitalRead(P_RESET) == LOW) { }
    // Rimetto le cose a posto
    digitalWrite (P_CHIUDI,LOW);  
  }
  // Aggiungere qui un'altra delay() se si desidera diradare le letture
}

PS: il pulsante di reset deve avere una resistenza di pull-down (o in alternativa invertire la logica ed usare la pullup interna con INPUT_PULLUP).

grazie mille per l'aiuto e per le correzioni , non ho capito indentazione ctrl-t??
Comunque nonostante tutto l'idea di usare due fili come sensore funziona da qui poi l'evoluzione:
Precisazione la saracinesca ha due comandi uno di chiusura e uno di apertura una volta chiusa o aperta mantiene la condizione .quindi:
Perdita di acqua, l'ingresso A1 passa da 1023 a 450 , porto alta l'uscita 13 che attiva un rele per alimentazione dell'attuatore della saracinesca che chiude l'acqua, attendo 3-5 secondi (che è il tempo necessario per chiudere il passaggio) poi tolgo l'alimentazione alla saracinesca , si accende il led di segnalazione , e tutto deve rimanere in questa condizione fino a quando viene premuto il pulsante di reset, che attiverà un secondo relè che riapre la saracinesca , si spegne il led e riporta arduino in attesa di eventuali perdite.
per questo motivo il delay è fuori dal ciclo if.
Visto le Vostre soluzioni penso che dovrò ristudiare il while .
Credo comunque che non sarei mai arrivato alla soluzione while(1){} che non mi è ben chiara.
questa serà proverò con i vostri suggerimenti .

Nell'IDE Arduino premi Ctrl-T, ci pensa lui a sistemarti il codice con una indentazione "standard".

Ok allora in questo caso il codice devi modificarlo per seguire queste tue indicazioni.
Ma abituati ad inserire per prima cosa i commenti che spiegano i passi in italiano, e poi sotto ad ogni commento inizi a codificare le istruzioni che eseguono quanto scritto. Ossia vedi quanto è più immediato non solo codificare ma avrai alla fine anche un codice ben commentato:

  // Perdita di acqua?
  valore=analogRead(P_SENSORE); 
  if(valore<500) {
    Serial.println(valore); 
    // porto alta l'uscita che attiva un rele che chiude l'acqua
    digitalWrite(P_CHIUDI, HIGH);
    // attendo 3-5 secondi (che è il tempo necessario per chiudere il passaggio) 
    delay(5000);
    // poi tolgo l'alimentazione alla saracinesca 
    digitalWrite (P_CHIUDI,LOW);  
    // si accende il led di segnalazione 
    digitalWrite(P_LED,HIGH);
    // tutto deve rimanere in questa condizione fino a quando viene premuto il pulsante di reset
    while(digitalRead(P_RESET) == LOW) { }
    // che attiverà un secondo relè che riapre la saracinesca 
    //   (NOTA: quale sarebbe questo secondo relè??? Manca?)
    // si spegne il led
    digitalWrite(P_LED,LOW);
    // e riporta arduino in attesa di eventuali perdite
  }

ok basta fermi li :grinning: :grinning: ho capito :grinning: .non mettetemi altre righe di programma altrimenti vi do il mio indirizzo così mi completate il lavoro :grinning:.
Veramente grazie di tutto . appena finito posterò il lavoro .

ok mntato il tutto .
per non occupare spazio metto lo sketch e la foto del sensore fatto da .

[code]
// la movimentazione di questa saracinesca è data da un piccolo motore alimentato con tre fili a 220v:
// un filo di comune e due per apertura e chiusura.
// per cui volendo togliere alimentazione al motore e  per evitare che incollandosi i contatti del relè  venissero alimentati
// in contemporanea i due comandi di apertura e chiusura è stato messo un rele alimentazione con il contatto NO connesso al
// comune del rele scambio , e i fili apre e chiude della saracinesca in corrispondenza del contatto NC (chiude) e NO (apre)
// del rele di scambio.
// è stato messo un led lampeggiante( 1 flash di 10 ms ogni 3 secondi) per verificare il funzionamento di arduino
// nota a parte il led di controllo ove uso millis per i tempi della saracinesca ho preferito usare delay



#define rele_alimentazione 12
#define rele_scambio 11
#define sensore A1
#define tasto_reset 10
#define led_allarme 9
#define apertura_manuale 8

int valore = 0;
int manuale;

// tempo apre e tempo chiude servono a dare il tempo necessario alla saracinesca
// di chiudersi e aprirsi, dopodichè viene tolta la alimentazione .
int tempo_apre = 22000;
int tempo_chiude = 23000;

// sezione riguardante il led lampeggiante di controllo del funzionamento di arduino
#define led_chek  6
unsigned long time;
unsigned long lampeggio_time = 0;



void setup() {
  pinMode(sensore, INPUT);
  pinMode(rele_alimentazione, OUTPUT);
  pinMode(rele_scambio, OUTPUT);
  pinMode(led_allarme , OUTPUT);
  pinMode(tasto_reset, INPUT);
  pinMode(apertura_manuale, INPUT);
  pinMode(led_chek, OUTPUT);
  Serial.begin(9600);

}
void loop() {
  //nel caso fosse necessario aprire manualmente la saracinesca . per esempio dopo un allarme
  // con sucessiva mancanza di alimentazione alla centralina
  manuale = digitalRead(apertura_manuale);
  if (manuale == LOW) {
    // la saracinesca viene comandata in apertura
    digitalWrite(rele_alimentazione, HIGH);
    digitalWrite ( rele_scambio, HIGH);
    //tempo per completare il ciclo di apertura
    delay(tempo_apre);
    // tolgo alimentazione alla saracinesca
    digitalWrite(rele_alimentazione, LOW);
    digitalWrite(rele_scambio, LOW);
  }

  // perdita acqua?
  valore = analogRead(sensore);

  Serial.println(valore);

  if (valore < 500) {
    //porto alta uscita che attiva il rele che chiude l'acqua
    digitalWrite(rele_alimentazione, HIGH);


    //si accende il led di segnalazione rilevamento acqua
    digitalWrite(led_allarme, HIGH);

    // attesa di 15 secondi che è il tempo necessario per la chiusura della saracinesca
    if (digitalRead(rele_alimentazione) == HIGH) {
      delay(tempo_chiude);
      // poi tolgo l'alimentazione alla saracinesca
      digitalWrite(rele_alimentazione, LOW);
    }

    // il tutto deve rimanere in questa condizione fino alla pressione del tasto di reset
    while (digitalRead(tasto_reset) == HIGH) {}

    // che attiva il rele di alimentazione e scambio che riapre la saracinesca
    digitalWrite(rele_alimentazione, HIGH);
    digitalWrite(rele_scambio, HIGH);

    // si spegne il led di segnalazione allarme
    digitalWrite(led_allarme, LOW);

    //attendo 20 secondi che è il tempo necessario per aprire la saracinesca
    if (digitalRead((rele_alimentazione) && (rele_scambio == HIGH)) ) {
      delay(tempo_chiude);
      // poi tolgo l'alimentazione alla saracinesca
      digitalWrite(rele_alimentazione, LOW);
      digitalWrite(rele_scambio, LOW);
    }

    // e riporta arduino in attesa di eventuali perdite
  }

  // sezione riguardante il lampeggio led di controllo funzionamento di arduino

  time = millis();
  if (time > lampeggio_time + 3000) // tempo durata spegnimento led_chek arduino
  {
    digitalWrite(led_chek, HIGH);
  }
  if (time > lampeggio_time + 3010) // tempo durata accensione led_chek arduino deve essere > del tempo di spegnimento
  {
    digitalWrite(led_chek, LOW);
    lampeggio_time = millis();
  }
}
[/code]

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.