from machine import Pin, PWM, ADC
from utime import ticks_ms, ticks_diff, sleep
# LEDs RGB
ledRed = PWM(Pin(19))
ledBlue = PWM(Pin(17))
ledGreen = PWM(Pin(18))
# Botões (pull-up)
button1 = Pin(16, Pin.IN, Pin.PULL_UP)
button2 = Pin(20, Pin.IN, Pin.PULL_UP)
# Potenciômetro
potenciometro = ADC(28)
# Frequência PWM
for led in [ledRed, ledBlue, ledGreen]:
led.freq(1000)
leds = [ledRed, ledGreen, ledBlue]
indice = 0
modo = 0
ultimo_estado1 = 1
ultimo_estado2 = 1
# Controle de tempo (ESSENCIAL)
tempo_pisca = ticks_ms()
tempo_respira = ticks_ms()
estado_led = False
# Controle da respiração
brilho = 0
direcao = 1
while True:
agora = ticks_ms() # tempo atual (não trava nada)
# Leitura constante dos botões (RODA SEMPRE)
estado1 = button1.value()
estado2 = button2.value()
valor = potenciometro.read_u16()
# =========================
# BOTÃO 1 - TROCA COR
# =========================
if estado1 == 0 and ultimo_estado1 == 1:
indice = (indice + 1) % 3
ultimo_estado1 = estado1
# =========================
# BOTÃO 2 - TROCA MODO
# =========================
if estado2 == 0 and ultimo_estado2 == 1:
modo = (modo + 1) % 3
ultimo_estado2 = estado2
# Apaga LEDs
for led in leds:
led.duty_u16(0)
# =========================
# MODO 0 - FIXO
# =========================
if modo == 0:
leds[indice].duty_u16(valor)
# =========================
# MODO 1 - PISCANDO
# =========================
elif modo == 1:
# 👉 NÃO trava
# Apenas verifica se passou tempo
if ticks_diff(agora, tempo_pisca) > 500:
estado_led = not estado_led
tempo_pisca = agora
if estado_led:
leds[indice].duty_u16(65535)
# =========================
# MODO 2 - RESPIRAÇÃO
# =========================
else:
# Atualiza aos poucos (sem loop travado)
if ticks_diff(agora, tempo_respira) > 30:
brilho += direcao * 2000
# Inverte direção
if brilho >= 65535:
brilho = 65535
direcao = -1
elif brilho <= 0:
brilho = 0
direcao = 1
tempo_respira = agora
leds[indice].duty_u16(brilho)
# Pequena pausa para estabilidade no Wokwi
sleep(0.005)Loading
pi-pico-w
pi-pico-w