Aiuto modifica codice con millis

Salve a tutti
Ho scritto questo semplice codice che serve a comandare un Relè sia con un sensore del suono sia con un pulsante. Il relè sarà temporizzato tramite codice di un tot secondi e per fare questo ho utilizzato la funzione millis. Tutto funziona a dovere ma essendo che arduino dovrà rimanere sempre acceso mi aiutate a modificare il codice in modo da evitare il problema dell'azzeramento del contatore millis? Grazie a chi vorrà aiutarmi.

int sensore_suono = 4;
int rele = 6;
int stato_sensore = 0;
int pulsante = 8;
int stato_pulsante = 0;
int stato_rele = 0;
unsigned long time;
unsigned long tempo_accensione_rele = 0;

void setup() {
pinMode (sensore_suono, INPUT);
pinMode (rele, OUTPUT); 
pinMode (pulsante, INPUT);
}

void loop() {
stato_sensore = digitalRead (sensore_suono);
stato_pulsante = digitalRead (pulsante);
stato_rele = digitalRead (rele);
time=millis();

//sezione sensore suono--------------------
if (stato_sensore == LOW) {
  digitalWrite (rele, HIGH);
  tempo_accensione_rele=millis();
  }
else { if (time>tempo_accensione_rele+5000)
    {digitalWrite(rele,LOW);  
    }
  } 

// sezione pulsante------------------------
if (stato_pulsante == HIGH) {
  digitalWrite (rele, HIGH);
  tempo_accensione_rele=millis();
  }
else { if (time>tempo_accensione_rele+5000)
    {digitalWrite(rele,LOW);  
    }
  }
}

Basta cambiare l'ordine con cui fai i conti, trattandosi di unsigned int (quindi numeri che non diventano MAI negativi) il risultato della sottrazione sarà sempre coerente e valido.

P.S.
Le variabili stato_sensore , stato_pulsante e stato_rele sono ridondanti, puoi anche usare direttamente digitalRead() e digitalWrite.

P.P.S.
Attenzione all'ingresso definito come INPUT: assicurati che il segnale sia a "pull-down" con una resistenza visto che lo vai a testare sul livello HIGH, oppure abilita le resistenze di pull-up interne del micro e vai a fare l'if sul livello == LOW

int sensore_suono = 4;
int rele = 6;
int stato_sensore = 0;
int pulsante = 8;
int stato_pulsante = 0;
int stato_rele = 0;
unsigned long tempo_accensione_rele = 0;


void setup() {
  pinMode (sensore_suono, INPUT);
  pinMode (rele, OUTPUT);
  pinMode (pulsante, INPUT);
}

void loop() {
  stato_sensore = digitalRead (sensore_suono);
  stato_pulsante = digitalRead (pulsante);
  stato_rele = digitalRead (rele);

  //sezione sensore suono--------------------
  if (stato_sensore == LOW) {
    digitalWrite (rele, HIGH);
    tempo_accensione_rele = millis();
  }
  else {
    if (millis() - tempo_accensione_rele > 5000) { 
      digitalWrite(rele, LOW);
    }
  }

  // sezione pulsante------------------------
  if (stato_pulsante == LOW) {
    digitalWrite (rele, HIGH);
    tempo_accensione_rele = millis();
  }

  else {
    if (millis() - tempo_accensione_rele > 5000) { 
      digitalWrite(rele, LOW);
    }
  }
}
1 Like

Grazie per la tua disponibilità.
Ho provato il codice e funziona ugualmente come prima.
Quindi non dovrei avere problemi nel tempo riguardo a millis? sembra di si.

Per quanto riguarda:

ho inserito la resistenza al pulsante mentre per il sensore no.
Il sensore funziona al contrario ha un'uscita digitale e a riposo è HIGH mentre quando attivo LOW. Ci vuole una resistenza anche sull'uscita del sensore?

No, nessun problema.
Senza che entro nei dettagli, leggi qui sul perché se vuoi approfondire (in particolare, la soluzione 2 che è quella che personalmente preferisco).

No, sul sensore non serve in quanto ci pensa il modulino a mantenere il livello dell'uscita coerente.

1 Like

Perfetto. Grazieeeeeee. :blush:

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