# Trabalhando com Sinais Digitais no ESP32 com MicroPython
>[!TLDR] Resumo
>Para interagir com pinos digitais em um [[ESP32]] usando [[MicroPython]], utilize `machine.Pin(numero_do_pino, machine.Pin.IN)` para configurar como entrada e `machine.Pin(numero_do_pino, machine.Pin.OUT)` para configurar como saída. Para ler o estado de um pino de entrada, use `pin.value()`. Para definir o estado de um pino de saída, use `pin.value(1)` ou `pin.on()` para nível alto, e `pin.value(0)` ou `pin.off()` para nível baixo. Sempre consulte o diagrama de pinagem da sua placa [[ESP32]] específica.
## Informações Detalhadas
A manipulação de pinos digitais em um [[ESP32]] com [[MicroPython]] é um processo direto. Abaixo, detalhamos como ler e escrever valores digitais:
### 1. Importando o Módulo `machine`
O primeiro passo é importar o módulo `machine`, que fornece as classes necessárias para interagir com os periféricos de hardware, incluindo os pinos GPIO (General Purpose Input/Output).
```python
import machine
# ou, para importar apenas a classe Pin:
from machine import Pin
```
### 2. Definindo o Pino GPIO
Para usar um pino, você precisa instanciá-lo como um objeto `Pin`, especificando seu número e sua direção (entrada ou saída).
```python
# Para configurar o pino como entrada
pino = machine.Pin(numero_do_pino, machine.Pin.IN)
# Para configurar o pino como saída
pino = machine.Pin(numero_do_pino, machine.Pin.OUT)
```
Substitua `numero_do_pino` pelo número GPIO real que você deseja usar (por exemplo, 2, 4, 5, 12, etc.). É fundamental consultar o diagrama de pinagem da sua placa [[ESP32]] específica para identificar os números GPIO corretos, pois eles podem não corresponder diretamente aos rótulos impressos na placa.
* `machine.Pin.IN` configura o pino para receber sinais digitais.
* `machine.Pin.OUT` configura o pino para enviar sinais digitais.
### 3. Opcional: Configurando [[Resistores]] de Pull-up/Pull-down (para pinos de entrada)
Para garantir leituras estáveis em pinos de entrada, especialmente quando não há um sinal ativo sendo fornecido (estado "flutuante"), é recomendável usar [[Resistores]] de pull-up ou pull-down. O [[ESP32]] possui [[Resistores]] internos que podem ser ativados.
```python
# Entrada com resistor de pull-up interno (puxa o pino para nível alto quando não há sinal)
pino = machine.Pin(numero_do_pino, machine.Pin.IN, machine.Pin.PULL_UP)
# Entrada com resistor de pull-down interno (puxa o pino para nível baixo quando não há sinal)
pino = machine.Pin(numero_do_pino, machine.Pin.IN, machine.Pin.PULL_DOWN)
```
Um resistor de pull-up puxa o pino para um estado lógico alto (3.3V), enquanto um resistor de pull-down o puxa para um estado lógico baixo (0V). Isso evita leituras erráticas.
### 4. Lendo um Sinal Digital de Entrada
Para obter o estado atual de um pino configurado como entrada:
```python
valor = pino.value()
```
A variável `valor` conterá `1` se o pino estiver em nível lógico alto (HIGH) e `0` se estiver em nível lógico baixo (LOW).
### 5. Escrevendo um Sinal Digital de Saída
Para definir o estado de um pino configurado como saída:
```python
pino.value(1) # Define o pino para nível alto (3.3V)
pino.value(0) # Define o pino para nível baixo (0V)
# Alternativamente, usando os métodos on() e off():
pino.on() # Define o pino para nível alto
pino.off() # Define o pino para nível baixo
```
## Considerações Importantes
* **Pinagem da Placa:** SEMPRE consulte o diagrama de pinagem da sua placa [[ESP32]] específica. Os números GPIO podem variar entre diferentes modelos e fabricantes. Usar o pino errado pode levar a comportamentos inesperados ou até danos.
* **[[Resistores]] Internos de Pull-up/Pull-down:** O [[ESP32]] possui [[Resistores]] internos de pull-up em muitos de seus pinos. Se você configurar um pino como `machine.Pin.IN` sem especificar `PULL_UP` ou `PULL_DOWN`, o pull-up interno pode ser habilitado por padrão em alguns pinos. No entanto, é uma boa prática definir explicitamente o comportamento de pull-up/down para maior clareza e controle.
* **Debouncing (Eliminação de Ruído):** Botões e chaves mecânicas podem apresentar "ruído" (bounce), onde um único acionamento é interpretado como múltiplos acionamentos rápidos. Técnicas de debouncing (como atrasos curtos ou lógica de software) são essenciais para garantir leituras precisas de entradas físicas.
* **Limitações de Corrente:** Os pinos GPIO do [[ESP32]] têm limitações de corrente. Esteja ciente do consumo de corrente dos componentes conectados e use [[Resistores]] limitadores de corrente apropriados quando necessário (especialmente com LEDs) para proteger tanto o [[ESP32]] quanto o componente.