Salve ragazzi
sto iniziando a "giocare" con arduino 1
per ora mi dedico a cose basilari.
ho una problematica riguardo una parte di codice
il progetto prevede l'utilizzo di due tasti collegati ognuno a un led.
il problema che riscontro è che quando premo il tasto 1 e si accende il led e invia il segnale ir (è presente un tramettirore) vorrei che il tasto si disabilitasse per un tempo preciso, ad esempio per 2 secondi.
il problema è che se uso la funzione delay() non posso utilizzare il tasto 2, che invece io vorrei che fosse attivo.
come posso risolvere il problema
sto provando con la funzione millis() ma non credo di aver capito pienamente come sfruttarla.
Senza vederlo credo che tu abbia inserito l'accensio del led all'interno del controllo di milis, invece di fare così dovresti mettere una variabile (booleana) che ti segnala se il pulsante è stato premuto, ovvero accendi il led e valorizzi questa variabile, se è già stato premuto non fai nulla, all'interno del controllo di millis quando è trascorso il tempo semplicemente reimposti la variabile e alla successiva pressione accenderai di muovi il led setterai la variabile e reimposti il valore di millis per tornare a contare il tempo necessario prima di reimpostare la variabile del pulsante premuto.
Detta così è un po' contorta ma non sono risucito a metterlo meglio sotto forma di testo
ti ripeto cercando di essere più chiaro quale voglio che sia il risultato finale.
dopo aver premuto il tasto 1 e inviato il segnale voglio che per 2 secondi anche se ripremo il tasto non invia un ulteriore segnale (come se ci fosse un timer), in questo lasso di tempo però il tasto 2 deve poter funzionare liberamente
Ciao, lo scopo del tuo progetto è chiaro è il codice che non ti segue
Allora ti propongo la solita soluzione, scomporre il problema in parti più semplici e andare avanti solo quando la parte precedente funziona.
Nel tuo caso il codice legge ogni ciclo di loop lo stato del pulsante ma verifica se deve fare qualcosa solo dopo che è trascorso il tempo prefissato (interval1) e in ogni caso al successivo giro di loop spegne il led (queso non so se è voluto oppure no visto che pegni il led immediatamente dopo aver trasmesso)
Devi cambiare il codice in modo che i pulsanti vengano sempre letti e che venga sempre verificato se siano stati premuti, se è premuto allora verifichi che sia intercorso il tempo e fai quello che devi se non è trascorso il tempo necessario dall'ultima pressione allora non fai nulla. In pratica inizializzi previousMillis1 se accendi il led.
Altra cosa gli intervalli li hai definiti long e non unsigned long in questo caso specifico funziona anche ma confrontare due tipi differenti può portare a risultati a volte differenti da ciò che ci si aspetta, se non hai particolari problemi di memoria utilizza sempre variabili unsigned long con tutto ciò che ha a che fare con millis()
fabpolli:
Ciao, lo scopo del tuo progetto è chiaro è il codice che non ti segue
Allora ti propongo la solita soluzione, scomporre il problema in parti più semplici e andare avanti solo quando la parte precedente funziona.
Nel tuo caso il codice legge ogni ciclo di loop lo stato del pulsante ma verifica se deve fare qualcosa solo dopo che è trascorso il tempo prefissato (interval1) e in ogni caso al successivo giro di loop spegne il led (queso non so se è voluto oppure no visto che pegni il led immediatamente dopo aver trasmesso)
Devi cambiare il codice in modo che i pulsanti vengano sempre letti e che venga sempre verificato se siano stati premuti, se è premuto allora verifichi che sia intercorso il tempo e fai quello che devi se non è trascorso il tempo necessario dall'ultima pressione allora non fai nulla. In pratica inizializzi previousMillis1 se accendi il led.
Altra cosa gli intervalli li hai definiti long e non unsigned long in questo caso specifico funziona anche ma confrontare due tipi differenti può portare a risultati a volte differenti da ciò che ci si aspetta, se non hai particolari problemi di memoria utilizza sempre variabili unsigned long con tutto ciò che ha a che fare con millis()
ciao
fortunatamente ho risolto grazie
ho inserito un altro currentMillis2
e l'if del millis l'ho inserito subito dopo l'if che verifica se il pulsante è stato premuto
Del secondo currentmillis non te ne fai da nulla tanto contiene sempre il valore di millis, a ben vedere non ti serve manco il primo ma vabbé la soluzione è stata spostare la verifica di milli dopo aver valutato lo stato.
fabpolli:
Del secondo currentmillis non te ne fai da nulla tanto contiene sempre il valore di millis, a ben vedere non ti serve manco il primo ma vabbé la soluzione è stata spostare la verifica di milli dopo aver valutato lo stato.
quindi potrei mettere direttamente millis senza creare la variabile?
così come riportato nel sito di Leonardo Milliani (primo link nel post #1 di @gpb01)
Si risparmia un innutile variabile e si ottine il medesimo risultato