Pulsanti che ottengono troppi eventi


12

Sto scrivendo un lettore mp3 che scrive informazioni su un display LCD, mi piacerebbe convertirlo dall'uso della tastiera all'utilizzo dei pulsanti, ma ricevo costantemente troppe pressioni dei tasti. Ho provato a tirare su e cadere / salire il fronte ma sto ancora ottenendo lo stesso risultato. Qualcuno sa fuori mano se questo è un problema noto o sto solo facendo qualcosa di sbagliato? Oh, lo sto facendo anche interamente in C usando cablaggioPi.


1
Solo per aggiungere al piatto di soluzioni software, controlla il nostro amico in micro controller. arduino.cc/it/Tutorial/Debounce
Cammy_the_block

Ecco un frammento di qualcosa che ho scritto qualche tempo fa. if(digitalRead(data) && millis()-startTime > 10){e imposta startTime ogni volta che entra in loop.
Cammy_the_block il

solo chiedendo; su cosa imposterei esattamente startTime?
Linuxgnuru,

Qualche contatore del tempo. Arduino ha la funzione millis che dà il tempo dall'inizio.
Cammy_the_block il

Ah ok, lo stesso vale per il cablaggio
linuxgnuru,

Risposte:


12

I pulsanti e gli interruttori meccanici possono soffrire del rimbalzo degli interruttori in cui si alternano rapidamente tra aperto e chiuso per diversi millisecondi.

Puoi provare a debouncare il pulsante / interruttore nel software o hardware.

Probabilmente il più semplice nel software.

Se il livello cambia (da acceso a spento o da spento a acceso) attendere x millisecondi e leggere di nuovo gpio. Se è ancora nel nuovo stato, supponiamo che sia una vera transizione. Il valore di x potrebbe essere simile a 20.

Per soluzioni hardware cerca questo tipo di post


8

Prenditi il ​​tempo di leggere la guida al rimbalzo di Jack Ganssle . La prima pagina illustra il problema in dettaglio, e la seconda come affrontarlo in hardware o software. Non esiste un metodo di rimbalzo "perfetto", ma ce ne sono molti di cattivi!

Questo è un problema che incontrerai ripetutamente se l'interfacciamento del software con gli switch, quindi vale la pena prendersi il tempo di capirlo, e l'articolo di Jack è il modo più conciso che ho visto per farlo.


2

Nelle applicazioni che hanno un ticker di sistema di solito implemento un registro a scorrimento.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Naturalmente, è necessario eseguire l'evento di pressione dei pulsanti solo su un fronte di salita.


1
Questo è un metodo interessante. Facilmente personalizzabile (mascherando i bit più significativi di button_checker) per richiedere un numero variabile di letture consecutive.
Giovanna,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.