Fala Pessoal! Tudo bem? 😀
Bom, neste post vamos falar sobre um efeito conhecido como “switch-bouncing” (uma espécie de trepidação elétrica – vide a imagem de abertura deste post – a imagem do osciloscópio), que acontece ao pressionarmos ou deixarmos de pressionar um “push-button“, chave-de-toque, botão de pressão e até mesmo interruptores comuns! 💡
O que a gente percebe observando as imagens “do osciloscópio” (sim, digo isso porque poderíamos ter utilizado aqui gráficos simplórios mostrando o mesmo efeito de “switch-bouncing“, mas que poderiam não condizer com a verdade e a realidade absoluta – a mesma obtida através de um osciloscópio – ainda que tivéssemos utilizado programas de alta reputação no mercado para realizar os gráficos) desse mesmo efeito de “trepidação“, “pulso“, “bouncing” de um botão.
Bom, vamos falar do que a gente espera ao pressionar um simples push-button:
Ao pressionarmos o botão, esperaríamos que o estado do botão fosse imediatamente lido como um nível lógico alto (ou baixo). MAS, na realidade, quando pressionamos, o botão pulsa para cima e para baixo muito rapidamente antes de se estabilizar (as imagens acima mostram isso).
Então…sabendo disso tudo que conversamos até aqui pessoal, o que a gente precisa fazer agora? Tem ideia? 🙄
Bom, o lance é que desejamos a todo custo “eliminar” o sinistro fenômeno de “switch-bouncing” do nosso circuito eletrônico (claro! esse tal fenômeno aí só serve pra causar dor de cabeça futura, acreditem), então, pra conseguir este feito, temos diferentes saídas, ideias distintas e por aí vai, MAS, já que aqui estamos trabalhando com nosso querido ARDUINO e sua respectiva IDE, então que tal a gente obter justamente o efeito que desejamos, que neste caso é o efeito-contrário ao do “switch-bouncing“, sendo conhecido popularmente como “debouncing” via código, sketch, programação?! 😉
O CÓDIGO (SKETCH) DO PROGRAMA PARA REMOVER “TREPIDAÇÕES” DO PUSH-BUTTON:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/* * PROGRAMA: "DEBOUNCING PUSH-BUTTON VIA CODIGO/SKETCH" * =========================================================================================== * PINOS 09 E 02 DO ARDUINO - 328P MCU * BLOG: https://EletronicaParaTodos.com * AUTOR: RODRIGO COSTA. * 08/06/2017 * ------------------------------------------------------------------------------------------- */ const int led = 9; // o led esta ligado ao pino 09 const int button = 2; // o botao esta ligado ao pino 02 boolean lastButton = LOW; // variavel que guarda o ultimo estado do botao (até porque comecamos com o botao sempre em LOW via resistor PULL-DOWN) boolean currentButton = LOW; // variavel contendo o atual estado do botao (e ainda utilizamos aqui um resistor pull-down) boolean ledOn = false; // o atual estado do led (on/off) (o led começa em OFF porque o button começa em LOW) PS: (FALSE = LOW = 0) void setup() { pinMode(led, OUTPUT); // configura o pino do led como saida pinMode(button, INPUT); // configura o pino do botao como entrada (não é obrigatório pois por padrão os pinos são configurados como ENTRADA) //Serial.begin(9600); // iniciamos a saida serial para DEBUG } /* * ------------------------------------------------------------------- * FUNCAO DEBOUNCING * PASSAMOS O ESTADO "ANTERIOR" DO BOTAO E RECEBEMOS DE VOLTA O ESTADO * ATUAL DO BOTAO DEPOIS DO "DEBOUNCING" * ------------------------------------------------------------------- */ boolean debounce(boolean last) { boolean current = digitalRead(button); // le o estado atual do botao if(last != current) { delay(3); // espera 3ms --> AQUI VAI O "SEGREDO" DO "EFETIVO E SEGURO, ALÉM DE RÁPIDO DEBOUNCING" current = digitalRead(button); // le NOVAMENTE o estado do botao apos o "debounce" } return current; // retorna o valor atualizado do botao (button) } void loop() { currentButton = debounce(lastButton); // Lê o estado do botao após o debounce // aqui passamos pela FUNÇÃO "debounce" // ANTES de podermos OBTER o VALOR FINAL // do ATUAL ESTADO DO BOTÃO! (R.Costa.) if(lastButton == LOW && currentButton == HIGH) // se o botao foi PRESSIONADO { ledOn = !ledOn; // alternamos o valor do LED } lastButton = currentButton; // redefinimos o valor do botao digitalWrite(led, ledOn); // alternamos o estado do led } |
O resultado que devemos obter ao utilizar o código acima, é o de alterar o estado do LED toda vez que o nosso push-button/botão for pressionado.
💡 ❗ Se tentarmos realizar a mesma coisa, o mesmo experimento, SEM “fazer o debouncing do botão“, vamos nos deparar com resultados imprevisíveis, com o LED funcionando algumas vezes como o esperado e outras vezes não, dando a crer que temos um verdadeiro “mal-contato” no nosso circuito eletrônico, enquanto na verdade não é nada disso, mas apenas um fenômeno estranho chamado e conhecido por “switch-bouncing” estragando nosso protótipo e colocando nossos neurônios para raciocinar ainda mais! 🙄
O ESQUEMÁTICO DO CIRCUITO ELETRÔNICO – DEBOUNCING PUSH-BUTTON:
VIDEO COMPLETO MOSTRANDO TODO O ASSUNTO, CIRCUITO E “DEBOUNCING” NA PRÁTICA:
Gostou? Então Compartilha! 🙂
- Medindo e Monitorando a Temperatura com Arduino (Sensor LM35) - 5 de setembro de 2021
- Controle de Cargas através de Entrada Analógica com Arduino - 30 de agosto de 2021
- REVIEW E DICAS – ALICATE AMPERÍMETRO (UNI-T UT210E PRO) - 28 de agosto de 2021