Estou escrevendo um mp3 player que grava informações em um monitor LCD. Gostaria de convertê-lo do teclado para o uso de botões, mas estou constantemente recebendo pressionamentos de teclas. Eu tentei puxar para cima e para baixo / para cima, mas ainda estou obtendo o mesmo resultado. Alguém sabe de imediato se este é um problema conhecido ou estou apenas fazendo algo errado? Ah, eu também estou fazendo isso inteiramente em C usando a fiação PI.
12
if(digitalRead(data) && millis()-startTime > 10){
e defina startTime sempre que entrar no loop.Respostas:
Os botões e interruptores mecânicos podem sofrer oscilações, onde alternam rapidamente entre aberto e fechado por vários milissegundos.
Você pode tentar rebater o botão / chave no software ou hardware.
Provavelmente o mais simples em software.
Se o nível mudar (ativado ou desativado ou desativado), aguarde x milissegundos e leia o gpio novamente. Se ainda estiver no novo estado, assuma que é uma transição real. O valor de x pode ser algo como 20.
Para soluções de hardware, procure esse tipo de postagem
fonte
Aproveite o tempo para ler o guia de rebate de Jack Ganssle . A primeira página ilustra o problema detalhadamente, e a segunda, como lidar com ele em hardware ou software. Não existe um método de rejeição "perfeito", mas existem muitos métodos ruins!
Esse é um problema que você encontrará repetidamente se fizer a interface do software com os comutadores, portanto vale a pena dedicar um tempo para entendê-lo, e o artigo de Jack é a maneira mais concisa que eu já vi de fazer isso.
fonte
Em aplicativos que possuem um ticker de sistema, eu geralmente implemento um registro de turno.
Obviamente, você deve realizar o evento de pressionar o botão apenas em uma borda ascendente.
fonte