buona sera
sono nuovo di questo mondo e sto cercando di usare arduino,
vorrei accendere un led per un minuto premendo un pulsante
e nel caso premessi il pulsante mentre il led è già acceso il timer si deve
azzerare e quindi rimanere acceso un ulteriore minuto.
Per capirci potrebbe essere una luce delle scale solo che ho un pulsante solo
(per non complicarmi la vita)a luce accesa se premo il timer si azzera
detto ciò ho creato questo
#define p1 4
#define luce 7
int p ;
int stato =0;
unsigned long timer;
boolean premuto;
void setup() {
pinMode(luce,OUTPUT) ;
pinMode(p1,INPUT);
premuto =false;
}
void loop() {
p = digitalRead(p1);
switch(stato)
{
case 0 :
digitalWrite(luce,LOW);
if (p==1)
{
premuto=true;
stato=1;
}
break;
case 1:
digitalWrite(luce,HIGH);
if(millis()-timer>=60000)
{
premuto=false;
stato=0;
}
else (p==1);
{
timer=millis();
}
break;
}
}
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link generali utili: Link Utili
Il Loop fa schifo e me accorgo pure io che sono alle prime armi.
innanzitutto benvenuto ..preparati psicologicamente come me che come principiante verrai sgridato umiliato e deteriorato...ma qui ci sono ottimi insegnanti...tutto quello che ho imparato e che sto imparando lo devo a loro.
Detto questo i casi sono 2:
1 Se vuoi una soluzione già fatta per il tuo scopo,per fare un semplice copia incolla te la posso fare pure io....ma cosi non imparerai niente.
2 Se vuoi imparare invece,procurati un sacco di Pazienza e di Ottimismo.
jack80:
nel caso premessi il pulsante mentre il led è già acceso il timer si deve
azzerare e quindi rimanere acceso un ulteriore minuto
Un normale timer retriggerabile.
Intanto buono l'uso di switch, in questo caso gli stati sono solo due per cui non è molto differente rispetto ad usare un semplice if, ma è comunque la base per costruire un'elaborazione a più stati (una logica a stati strutturata con switch è magari più lunga come numero di righe, ma è più comprensibile e facilmente modificabile rispetto ad una basata solo su flag settati/resettati).
Per quanto riguarda la logica corretta ci sono due stati:
spento, in cui si attende la pressione (e in quel momento si "azzera" il timer e si cambia stato)
acceso in cui si attende il timeout OPPURE una nuova pressione (e si "riazzera" il timer)
Nel tuo codice manca l' "azzeramento" timer nello stato spento, e manca il controllo della pressione pulsante nello stato acceso.
Notare che "azzera" significa salvare il valore del tempo attuale letto con millis(), in modo da confrontarlo con i successivi valori ritornati da millis() per determinare il tempo trascorso.
Nota: il codice andrebbe almeno indentato usando la formattazione automatica dell'IDE.
secondo me devi partire dal concetto di base ovvero il led deve rimanere acceso per 60 secondi a patto che si prema il pulsante. il fatto che tu ripremi il pulsante mentre il led è acceso non fa altro che farti switchare (dato che hai compreso come si usa lo switch) nella casistica di come se fosse spento. a te non serve lo stato attuale del led (acceso o spento), quello che conta è che se premi il pulsante azzeri i 60 secondi (fattibile con millis() ) e che il led vada in HIGH...
jack80:
buona sera
sono nuovo di questo mondo e sto cercando di usare arduino,
vorrei accendere un led per un minuto premendo un pulsante
e nel caso premessi il pulsante mentre il led è già acceso il timer si deve
azzerare e quindi rimanere acceso un ulteriore minuto.
Per capirci potrebbe essere una luce delle scale solo che ho un pulsante solo
(per non complicarmi la vita)a luce accesa se premo il timer si azzera
detto ciò ho creato questo
#define p1 4
#define luce 7
int p ;
int stato =0;
unsigned long timer;
boolean premuto;
mah forse il timer luce scala è lo sketch più semplice che esiste,
puoi mettere tutti i pulsanti che vuoi in parallelo,
e probabilmente qui è l unico caso che anche senza debounce non ci saranno mai problemi
Ma lo sketch non deve fare assolutamente nient'altro ? ... perche' in quel caso la soluzione potrebbe essere ancora piu semplice ... si legge il pulsante, ed ogni volta che e' premuto si mette una variabile unsigned long = millis() ... poi con un'if si manda basso il pin se millis()-variabile>60000, else pin alto ... fine ...
Quando premi, la variabile assume il valore di millis, l'else accende il pin, passati i 60 secondi lo rispegne, se prima che passino i 60 secondi ripremi la variabile si aggiorna ed aggiungi altri 60 secondi, e cosi via all'infinito ...
L'unico svantaggio e' che se passano piu di 49,7 giorni senza premere il pulsante, la luce si riaccende da sola per 60 secondi ... ma dubito che nella realta' poi succeda
elrospo:
sempre che a qualcuno non gli viene in mente di aggiungere queste due righe
e gli passa pure le terribile paura di "overflow " di millis()
... e cosa cambia ?
Anche in caso di overflow timer0_millis va a 0, quindi ? Anticipi solo l'evento come se fossero passati i 49.7 gg, ma per il resto, quello che succede all'overflow, succede identico con la tua assegnazione ... sempre 0 in timer0_millis si ha.
Comunque, chi si preoccupa del overflow di millis() NON ha capito come utilizzare tale funzione per ripetere periodicamente delle operazioni o per avere una azione di una determinata durata.
quando lo sketch diventa lungo e le cose che deve fare sono molte, azzerare il timer può essere una "soluzione comprensibile" o l unica soluzione "possibile"
poi in un temporizzatore luci scale, (timer a zero o no) la luce la comanda sempre il pulsante non vedo quale spirito dispettoso dovrebbe premere il pulsante al 49esimo giorno 8)
elrospo:
quando lo sketch diventa lungo e le cose che deve fare sono molte, azzerare il timer può essere una "soluzione comprensibile" o l unica soluzione "possibile"
... però mi devi spiegare il motivo di questa affermazione ... :
Perché ti serve azzerare il contatore del tempo che passa (... che comunque, in ogni caso, si azzera già da solo passato un determinato tempo)?
gpb01:
... però mi devi spiegare il motivo di questa affermazione ... :
Perché ti serve azzerare il contatore del tempo che passa (... che comunque, in ogni caso, si azzera già da solo passato un determinato tempo)?
Guglielmo
beh effettivamente dovrebbe essere come dici,
e la colpa è solo delle proprie capacità (o incapacità) a programmare correttamente quando le cose si complicano
e si vuole che il progetto funzioni davvero
dire una "situazione" che serve in continuazione azzerare millis() non ho idea di preciso, posso solo ipotizzare....
una situazione che serve più velocità ed ogni operazione in più rallenti tutto in modo inaccettabile
elrospo:
... una situazione che serve più velocità ed ogni operazione in più rallenti tutto in modo inaccettabile
... il rallentamento non può essere certo dovuto ad un contatore che semplicemente si incrementa
Faccio veramente fatica a ricordare casi in cui serva azzerare "l'orologio di sistema" ... probabilmente situazioni molto particolari, ma, onestamente, così su due piedi, non me ne viene in mente nessuna :
Molti di quelli che parlano di dover azzerare il contatore di millis() è perché NON hanno capito bene né come utilizzare correttamente la funzione, né la matematica binaria che c'è dietro il calcolo, che sempre si suggerisce, "millis() - valorePrecedenteMillis".
gpb01:
Anche in caso di overflow timer0_millis va a 0, quindi ? Anticipi solo l'evento come se fossero passati i 49.7 gg,
Hehe, beh, mi sa che con quel reset, se la luce è stata accesa meno di 60 secondi prima ti resterà accesa per 49 giorni! Diciamo che volendo proprio fare questo reset credo che dovrebbe adattare anche la variabile timer per "spostarla indietro" di 28 giorni ma essendo unsigned avrebbe problemi a farlo.
gpb01:
... il rallentamento non può essere certo dovuto ad un contatore che semplicemente si incrementa
"l'orologio di sistema" ...
[/i]".
Guglielmo
beh il rallentamento non intendevo al contatore che si incrementa, pero se azzerare il contatore evita di eseguire troppi "cicli extra" in applicazioni dove il tempo è "tiranno" si fa
poi ovviamente adesso le schede arduino moderne sono molto più veloci e chi vuole può farne uso
elrospo:
beh il rallentamento non intendevo al contatore che si incrementa, pero se azzerare il contatore evita di eseguire troppi "cicli extra" in applicazioni dove il tempo è "tiranno" si fa
... va beh ... continuo a non capire, ma lasciamo stare :
jack80:
... vorrei accendere un led per un minuto premendo un pulsante
e nel caso premessi il pulsante mentre il led è già acceso il timer si deve
azzerare e quindi rimanere acceso un ulteriore minuto.
... la problematica mi sembra semplice e ... questo è anche uno dei pochi casi dove si può ignorare il "debouncing", tanto qui NON deve contare esattamente gli impulsi, ma deve solo rilevare la pressione del pulsante.
Nel loop() ...
leggi se il pulsante è stato premuto
se SI, metti a true una flag e ti segni il valore attuale di millis()
se (la flag è a true) E (millis() - il valore salvato > 60 secondi) metti a false la flag
4 se la flag è true ... accendi il LED, se la flag è false ... spegni il LED