Problema codice arduino interruzione momentanea tasti

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.

grazie
Davide

Come hai capito, NON puoi usare la delay() ma devi usare la funzione millis() ...

... studia prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

P.S.: Dopo di che, per riassumere, dai un occhiata anche a QUESTO post.

grazie per la risposta ci darò un ulteriore lettura

ho notato che se premo il pulsante il primo segnale non viene inviato immediatamnete ma parte in base all'intervallo che ho inserito

vi posso inserire il codice? probabilmente a voi salterà più facilmente all'occhio l'errore

Posta pure il codice occhio però a racchiuderlo negli appositi tag come descritto nel regolamento.

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 :slight_smile:

grazie per la risposta

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

grazie

Ciao, lo scopo del tuo progetto è chiaro è il codice che non ti segue :slight_smile:

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 :slight_smile:

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 :slight_smile:

ho inserito un altro currentMillis2
e l'if del millis l'ho inserito subito dopo l'if che verifica se il pulsante è stato premuto

si può chiudere il topic grazie :))

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?

EDIT: è vero hai ragione
ho cancellato current

grazie ancora

esatto il confronto può essere

if (millis() - tempo_precedente > intervallo) {

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