salve, voglio tenere acceso un led per 1 min, però voglio che se premo un tasto prima della fine del minuto il led si deve spegnere. Ho utilizzato il delay ma in questo modo nn riesco.
Citando @gpb01... dovrai usare la funzione millis(), per capire come essa funziona puoi leggere prima QUI, poi QUI ed infine leggi anche QUI e QUI.
Credo che almeno in uno dei link proposti troverai quello che fa esattamente al caso tuo
![]()
fabpolli:
Citando @gpb01... dovrai usare la funzione millis(), per capire come essa funziona puoi leggere prima QUI, poi QUI ed infine leggi anche QUI e QUI.
Credo che almeno in uno dei link proposti troverai quello che fa esattamente al caso tuo![]()
Non sono riuscita ad applicare queste funzioni.
Allora spiego meglio:
Premo un interruttore e accendo i led. Ripremo l interruttore e spengo i led ma non del tutto. Voglio mantenere per 20 sec una luminosità del 50% e dopo i 20 secondi voglio che si spengano del tutto.
questo l ho già fatto.
Ora quello che non riesco è:
quando sono nei 20 sec in cui i led illuminano al 50%, voglio che se premo l interruttore i led si devono accendere e non aspettare che terminano i 20 sec.
Ora io per avere l illuminazione al 50% per 20 sec ho utilizzato un delay. Capisco che se voglio riaccendere i led al 100% prima che terminano i 20 sec non posso utilizzare il delay.
Come posso fare?
Devi imparare a usare la millis(). Si parte dall'esempio BlinkWithoutDelay
Quello però ha 2 "momenti" acceso e spento e il tempo passato fa scattare da uno stato 1 a stato 0 e viceversa.
Nel tuo caso gli stati o momenti sono 3, 0 spento, premo pulsante stato diventa 1, ripremo e stato diventa per un pò 2 e poi passati 20 secondi 0.
Devi avere una variabile che possa assumere questi 3 valori e a seconda del valore
Nello stato 2 se premi pulsante immediatamente stato=0 e finisci il conteggio.
Inizia a fare un programma con i due stati, alla pressione del tasto fai passare lo stato da 0 a 1 e viceversa (e quindi di conseguenza il led da spento ad acceso)
Ciao, propongo una soluzione.
Per prima cosa devi usare mills() al posto del delay(), trovi esempi di come fare, molti propongono la teoria ma poi ti basta vedere l'esempio.
Due, ti serve una variabile "STATO" che assume diversi valori, esempio 0 led al 100%, 1 led al 50%, 2 led spenti, la variabile cambia valore alla pressione del pulsante.
Tre, devi crearti tanti while-loop,
Ti faccio un esempio in PSEUDOCODICE
byte Stato=0;
void setup(){
}
void loop(){
/*Premendo il pulsante Stato aumenta di 1, arrivato a due torna a zero
in modo che in rotazione puoi selezionare tutte le opzioni, "si potrebbe modificare con 2 pulsanti */
if(digitalRead(pin)==LOW)
Stato++;
if(Stao>2)Stato=0;
switch(Stato){
case 0:
SPENGO IL LED analogWrite
break;
case 1:
accendo il led
break;
case 2:
funzione50();
break;
}
}
void funzione50()
{
analogWrite(led,125);
unsigned long tempo=millis();
while(1){//loop infinito
if(LEGGO IL PULSANTE){
INPOSTO STATO E ESCO Stato=; // esco dalla funzione e accendo i led al 100%
return;
}
if(millis()-tempo>=20000){
INPOSTO STATO E ESCO;//esco dalla funzione e spengo i led
return ;
}
}
}
allora questa è la parte di codice che voglio variare . Voglio poter aggiungere che durante i secondi di pausa se premo il tasto posso aumentare la luminosità
sketch_jul06a.ino (384 Bytes)
dorotea12: Ti prego di considerare che, purtroppo qui NON funziona così ...
... qui nessuno scrive software per conto terzi, ma si aiuta chi viene qui a correggere/ottimizzare il software che lui scrive.
Ti sono state date TUTTE le indicazioni, ora mettiti li, STUDIA (... e non leggi), capisci come funziona millis() e torna quando avrai provato ad implementare la cosa mostrandoci il codice che avrai scritto.
Grazie.
Guglielmo
ho provato al posto di delay a mettere il codice in basso, ma mi rimane bloccato l illuminazione al valore 10 e non va a low
sketch_jul06a.ino (194 Bytes)
sketch_jul06a.ino (194 Bytes)
E cosa sarebbe quello che hai allegato ? ? ? :o
Di sicuro NON un programma ...
I programmi si mettono COMPLETI e racchiusi tra i tag CODE (in conformità al regolamento, punto 7) ... se sono così grandi che non si possono inserire nel post, tra i tag CODE, allora si possono allegare.
Guglielmo
gpb01:
E cosa sarebbe quello che hai allegato ? ? ? :o
ho allegato la parte di codice che ho sostituito con il delay. Comunque il resto del mio codice è giusto quindi non l ho pubblicato per questo.
... ma noi con quel pezzo non ci facciamo nulla, quindi, se vuoi che qui qualcuno ti aiuti, pubblica l'intero codice come si deve !
Guglielmo
gpb01:
... ma noi con quel pezzo non ci facciamo nulla, quindi, se vuoi che qui qualcuno ti aiuti, pubblica l'intero codice come si deve !Guglielmo
volevo solo sapere se quel pezzo potesse darmi la stessa funzione del delay. Non credo che c sia bisogno dell intero codice.
Ok, tu non pubblicare il codice (... neanche contenesse chissà quali segreti), nessuno ti potrà aiutare ed io chiuderò il thread ...
Guglielmo
P.S.: ... sono veramente stufo di gente che chiede di essere aiutata e poi fa di tutto per "mettere i bastoni tra le ruote" a chi la vuole aiutare ! >:(
dorotea12:
volevo solo sapere se quel pezzo potesse darmi la stessa funzione del delay. Non credo che c sia bisogno dell intero codice.
Non sappiamo dirlo.
È come se ci chiedi se un cucchiaio di sale é abbastanza o troppo per la cena che cucini. Senza che ci dici l' intero menú e ricette e per quante persone cucini qualsiasi risposta puó essere giusta o sbaglata.
Ciao Uwe
Penso che se avessi guardato e capito l'esempio che ti ho postato, avresti potuto e forse dovuto arrivare
a una soluzione.
Tu usi un delay(), ottieni una pausa voluta, ma il programma si blocca e non puoi fare niente fino al termine della pausa, quindi non puoi leggere neanche la pressione di un tasto.
Ti avevo suggerito di sostituire i delay() con un while e millis(), in questo modo
tempo=millis();// Tempo iniziale
while(1){// ciclo infinito
//Qui nella pausa, all'interno del while puoi fare tutto quello che vuoi come se fossi nel loop()
//Esempio leggere un pulsante, continuando a fare una "pausa" nel programma
if(digitalWrite(pulsante)==LOW){
......
......
......
}
if(millis()-tempo>=20000) break;// nel while controllo che non siano passati 20 secondi poi esco
}
Se non capisci MI ARRENDO, se invece è chiaro, FACCELO SAPERE PER FAVORE ![]()
torn24:
Penso che se avessi guardato e capito l'esempio che ti ho postato, avresti potuto e forse dovuto arrivare
a una soluzione.Tu usi un delay(), ottieni una pausa voluta, ma il programma si blocca e non puoi fare niente fino al termine della pausa, quindi non puoi leggere neanche la pressione di un tasto.
Ti avevo suggerito di sostituire i delay() con un while e millis(), in questo modo
tempo=millis();// Tempo iniziale
while(1){// ciclo infinito
//Qui nella pausa, all'interno del while puoi fare tutto quello che vuoi come se fossi nel loop()
//Esempio leggere un pulsante, continuando a fare una "pausa" nel programma
if(digitalWrite(pulsante)==LOW){
......
......
......
}
if(millis()-tempo>=20000) break;// nel while controllo che non siano passati 20 secondi poi esco
}
Se non capisci MI ARRENDO, se invece è chiaro, FACCELO SAPERE PER FAVORE :)
Quel while(1) è innutile e fuorviante, c'è già il loop che si occupa di creare un ciclo infinito al cui interno, come suggerito, si deve usare millis() per creare la logica necessaria a non interrompre il flusso del programma dove non strettamente necessario
dorotea12:
ho provato al posto di delay a mettere il codice in basso, ma mi rimane bloccato l illuminazione al valore 10 e non va a low
No. Quel pezzo può andare bene usato in maniera diversa, ma è tutto il programma che devi cambiare, perchè per usare la millis() devi cambiare proprio il concetto/logica del programma. Usando la logica macchina a stati finiti, qui un link, in italiano. Il concetto NON è poi così astruso. www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
qui in inglese con anche il discorso del fade del led ma senza pulsante: https://www.sparkfun.com/news/1801
NON fare questi passi nel tuo attuale programma. Dovendo cambiare logica del programma non è possibile mettere 2 righe nuove nell'attuale e sperare funzioni.
Devi usare una variabile esempio "stato" che parte a 0. 0=led spento
L'evento che lo porta a 2 e quindi accendi il led al 100% è la pressione del pulsante.
Fai per primo questo semplice programma. Per ora manca il pezzo dei 20 secondi a 50%, ovvero stato=1 ma lo implementiamo dopo. Un passo alla volta.
fabpolli, non è affatto inutile, una pausa e un timer con millis() sono due cose diverse, la prima interrompe l'esecuzione essendo in un while() permette di fare altre cose, la seconda ripete a intervalli di tempo regolari l'esecuzione di qualcosa.
Non si deve usare solo il loop() function, se necessario si creano altri loop con while() in altre funzioni, il while ha il vantaggio che puoi terminare quando questo non serve, la funzione loop() non deve terminare.
Ma se pensi di avere ragione, posta un esempio di "pausa" e non di "timer" con millis() nel loop(). ![]()
grazie dei consigli. provo subito ![]()
>torn24 e >fabpolli ...
... vi pregherei di continuare la vostra diatriba sull'utilità o meno del while() in privato NON inquinando il thread con disquisizioni ed esempi che esulano dal codice di dorotea12.
E comunque, se fossi in voi, aspetterei di vedere il suo codice di completo ... che gli è stato più volte richiesto e che nessuno ha ancora visto !
Guglielmo