from machine import Pin, PWM
from utime import sleep
# =========================
# CONFIGURAÇÃO DO LED
# =========================
# Cria um LED no pino 17 com controle PWM (permite variar o brilho)
led = PWM(Pin(17))
# =========================
# CONFIGURAÇÃO DO BOTÃO
# =========================
# Botão no pino 16 com resistor pull-up interno
# Isso significa:
# - Solto → valor = 1
# - Pressionado → valor = 0
button = Pin(16, Pin.IN, Pin.PULL_UP)
# Define a frequência do PWM (1000 Hz = padrão bom para LED)
led.freq(1000)
# =========================
# VARIÁVEIS DE CONTROLE
# =========================
# Guarda o estado anterior do botão (começa em 1 = solto)
ultimo_estado = 1
# Brilho atual em porcentagem
porcentagem = 0
# Controla se o LED está "ligado" ou "desligado"
# Funciona como um interruptor (toggle)
ligado = False
# =========================
# FUNÇÃO DE CONVERSÃO
# =========================
def porcentagem_em_pwm(valor):
"""
Converte um valor de 0 a 100 (%) para o intervalo do PWM (0 a 65535)
Exemplo:
0% → 0
50% → ~32767
100% → 65535
"""
return int((valor * 65535) / 100)
# =========================
# LOOP PRINCIPAL
# =========================
while True:
# Lê o estado atual do botão
estado = button.value()
# =========================
# DETECÇÃO DE CLIQUE
# =========================
# Detecta quando o botão foi pressionado (transição de 1 → 0)
# Isso evita múltiplas ativações ao segurar o botão
if estado == 0 and ultimo_estado == 1:
# Inverte o estado (liga/desliga)
ligado = not ligado
# =========================
# SE LIGAR → FADE IN
# =========================
if ligado:
# Vai de 0% até 100%, aumentando de 5 em 5
for i in range(0, 101, 5):
porcentagem = i
# Atualiza o brilho do LED
led.duty_u16(porcentagem_em_pwm(porcentagem))
# Mostra no console
print(f"Brilho: {porcentagem}%")
# Pequena pausa para criar o efeito suave (fade)
sleep(0.1)
# =========================
# SE DESLIGAR → FADE OUT
# =========================
else:
# Vai de 100% até 0%, diminuindo de 5 em 5
for i in range(100, -1, -5):
porcentagem = i
# Atualiza o brilho do LED
led.duty_u16(porcentagem_em_pwm(porcentagem))
# Mostra no console
print(f"Brilho: {porcentagem}%")
# Pausa para efeito suave
sleep(0.1)
# Atualiza o estado anterior do botão
ultimo_estado = estado
# Pequeno delay geral do loop
# Evita que o programa rode rápido demais
sleep(0.05)