ESP8266 - Botão

Este tutorial ensina você a usar o ESP8266 com um botão. Em detalhes, vamos aprender:

O botão é conhecido por outros nomes, como botão de pressão, botão tátil ou chave momentânea. É um componente comum usado em muitos projetos com ESP8266 e é fácil de usar. No entanto, ele pode confundir iniciantes por causa de seus aspectos mecânicos e físicos e das formas como pode ser usado. Este tutorial facilita as coisas para quem está começando.

Sobre o Botão

Ao trabalhar com um botão, os iniciantes costumam encontrar dois problemas:

1. Problema de entrada flutuante:.

  • Sintoma: O valor lido no pino de entrada não corresponde ao estado de pressionamento do botão.
  • Causa: Um resistor de pull-up ou pull-down não está sendo usado com o pino de entrada.
  • Solução: Use um resistor de pull-up ou pull-down, como ensinado neste tutorial.

2. Fenômeno de chattering:.

  • Sintoma: Apesar de ser pressionado uma só vez, o botão faz o código do ESP8266 detectar vários pressionamentos.
  • Causa: O estado do botão (ou da chave) oscila rapidamente entre LOW e HIGH devido a questões mecânicas e físicas.
  • Solução: O tutorial ESP8266 - Botão - Debounce explica como usar o debounce para resolver esse problema.

Esse é um fator que só deve ser considerado em aplicações que exigem detecção precisa do pressionamento.

※ Nota:

Não confunda o botão com o seguinte:

A Pinagem do Botão

Existem vários tipos de botões de pressão, que podem ser divididos em dois grandes grupos:

  • Botão de pressão para montagem em PCB (adequado para montar em uma protoboard)
  • Botão de pressão para montagem em painel
Botão de pressão

Um botão para montagem em PCB normalmente tem quatro pinos.

Pinagem do botão

No entanto, esses pinos são conectados em pares internamente. Assim, só precisamos usar dois dos quatro pinos, que não estão conectados entre si por dentro.

Existem quatro maneiras de conectar ao botão, duas delas simétricas (como mostrado na imagem).

Como usar o botão

? Por que um botão tem quatro pinos se usamos só dois deles?

⇒ Para garantir que ele fique firmemente montado na PCB (placa de circuito impresso) e aguente a pressão.

Um botão para montagem em painel geralmente tem 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 inclui um resistor de pull-down embutido, que garante que a saída permaneça 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 3.3V.
  • OUT: Conecte este pino a uma entrada digital do seu ESP8266.

Com essa configuração, o módulo gera LOW quando o botão não está pressionado e gera 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.
  • No entanto, quando o botão é pressionado, o pino A é conectado ao pino B.
Como o botão funciona

ESP8266 - Botão

Um pino do botão é conectado ao VCC ou ao GND. O outro pino é conectado a um pino do ESP8266. Verificando o estado de um pino do ESP8266 configurado como entrada, podemos determinar se um botão foi pressionado ou não.

Estado do Botão e Estado de Pressionamento

A conexão entre o botão e o ESP8266, assim como a configuração do pino do ESP8266, determinam a relação entre o estado do botão e o estado de pressionamento.

