Salve ragazzi,
stavo scrivendo questo sketch per arduino. In pratica ho due pulsanti, se li premo entrambi a distanza di meno 2 secondi l’uno dall’altro, allora incremento il contatore.
Quindi leggo i pin dei pulsanti e memorizzo il tempo in cui sono stati premuti, se sono entrambi stati premuti e se la differenza dei tempi è minore di 2 secondi, allora aumento il contatore dei punti.
Però ho un piccolo problema, a volte è come se non rispondesse, cioè premo entrambi (anche assieme o a distanza di nemmeno 1 sec) ma non mi incrementa il contatore.
Sapreste darmi qualche aiuto o qualche soluzione migliore?
Provando lo sketch con i pulsanti del circuito interessato, ho scoperto che il venditore mi ha venduto in realtà degli interruttori, anche se gli ho chiesto espressamente dei pulsanti e chiesto più volte se fossero pulsanti.
Quindi ho riadattato lo sketch in questo modo, che in realtà è anche più semplice (dovrei ringraziare il venditore forse? xD)
Uppare una discussione NON è consensito dal regolamento. Questo è un forum, non l’assistenza di una scuola di informatica
La soluzione al tuo problema necessita di 2 variabili per salvare il valore di millis quando vengono premuti i pulsanti e di 2 variabili di stato per sapere appunto se i pulsanti sono stati premuti. Però devi anche azzerare tutto quando sono passati 2 secondi dalla prima pressione, e questa è la cosa che mi pare tu non faccia.
Io farei così:
void loop() {
if (digitalRead(PULS1)) {
if !pulsante1) { //questo per evitare di registrare nuovamente l'evento
pulsante1 = true;
tempo_puls1 = millis();
}
}
if (digitalRead(PULS2)) {
if !pulsante2) { //questo per evitare di registrare nuovamente l'evento
//puoi togliere questo if se non vuoi questo tipo di logica
pulsante2 = true;
tempo_puls2 = millis();
}
}
if (pulsante1 && pulsante2) { //se e solo se entrambi i pulsanti sono stati premuti
if (tempo_puls1 >= tempo_puls2) { //premuto prima puls2
if ((tempo_puls1 - tempo_puls2) < 2000)) {
ok = true;
}
} else { //premuto prima puls1
if ((tempo_puls2 - tempo_puls1) < 2000)) {
ok = true;
}
}
}
//controllo se sono passati più di 2 secondi dalla prima pressione
tempo = millis();
if (pulsante1) {
if ((tempo - tempo_puls1) > 2000) {
pulsante1 = false;
}
}
if (pulsante2) {
if ((tempo - tempo_puls2) > 2000) {
pulsante2 = false;
}
}
//ora controllo:
if (ok) {
..... fai quel che devi
}
}
Nota: codice NON provato, scritto sul forum e non nell’IDE. E’ uno spunto, potrebbe anche non compilare né funzionare