Go Down

Topic: Pulsante con ritardo attivazione usando millis (Read 141 times) previous topic - next topic

DarkShadows

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  :smiley-cry: )  tramite un pulsante , solo dopo che il tempo prefissato sia trascorso.
 Qualcuno può aiutarmi?
Il pulsante è mantenuto alto da una resistenza di pullup esterna.
Code: [Select]
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);
}
}

maubarzi

ti do un indizio ;)

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.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

torn24

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

"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.

Claudio_FF

#3
May 11, 2019, 08:48 am Last Edit: May 11, 2019, 12:27 pm by Claudio_FF
Quote
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.

Una domanda ben posta è già mezza risposta.

Go Up