Usando LEDs e Botões na ESP32

Usando LEDs e Botões no ESP32

Este tutorial explica como controlar LEDs e botões com um microcontrolador ESP32. Ele aborda as conexões de hardware, exigindo um ESP32, LED, resistor, botão e software como o Arduino IDE. Exemplos de código demonstram o controle do LED com base nos pressionamentos de botão. O primeiro exemplo acende o LED quando o botão é pressionado. O segundo exemplo alterna o estado do LED a cada pressionamento de botão e inclui debouncing para evitar leituras espúrias devido ao “bounce” do botão.

Introdução

Usar LEDs e botões com um ESP32 envolve o controle de pinos GPIO (General Purpose Input/Output). Aqui está um detalhamento de como fazer isso!

Requisitos

Conexões de Hardware

  • LED:
    • Anodo (perna mais longa): Conecte a um pino GPIO do ESP32 através de um resistor limitador de corrente (220-470 ohms é o típico). O resistor evita que uma corrente excessiva danifique o LED.
    • Catodo (perna mais curta): Conecte ao GND.
  • Botão:
    • Um pino do botão: Conecte a um pino GPIO do ESP32.
    • Outro pino do botão: Conecte ao GND.

Resistor de pull-up

Você também pode querer um resistor de pull-up (10k ohms) entre o pino GPIO e 3.3V para garantir uma leitura estável quando o botão não está pressionado. O ESP32 possui Resistores de pull-up internos que você pode habilitar via software, definindo o pino como INPUT_PULLUP.

Exemplo de Código 1 - Controlando um LED com um Botão

const int ledPin = 2;   // GPIO pin connected to the LED
const int buttonPin = 4; // GPIO pin connected to the button
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
}
 
void loop() {
  // Read the button state (LOW when pressed, HIGH when not pressed)
  int buttonState = digitalRead(buttonPin);
 
  // If the button is pressed, turn the LED on
  if (buttonState == LOW) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Explicação:

  • pinMode(ledPin, OUTPUT);: Configura o ledPin como uma saída.
  • pinMode(buttonPin, INPUT_PULLUP);: Configura o buttonPin como uma entrada e habilita o resistor de pull-up interno.
  • digitalRead(buttonPin);: Lê o valor digital (HIGH ou LOW) do buttonPin.
  • digitalWrite(ledPin, HIGH);: Acende o LED.
  • digitalWrite(ledPin, LOW);: Apaga o LED.

Exemplo 2 - Alternando um LED com um Botão

const int ledPin = 2;
const int buttonPin = 4;
 
bool ledState = false;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}
 
void loop() {
  int buttonState = digitalRead(buttonPin);
 
  // Check for button press and debounce (optional but recommended)
  static unsigned long lastDebounceTime = 0;
  unsigned long debounceDelay = 50; // Debounce time in milliseconds
 
  if (buttonState == LOW && millis() - lastDebounceTime > debounceDelay) {
    lastDebounceTime = millis();  // Reset the debounce timer
 
    ledState = !ledState; // Toggle the LED state
    digitalWrite(ledPin, ledState ? HIGH : LOW);
  }
}

Explicação de Alternância e Debouncing:

  • Alternância: A linha ledState = !ledState; inverte a variável ledState cada vez que o botão é pressionado, alternando efetivamente o LED entre ligado e desligado.
  • Debouncing: Botões podem “saltar” (flutuar rapidamente entre HIGH e LOW) quando pressionados. O código de debouncing ignora essas flutuações, garantindo que um único pressionamento limpo seja registrado. O exemplo acima usa uma técnica simples de debouncing.