# 用一个按钮切换9个LED的闪烁模式:来回闪,流水闪,眨眼闪,亮,关
# 可以进一步改成用中断模式+定时器驱动,减少CPU阻塞
import time
from machine import Pin
# 定义 LED 控制引脚
led_pins = [13, 12, 14, 27, 26, 25, 33, 32, 4]
# 初始化 LED 引脚配置对象列表
led_pin_list = [Pin(pin, Pin.OUT) for pin in led_pins]
# 定义按钮引脚
button_pin = Pin(15, Pin.IN, Pin.PULL_DOWN)
timer = 0
current_blink_led_index = 0
isForward = True
# 来回闪烁
def forward_backward_blink():
global current_blink_led_index, timer, isForward
if timer % 100 == 0:
if isForward:
current_blink_led_index += 1
if current_blink_led_index >= len(led_pin_list) - 1:
current_blink_led_index = len(led_pin_list) - 1
isForward = False
else:
current_blink_led_index -= 1
if current_blink_led_index <= 0:
current_blink_led_index = 0
isForward = True
for led_pin in led_pin_list:
led_pin.value(0)
led_pin_list[current_blink_led_index].value(1)
# 流水闪烁
def forward_blink():
global current_blink_led_index, timer
if timer % 100 == 0:
current_blink_led_index = (current_blink_led_index + 1) % len(led_pin_list)
for led_pin in led_pin_list:
led_pin.value(0)
led_pin_list[current_blink_led_index].value(1)
# 第一个灯闪3次蓄力再往前
first_blinked = 0
def first_double_blink():
global current_blink_led_index, timer, first_blinked
if timer % 100 == 0:
for led_pin in led_pin_list:
led_pin.value(0)
if current_blink_led_index == 0 and first_blinked < 3:
first_blinked +=1
else:
current_blink_led_index = (current_blink_led_index + 1) % len(led_pin_list)
first_blinked = 0
if first_blinked % 2 == 0:
led_pin_list[current_blink_led_index].value(1)
# 亮了不灭,直到下一轮
def more_and_more_blink():
global current_blink_led_index, timer
if timer % 100 == 0:
current_blink_led_index = (current_blink_led_index + 1) % len(led_pin_list)
for i in range(current_blink_led_index,len(led_pin_list)):
led_pin = led_pin_list[i]
led_pin.value(0)
led_pin_list[current_blink_led_index].value(1)
# 每过一轮,长亮一灯
more_blink_step = 0
def more_and_more_blink2():
global current_blink_led_index, timer, more_blink_step
if timer % 100 == 0:
current_blink_led_index = (current_blink_led_index + 1) % len(led_pin_list)
if current_blink_led_index == len(led_pin_list) - 1:
more_blink_step += 1
if more_blink_step >= len(led_pin_list):
more_blink_step = 0
for i in range(more_blink_step,len(led_pin_list)):
led_pin = led_pin_list[i]
led_pin.value(0)
led_pin_list[current_blink_led_index].value(1)
# 两边到中心对称
def twins_blink():
global current_blink_led_index, timer
if timer % 100 == 0:
current_blink_led_index = (current_blink_led_index + 1) % len(led_pin_list)
for led_pin in led_pin_list:
led_pin.value(0)
led_pin_list[current_blink_led_index].value(1)
led_pin_list[len(led_pin_list)-current_blink_led_index-1].value(1)
#一起闪
def all_led_blink():
global current_blink_led_index, timer
if timer % 100 == 0:
if timer % 200 == 0:
for led_pin in led_pin_list:
led_pin.value(0)
else:
for led_pin in led_pin_list:
led_pin.value(1)
# 一起亮
def all_led_on():
for led_pin in led_pin_list:
led_pin.value(1)
# 一起灭
def all_led_off():
for led_pin in led_pin_list:
led_pin.value(0)
# LED 闪烁函数列表
blink_funcs = [forward_backward_blink, twins_blink, forward_blink, first_double_blink, more_and_more_blink, more_and_more_blink2, all_led_blink, all_led_on, all_led_off]
current_blink_func_index = 0
# 切换 LED 闪烁函数
def switch_led_blink():
global current_blink_func_index, current_blink_led_index
current_blink_led_index = 0
current_blink_func_index = (current_blink_func_index + 1) % len(blink_funcs)
# 防按钮点击时抖动
button_first_check = button_second_check = False
# 主循环,用于执行 LED 闪烁函数
while True:
if button_pin.value():
if not button_second_check:
if button_first_check:
button_second_check = True
switch_led_blink()
else:
button_first_check = True
else:
button_first_check = button_second_check = False
time.sleep_ms(10)
timer += 10
if timer >= 60000:
timer = 0
blink_funcs[current_blink_func_index]()