Há duas maneiras de usar um botão com o ESP8266:

  1. Um pino do botão é conectado ao VCC, e o outro é conectado a um pino do ESP8266 com um resistor de pull-down
    • Quando o botão é pressionado, o estado do pino do ESP8266 será HIGH. Caso contrário, o estado do pino será LOW
    • Podemos usar um resistor interno ou externo. O resistor interno já está embutido no ESP8266 e pode ser configurado pelo código do ESP8266.
  • Um pino do botão é conectado ao GND, e o outro é conectado a um pino do ESP8266 com um resistor de pull-up
    • Quando o botão é pressionado, o estado do pino do ESP8266 será LOW. Caso contrário, o estado do pino será HIGH
    • Podemos usar um resistor interno ou externo. O resistor interno já está embutido no ESP8266 e pode ser configurado pelo código do ESP8266.

    ※ Nota:

    Se não seguirmos a melhor prática, o estado do pino de entrada ficará “flutuante” quando o botão NÃO estiver pressionado. Isso significa que o estado pode ser HIGH ou LOW (instável, não fixo), resultando em detecção errada.

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

    Para simplificar, este tutorial usa a abordagem mais básica: inicializar o pino do ESP8266 como entrada com pull-up interno, sem usar um resistor externo. Os iniciantes não precisam se preocupar em ligar o resistor de pull-up/pull-down. Tudo o que precisam fazer é escrever o código do ESP8266.

    Diagrama de Ligação

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

    This image is created using Fritzing. Click to enlarge image

    Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

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

    This image is created using Fritzing. Click to enlarge image

    Como Programar o Botão

    • Usando a função pinMode(), configure o pino do ESP8266 como entrada com pull-up interno. Por exemplo, o pino D7:
    pinMode(D7, INPUT_PULLUP);
    • Acesse o estado do pino do ESP8266 usando a função digitalRead().
    int button_state = digitalRead(BUTTON_PIN);

    ※ Nota:

    Existem dois casos de uso comuns:

    • O primeiro é executar uma ação se o estado de entrada for HIGH e fazer algo inverso se o estado de entrada for LOW.
    • O segundo é executar uma ação quando o estado de entrada muda de LOW para HIGH (ou de HIGH para LOW).

    Escolhemos um deles dependendo da aplicação. Por exemplo, se quisermos usar um botão para controlar um LED:

    • Se a intenção é que o LED fique ON quando o botão está pressionado e OFF quando o botão NÃO está pressionado, deve-se usar o primeiro caso de uso.
    • Se o objetivo é que o LED alterne entre ON e OFF a cada vez que o botão é pressionado, deve-se usar o segundo caso de uso.

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

    const int BUTTON_PIN = D7; // The ESP8266 pin D7 connected to button int prev_button_state = HIGH; // the previous state from the input pin int button_state; // the current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. 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: button_state = digitalRead(BUTTON_PIN); if(prev_button_state == LOW && button_state == HIGH) Serial.println("The state changed from LOW to HIGH"); // save the last state prev_button_state = button_state; }

    Código ESP8266

    Passos Rápidos

    Para começar com o ESP8266 na Arduino IDE, siga estes passos:

    • Veja o tutorial como configurar o ambiente para ESP8266 na Arduino IDE se esta for a sua primeira vez usando o ESP8266.
    • Ligue os componentes como mostrado no diagrama.
    • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
    • Abra a Arduino IDE no seu computador.
    • Escolha a placa ESP8266 correta, como (ex.: NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
    • Conecte o ESP8266 ao seu computador com um cabo USB.
    • Abra a Arduino IDE, selecione a placa e a porta corretas.
    • Copie o código abaixo e abra na Arduino IDE.
    #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int button_state = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(button_state); }
    • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para a placa ESP8266.
    Como fazer upload de código para o ESP8266 NodeMCU usando a Arduino IDE
    • Abra o Serial Monitor.
    • Pressione e solte o botão várias vezes.
    • Confira o resultado no Serial Monitor.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    1 1 1 0 0 0 0 0 0 1 1 1
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

    1 é HIGH,. 0 é LOW.

    Explicação do Código

    Confira a explicação linha por linha contida nos comentários do código-fonte!

    Modificando o Código ESP8266

    Vamos mudar o código para que ele detecte quando ocorre um evento de pressionar e soltar.

    Passos Rápidos

    • Ligue os componentes como mostrado no diagrama.
    • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
    • Abra a Arduino IDE no seu computador.
    • Escolha a placa ESP8266 correta, como (ex.: NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
    • Altere o código da seguinte forma:
    /* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-button */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_button_state = button_state; }
    • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
    Upload de código na Arduino IDE
    • Abra o Serial Monitor.
    • Pressione o botão e mantenha-o pressionado.
    • Solte o botão e observe o resultado no Serial Monitor.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    The button is pressed The button is released
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

    ※ Nota:

    Mesmo que você pressione e solte o botão apenas uma vez, a saída no Serial Monitor pode mostrar vários eventos de pressionado e solto. Esse é o comportamento esperado do botão. Isso é conhecido como "fenômeno de chattering". Para mais informações, consulte o tutorial ESP8266 - Debounce de Botão.

    ※ Nota:

    • Desenvolvemos uma biblioteca, chamada ezButton, para facilitar a vida de quem está começando, principalmente ao usar vários botões. Saiba mais sobre a biblioteca ezButton aqui.
    • Se você estiver usando o módulo de botão, configure o pino no modo de entrada usando pinMode(BUTTON_PIN, INPUT). Com essa configuração, o módulo gera LOW quando o botão não está pressionado e HIGH quando o botão está pressionado.

    Vídeo

    Desafie-se

    • Quando o botão for pressionado, acenda o LED.
    • Quando o botão não estiver pressionado, apague o LED.
    • A cada vez que o botão for pressionado, alterne o LED entre ON e OFF.

    Conhecimento Adicional

    1. Em quais momentos NÃO devemos usar um resistor de pull-down/pull-up em um pino de entrada? 2. Quando não devemos utilizar um resistor de pull-down/pull-up em um pino de entrada?
    • Se o sensor tem estados fechado ou aberto, é necessário um resistor de pull-up ou pull-down para fazer esses estados virarem LOW e HIGH. Exemplos desses sensores são botão de pressão, chave, chave de contato magnético (sensor de porta).
    • Por outro lado, se o sensor tem dois níveis de tensão definidos (LOW e HIGH), um resistor de pull-up ou pull-down não é necessário. Exemplos desses sensores são sensor de movimento e sensor de toque.

    Referências de Funções

    ※ 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!