Correggere debouncing con il Millis

Ciao a tutti!

Sto cercando di gestire un'automazione mediante la lettura di un semplice pulsante galleggiante High/Low immerso in un liquido. Vorrei ottimizzare il più possibile l'errore on/off dovuto al debouncing in fase di galleggiamento (movimento dell'acqua ecc ecc).

Per esempio volevo impostare un tempo di sicurezza dove, se il galleggiante chiude il contatto, devono passare tipo 5 secondi. al passare dei 5 secondi, se il galleggiante è ancora nello stato di chiusura, procedi ad effettuare tutte le funzioni programmate del caso. In caso contrario, azzera il tempo di attesa per la prossima chiusura del contatto del galleggiante.

Pensavo di utilizzare per comodità il millis con la funzione millis meno la variabile long T che si azzera ogni volta, ma non funziona correttamente.

Esiste una funzione magari più semplice rispetto il millis? Vorrei evitare il delay perchè è già implementato in altre funzioni basilari come il blink di un semplice led che funge come allarme soglia livello del liquido.

grazie!

Metti il codice che hai scritto perché non c'è alcun motivo per cui, utilizzando millis() la logica che descrivi non funzioni ... :roll_eyes:

Guglielmo

int rosso = 13;
int verde = 7;
int sensore = 8;
long t = 0;
long debounce_delay = 5000;
bool allarme;

void setup() {
  pinMode(rosso, OUTPUT);   //Led rosso per segnalare allarme.
  pinMode(verde, OUTPUT);   //Led verde per dispositivo funzionante.
  pinMode(sensore, INPUT);  //Sensore per leggere il serbatoio dell'acqua.
}

void loop() {

  if (digitalRead(sensore) == HIGH) {
    if ((millis() - t) > debounce_delay) {
      allarme = true;
      t = millis();
    } else {
      allarme = false;
    }
  }

  if (allarme == true) {  //Gestione sistema in base allo stato del sensore.
    digitalWrite(verde, LOW);
    digitalWrite(rosso, HIGH);
  } else {
    digitalWrite(verde, HIGH);
    digitalWrite(rosso, LOW);
  }

  if (digitalRead(rosso) == HIGH) {  //Blink Led rosso per segnalare allarme.
    digitalWrite(rosso, HIGH);
    delay(200);
    digitalWrite(rosso, LOW);
    delay(200);
  }
}

Il sistema funziona se chiudo il contatto del sensore, ma appena riapro il contatto del sensore, lo stato di allarme del ledo rosso non ritorna a zero, e non vengono comunque rispettati i 5 secon di di attesa.

Questo è quello che hai scritto:
345463456

Questo è quello che avresti dovuto scrivere:
34654645634

Se digitalRead(sensore)==0 -> t=millis();
Se millis()-t>5000 {...} // È chiuso da almeno 5s.

Anche il LED rosso puoi farlo lampeggiare senza bloccare il loop: lo accendi e prendi il tempo; se sono trascorsi 200ms lo spegnie prendi il tempo; dopo 200ms lo riaccendi.

Ciao! Prima di controllare il forum ho provato ad apportare questo tipo di modifica ed ora sembra che funzioni correttamente, eliminando totalmente i possibili errori del galleggiante aperto/chiuso in un piccolo lasso di tempo! :slight_smile:

Ora controllo con il serial se realmente il millis si resetta.

int rosso = 13;
int verde = 7;
int sensore = 8;
long t = 0;
long debounce_delay = 5000;
bool allarme;

void setup() {
  pinMode(rosso, OUTPUT);   //Led rosso per segnalare allarme.
  pinMode(verde, OUTPUT);   //Led verde per dispositivo funzionante.
  pinMode(sensore, INPUT);  //Sensore per leggere il serbatoio dell'acqua.
}

void loop() {

  if (digitalRead(sensore) == HIGH) {
    if ((millis() - t) > debounce_delay) {
      allarme = true;
      
    }

  } else {
    allarme = false;
    t = millis();
    
  }

  if (allarme == true) {  //Gestione sistema in base allo stato del sensore.
    digitalWrite(verde, LOW);
    digitalWrite(rosso, HIGH);
  } else {
    digitalWrite(verde, HIGH);
    digitalWrite(rosso, LOW);
  }

  if (allarme == true) {  //Blink Led rosso per segnalare allarme.
    digitalWrite(rosso, HIGH);
    delay(200);
    digitalWrite(rosso, LOW);
    delay(200);
  }
}

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