Pulsante con ritardo attivazione usando millis

Ciao ragazzi , sto cercando di capire la funzione millis , ma onestamente non capisco dove sbaglio. ( sono un principiante) . Il progetto è semplice , far accendere un led ( che non si è mai acceso fin'ora :sob: ) tramite un pulsante , solo dopo che il tempo prefissato sia trascorso. Qualcuno può aiutarmi? Il pulsante è mantenuto alto da una resistenza di pullup esterna.

int pulsante;
int led;
unsigned long tempoattesa = 5000;
unsigned long ultimotempo = 0;
int valore;

void setup() {
pinMode(INPUT,pulsante);
pinMode(OUTPUT,led);
}
void loop() {
valore = digitalRead(pulsante);
if ( valore == LOW) {
  ultimotempo = millis();
}
if (valore == LOW && (millis() - ultimotempo) > tempoattesa){ 
digitalWrite(led,HIGH);
 }
else {
digitalWrite(led , LOW); 
}
}

ti do un indizio :wink:

Fai con la stessa condizione:
ultimotempo = millis();
e
millis() - ultimotempo)
quindi visto che nel mezzo non c’è altro, mi sa che il secondo da sempre zero.

Ciao! Noto che pinMode() è usato male, INPUT E OUTPUT vanno messi come secondo argomento :slight_smile:

“con la stessa condizione” forse potrebbe confondere visto che ci sono due if

Il tuo codice in pratica fa questo, quando il pulsante è premuto ultimotempo=millis() e poi sempre quando il pulsante è premuto, calcolo la differenza. Siccome quando il pulsante è premuto ultimotempo è millis() hanno lo stesso valore, la differenza da sempre zero.

Secondo me potresti usare una variabile flag, se premo il pulsante flag diventa 1 o true, se è 1 calcolo la differenza, se il tempo è passato accendo il led e riporto flag a zero.

sto cercando di capire la funzione millis , ma onestamente non capisco dove sbaglio

La funzione ‘millis’ è usata in modo corretto. Il problema è che la variabile ‘ultimotempo’ dovrebbe essere “caricata” solo nel momento esatto in cui il pulsante viene premuto, e non ad ogni giro di loop in cui il pulsante risulta sempre premuto.

Ci sono tre fasi ben distinte di funzionamento: l’attesa della pressione, il conteggio mentre il pulsante è premuto, e la fase attivo, che termina al rilascio del pulsante ritornando in attesa.

Come sempre trovo più semplice ragionare su carta per “fasi di funzionamento”, cosa può avvenire in ogni fase, e cosa si deve fare quando le cose avvengono…

…la sintassi corretta viene fuori automaticamente come conseguenza.

darkshadowsfcs.png