from machine import Pin
import time
# ========== 引脚定义(按题目给的) ==========
led_pins = [41, 40, 39, 38, 37, 36]
leds = [Pin(p, Pin.OUT) for p in led_pins]
key_pin = 5
key = Pin(key_pin, Pin.IN, Pin.PULL_UP)
mode_index = 0
mode_count = 5
need_switch = False # 中断标志位
# 全部熄灭
def all_off():
for led in leds:
led.off()
# 模式1:正向流水 LED0 → LED5
def mode_forward(tick):
idx = tick % 6
all_off()
leds[idx].on()
# 模式2:往返流水 左→右,再右→左
def mode_back_forth(tick):
pos = tick % 10
if pos < 6:
all_off()
leds[pos].on()
else:
all_off()
leds[10 - pos].on()
# 模式3:双向收拢,两端向中间靠拢
def mode_collect(tick):
t = tick % 3
all_off()
leds[t].on()
leds[5 - t].on()
# 模式4:叠加点亮,逐个保持常亮,全亮后统一熄灭
def mode_stack(tick):
t = tick % 7
all_off()
for i in range(t):
leds[i].on()
# 模式5:中间向两侧扩散(进阶 diffuse)
def mode_diffuse(tick):
t = tick % 4
all_off()
leds[2].on()
leds[3].on()
if t >= 1:
leds[1].on()
leds[4].on()
if t >= 2:
leds[0].on()
leds[5].on()
mode_list = [mode_forward, mode_back_forth, mode_collect, mode_stack, mode_diffuse]
# 按键中断回调函数
def key_isr(p):
global need_switch
need_switch = True
# 绑定下降沿中断(按键按下触发)
key.irq(trigger=Pin.IRQ_FALLING, handler=key_isr)
tick = 0
last_time = time.ticks_ms()
INTERVAL = 250 # 灯光刷新间隔 250ms
while True:
# 检测中断标志,切换模式
if need_switch:
time.sleep_ms(20) # 消抖
if key.value() == 0:
all_off()
mode_index = (mode_index + 1) % mode_count
print("切换到模式:", mode_index + 1)
need_switch = False
now = time.ticks_ms()
if time.ticks_diff(now, last_time) >= INTERVAL:
last_time = now
mode_list[mode_index](tick)
tick += 1
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1