Problema a comandare un led con 2 pulsanti

buongiorno a tutti, chiedo scusa in anticipo se per caso questo post è stato fatto da qualcuno, ma personalmente cercando non ho trovato niente a riguardo.
Sono un elettricista e mi sono affacciato da un mesetto al mondo dell'arduino solo per scopo passatempo.
Nel progetto che vorrei fare è comandare un led con 2 o più pulsanti, il mio problema che ogni tanto cliccando uno dei pulsanti è come se non mi prendesse il comando e quindi devo cliccarlo più volte.
volevo capire se sbaglio io qualcosa oppure c'è un problema e dovrei usare più uscite.
in allegato vi lascio il collegamento che ho fatto e la programmazione.
Vi ringrazio in anticipo e spero di non aver sbagliato nulla inserendo il post.

Buona giornata,
Domenico

copy_of_external_interrupt1.ino (289 Bytes)

Prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...

... poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN 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 ...

... infine, in conformità al suddetto, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Dallo schema mi sembra di capire che hai regolarmente messo delle resistenze di pull-down sui bottoni, confermi?

Nel codice che hai allegato io vedo solo la lettura di un pulsante e l'accesnione di un LED ... quindi, se vuoi che ti si aiuti, metti il codice completo per la lettura dei due pulsanti che dici non ti funziona ...

Guglielmo

Vedo scritto dalay, anziché delay!
Comunque non è un buon sistema, perché tenendo premuto il pulsante più di 200ms i falsi contatti del pulsante fanno commutare l'uscita. Il sistema più semplice è mettere un condensatore da 100000pF (100nF) in parallelo al pulsante, con resistenze di pull down di circa 22~47kOhm.
Per farlo software, devi simulare il comportamento di un condensatore, che si carica ogni volta e per tutto il tempo che il pulsante è premuto e si scarica lentamente, quindi devi usare millis() aggiornando sempre una variabile che chiamiamo t se il pulsante è premuto e poi considerando il pulsante premuto se millis()-t<100. La commutazione deve avvenire se lo stato precedente del pulsante è non premuto e lo stato attuale è premuto.

#define PULSANTE 8
byte pulsPremuto=0; // 1: Pulsante premuto.
unsigned long t0=0; // Per prendere il tempo per l'antirimbalzo.

void setup()
{pinMode(PULSANTE, INPUT_PULLUP);}

void loop()
// ... ... ...
{
if(digitalRead(PULSANTE)==1) {pulsPremuto=1; t0=millis();} // Il pulsante è premuto! Mette pulsPremuto a 1. Prende millis() con t0 e tiene t0 aggiornato finché il pulsante rimane premuto.

if(pulsPremuto && millis()-t0>100) pulsPremuto=0; // Se il pulsante è stato premuto e poi è stato lasciato per più di 200ms, mette pulsPremuto a 0.

if(pulsPremuto) {/* Fa quello che deve fare */}
// ... ... ...
}

ogni tanto cliccando uno dei pulsanti è come se non mi prendesse il comando e quindi devo cliccarlo più volte

Il delay da 200ms scritto in quel modo ha due controindicazioni: la prima è che se il pulsante viene tenuto premuto a lungo, l'uscita cambia stato cinque volte al secondo, la seconda è che tra una pressione e l'altra bisogna aspettare almeno 200ms.

Se i pulsanti sono quelli su breadboard dello schema... il contatto dei terminali con le piste della breadboard è assolutamente non affidabile.

Per il debounce software "base" (che filtra i rimbalzi ma non i disturbi impulsivi) di solito 30..50ms di ritardo nel ciclo di loop sono ampiamente sufficienti. Ma l'istante di pressione va rilevato confrontando la lettura attuale con quella precedente:

attuale = digitalRead(...);
pressione = attuale & !precedente;
precedente = attuale;
delay(40);

if (pressione) .......

io ho utilizzato solo quel programma, non. c'è nessun altro pezzo di programma.
i pulsanti sono in parallelo nella stessa uscita, non è che non devo metterli nella stessa uscita?

Su un ingresso puoi mettere in parallelo quanti pulsanti vuoi

I pulsanti vanno sugli ingressi

domenicolisuzzo:
io ho utilizzato solo quel programma, non. c'è nessun altro pezzo di programma.
i pulsanti sono in parallelo nella stessa uscita, non è che non devo metterli nella stessa uscita?

Come ti hanno detto quel programma é sbagliato in modo "formale"

Non compila e non è quello il programma che stai usando, spero ti sia chiaro

Comunque anche se fosse quello non andrebbe, è non perché hai usato uno due o 100 pulsanti
Ma perché stai facento il debounce dei pulsanti nella maniera sbagliata, come ti é stato detto

Per inciso i pulsanti sono connessi correttamente, ma avresti potuto connetterli direttamente in parallelo tra loro risparmiano una resistenza

Sono sicuro che con questo programma hai gli stessi problemi indipendentemente da quale pulsante usi