> [!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.