Arduino - Botão

O botão é um componente básico e muito usado em vários projetos com Arduino. Ele não é tão simples quanto parece (por causa de suas características mecânicas e físicas). Iniciantes podem ter muitos problemas com ele. Este tutorial deixa tudo mais fácil para os iniciantes. Vamos começar!

※ Nota:

Antes de falar sobre o botão, gostaríamos de avisar que há dois erros comuns que os iniciantes costumam cometer:

  1. O problema da entrada flutuante:
    • Sintoma: Ao conectar um botão a um pino de entrada do Arduino, o estado do pino de entrada fica aleatório e não corresponde ao estado de pressionamento do botão.
    • Causa: O pino do botão NÃO usa um resistor de pull-down nem um resistor de pull-up.
    • Solução: ⇒ Use um resistor de pull-down ou de pull-up no pino de entrada. Os detalhes serão explicados mais adiante neste tutorial.
  • O fenômeno de trepidação (chattering)
    • Sintoma: O código no Arduino lê o estado do botão e identifica o evento de pressionamento detectando a mudança de estado (HIGH para LOW, ou LOW para HIGH). Quando o botão é pressionado de fato apenas uma vez, o código do Arduino detecta vários pressionamentos em vez de um só.
    • Causa: Devido às características mecânicas e físicas, quando você pressiona o botão uma única vez, o estado do pino de entrada alterna rapidamente entre LOW e HIGH várias vezes, em vez de uma só
    • Solução: ⇒ Debounce. Os detalhes serão explicados no tutorial Arduino - Botão - Debounce.

    O fenômeno de trepidação causa mau funcionamento apenas em alguns tipos de aplicação que precisam detectar exatamente o número de pressionamentos. Em outros tipos de aplicação, ele é inofensivo.

    Sobre o Botão

    O botão de pressão, também chamado de pushbutton, botão tátil ou chave momentânea, é um tipo de chave que fecha quando o botão é pressionado e mantido, e abre quando é solto. Existem vários tipos de botões de pressão, divididos de forma geral em dois grupos:

    • Botões de pressão para montagem em PCB (que podem ser montados na protoboard)
    • Botões de pressão para montagem em painel
    Botão de pressão para Arduino

    Pinagem

    Os botões para montagem em PCB geralmente têm quatro pinos.

    Pinagem do botão

    No entanto, esses pinos são conectados internamente em pares. Por isso, precisamos usar apenas dois dos quatro pinos, que NÃO estejam conectados internamente.

    Há quatro formas (na verdade duas, por causa da simetria) de conectar o botão (veja a imagem)

    Como usar o botão
    Se podemos usar apenas dois pinos do botão, por que ele tem quatro pinos?

    ⇒ Para que ele fique firme na PCB (placa) e resista à força do pressionamento.

    Os botões para montagem em painel geralmente têm dois pinos.

    Pinagem do botão de pressão de dois pinos
    image source: diyables.io

    O módulo de botão de pressão tem um resistor de pull-down embutido, que garante que a saída fique em LOW quando o botão não está pressionado. Ele tem três pinos:

    • GND: Conecte este pino ao terra.
    • VCC: Conecte este pino a uma fonte de alimentação de 5V ou 3.3V.
    • OUT: Conecte este pino a uma entrada digital do seu Arduino.

    Com essa configuração, o módulo envia LOW quando o botão não está pressionado e envia HIGH quando o botão está pressionado.

    Como Funciona

    • Quando o botão NÃO está pressionado, o pino A NÃO está conectado ao pino B
    • Quando o botão está pressionado, o pino A está conectado ao pino B
    Como o botão funciona

    Arduino - Botão

    Um pino do botão é conectado ao VCC ou ao GND. O outro pino é conectado a um pino do Arduino.

    Lendo o estado do pino do Arduino (configurado como pino de entrada), podemos detectar se o botão está pressionado ou NÃO.

    Estado do Botão e Estado de Pressionamento

    A relação entre o estado do botão e o estado de pressionamento depende de como conectamos o botão ao Arduino e da configuração do pino do Arduino.

    Há duas formas de usar um botão com o Arduino:

    1. Um pino do botão é conectado ao VCC e o outro é conectado a um pino do Arduino com um resistor de pull-down
      • Se o botão estiver pressionado, o estado do pino do Arduino é HIGH. Caso contrário, o estado do pino do Arduino é LOW
      • Nós PRECISAMOS usar um resistor externo.
  • Um pino do botão é conectado ao GND e o outro é conectado a um pino do Arduino com um resistor de pull-up
    • Se o botão estiver pressionado, o estado do pino do Arduino é LOW. Caso contrário, o estado do pino do Arduino é HIGH
    • Podemos usar um resistor interno ou externo. O resistor interno já vem dentro do Arduino, basta configurá-lo pelo código do Arduino.

    ※ Nota:

    Se NÃO usarmos nem resistor de pull-down nem de pull-up, o estado do pino de entrada fica “flutuante” quando o botão NÃO está pressionado. Isso significa que o estado pode ser HIGH ou LOW (instável, não fixo), resultando em uma detecção errada.

    • A pior prática: inicializar o pino do Arduino como entrada (usando pinMode(BUTTON_PIN, INPUT)) e NÃO usar nenhum resistor externo de pull-down/pull-up.
    • A melhor prática: inicializar o pino do Arduino como entrada com pull-up interno (usando pinMode(BUTTON_PIN, INPUT_PULLUP)). Assim, NÃO é preciso usar nenhum resistor externo de pull-down/pull-up.

    Para facilitar para os iniciantes, este tutorial usa o método mais simples: inicializar o pino do Arduino como entrada com pull-up interno, sem usar resistor externo. Os iniciantes NÃO precisam se preocupar com a ligação do resistor de pull-up/pull-down. Basta usar o código do Arduino.

    Diagrama de Ligação

    • Diagrama de ligação entre o Arduino e o botão para montagem em PCB
    Diagrama de ligação do botão com Arduino

    This image is created using Fritzing. Click to enlarge image

    • Diagrama de ligação entre o Arduino e o botão para montagem em painel
    Diagrama de ligação do botão de pressão de dois pinos com Arduino

    This image is created using Fritzing. Click to enlarge image

    Diagrama de ligação do botão de dois pinos com Arduino

    Como Programar o Botão

    • Inicialize o pino do Arduino como entrada com pull-up interno usando a função pinMode(). Por exemplo, o pino 7:
    pinMode(7, INPUT_PULLUP);
    • Leia o estado do pino do Arduino usando a função digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Nota:

    Há dois casos de uso muito comuns:

    • O primeiro: se o estado da entrada for HIGH, faça algo. Se o estado da entrada for LOW, faça o contrário.
    • O segundo: se o estado da entrada mudar de LOW para HIGH (ou de HIGH para LOW), faça algo.

    Dependendo da aplicação, escolhemos um deles. Por exemplo, ao usar um botão para controlar um LED:

    • Se quisermos que o LED fique LIGADO quando o botão estiver pressionado e DESLIGADO quando o botão NÃO estiver pressionado, DEVEMOS usar o primeiro caso de uso.
    • Se quisermos que o LED alterne entre LIGADO e DESLIGADO cada vez que pressionamos o botão, DEVEMOS usar o segundo caso de uso.

    Como detectar a mudança de estado de LOW para HIGH

    // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = HIGH; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("The state changed from LOW to HIGH"); // save the last state lastState = currentState; }

    Código Arduino

    Passos Rápidos

    • Conecte o Arduino ao PC com o cabo USB
    • Abra o Arduino IDE e selecione a placa e a porta corretas
    • Copie o código abaixo e abra-o no Arduino IDE
    // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
    Arduino IDE - Como carregar o código
    • Abra o Serial Monitor
    • Pressione e solte o botão várias vezes
    • Veja o resultado no Serial Monitor:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    1 1 1 0 0 0 0 0 0 1 1 1
    Ln 11, Col 1
    Arduino Uno on COM15
    2

    1 é HIGH, 0 é LOW.

    Explicação do Código

    Leia a explicação linha por linha nas linhas de comentário do código!

    Modificando o Código Arduino

    Vamos modificar o código para detectar os eventos de pressionar e soltar

    Passos Rápidos

    • Modifique o código como abaixo
    /* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-button */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
    Arduino IDE - Carregar o código
    • Abra o Serial Monitor
    • Pressione o botão e depois solte
    • Veja o resultado no Serial Monitor
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    The button is pressed The button is released
    Ln 11, Col 1
    Arduino Uno on COM15
    2

    ※ Nota:

    • Mesmo que você tenha pressionado e soltado o botão apenas uma vez, a saída no Serial Monitor pode mostrar vários eventos de pressionar e soltar. Esse é o comportamento normal do botão. Esse comportamento é chamado de “fenômeno de trepidação”. Você pode saber mais no tutorial Arduino - Debounce de Botão.
    • Para facilitar muito para os iniciantes, principalmente ao usar vários botões, criamos uma biblioteca chamada ezButton. Você pode conhecer a biblioteca ezButton aqui.
    • Use pinMode(BUTTON_PIN, INPUT) para o módulo de botão. Ele envia LOW quando não está pressionado e HIGH quando está pressionado.

    Vídeo

    Desafie-se

    • Acenda o LED quando o botão estiver pressionado e apague o LED quando o botão NÃO estiver pressionado.
    • Alterne o LED entre LIGADO e DESLIGADO cada vez que o botão for pressionado.

    Conhecimento Adicional

    Quando devemos e quando NÃO devemos usar um resistor de pull-down/pull-up em um pino de entrada?
    • Se o sensor tem os estados fechado (conectado ao VCC ou ao GND) ou aberto (NÃO conectado a nada), você precisa de um resistor de pull-up ou pull-down para transformar esses estados em dois estados: LOW e HIGH. Por exemplo: botão de pressão, chave, chave de contato magnético (sensor de porta)...
    • Se o sensor tem dois níveis de tensão definidos (LOW e HIGH), você NÃO precisa de um resistor de pull-up ou pull-down. Por exemplo: sensor de movimento, sensor de toque ...

    ※ NOSSAS MENSAGENS

    • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!