> [!TLDR] 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]], [[Diodo emissor de luz|LED]], resistor, botão e software como o [[Arduino IDE]]. Exemplos de código demonstram o controle do [[Diodo emissor de luz|LED]] com base nos pressionamentos de botão. O primeiro exemplo acende o [[Diodo emissor de luz|LED]] quando o botão é pressionado. O segundo exemplo alterna o estado do [[Diodo emissor de luz|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
- Hardware
- [[ESP32]] - [ESP32](app://obsidian.md/ESP32) é uma série de microcontroladores de baixo custo e baixo consumo de energia. É também um sistema em um chip com microcontrolador, Wi-Fi e Bluetooth integrados.
- [[Diodo emissor de luz]] - [[Diodo emissor de luz|LED]] comum para prototipagem.
- [[Resistores]] - Usados para limitar a corrente através do [[Diodo emissor de luz|LED]]
- [[Botões e interruptores]] - Usados para controlar quando o [[Diodo emissor de luz|LED]] está ligado ou desligado.
- Software
- [[Arduino IDE]] ou [[Wokwi]] para programar/simular o código a ser executado no [[ESP32]].
- Certifique-se de [[Instalando o driver da ESP32 no Windows|instalar o driver do ESP32]].
# Conexões de Hardware
* **[[Diodo emissor de luz|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 [[Diodo emissor de luz|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.
> [!INFO] 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`.
![[Using LEDs and Buttons on ESP32 - Hardware.png]]
# Exemplo de Código 1 - Controlando um [[Diodo emissor de luz|LED]] com um Botão
```cpp
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 [[Diodo emissor de luz|LED]].
* `digitalWrite(ledPin, LOW);`: Apaga o [[Diodo emissor de luz|LED]].
# Exemplo 2 - Alternando um [[Diodo emissor de luz|LED]] com um Botão
```cpp
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 [[Diodo emissor de luz|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.