我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:
# Set GPIO input
switchColorOne = pyb.Pin("P9", pyb.Pin.IN, pyb.Pin.PULL_UP)
switchColorTwo = pyb.Pin("P7", pyb.Pin.IN, pyb.Pin.PULL_UP)
#Set color pallete by switch
if switchColorOne.value() == 0:
sensor.set_pixformat(sensor.RGB565)
elif switchColorTwo.value() == 0:
sensor.set_pixformat(sensor.GRAYSCALE)
else:
sensor.set_color_palette(sensor.PALETTE_IRONBOW)
sensor.set_pixformat(sensor.RGB565)
我想从单个按钮获取输入,以便在切换期间循环显示三个选项,最好使用while 循环,这样它就可以连续发生。我不知道如何实现这一点,我是否需要去抖动器,我可以使用 for 循环来迭代不同的代码行吗?
你说的没错,你需要一个去抖动器来防止按钮的单次按下被注册为多次按下。你不需要 for 循环来循环浏览不同的选项。
以下是如何使用 while 循环和去抖动器来实现你想要的代码:
import pyb
import time
# 设置 GPIO 输入
switch_pin = pyb.Pin("P9", pyb.Pin.IN, pyb.Pin.PULL_UP)
# 初始化当前颜色选项
current_option = 0
# 定义可用的颜色选项
color_options = [
sensor.RGB565,
sensor.GRAYSCALE,
(sensor.PALETTE_IRONBOW, sensor.RGB565) # 对于 IRONBOW,需要同时设置调色板和像素格式
]
# 去抖动延时(以毫秒为单位)
debounce_delay = 200
# 初始化上次按钮状态和时间
last_button_state = switch_pin.value()
last_debounce_time = 0
while True:
# 读取按钮状态
button_state = switch_pin.value()
# 检查按钮状态是否已更改
if button_state != last_button_state:
# 更新上次按钮状态更改时间
last_debounce_time = time.ticks_ms()
# 检查自上次按钮状态更改后是否经过了足够的去抖动时间
if time.ticks_ms() - last_debounce_time > debounce_delay and button_state != last_button_state:
# 更新上次按钮状态
last_button_state = button_state
# 如果按钮被按下
if button_state == 0:
# 循环浏览颜色选项
current_option = (current_option + 1) % len(color_options)
# 设置选定的颜色选项
selected_option = color_options[current_option]
if isinstance(selected_option, tuple):
sensor.set_color_palette(*selected_option)
else:
sensor.set_pixformat(selected_option)
# 打印当前选定的颜色选项(可选)
print("Selected option:", current_option)
# 짧은 지연 시간 추가
time.sleep_ms(50)
代码说明:
-
导入必要的库:
pyb
用于硬件交互,time
用于时间管理和去抖动。 -
设置按钮引脚:
将
switch_pin
设置为输入,并启用上拉电阻。 -
初始化
current_option
: 创建一个变量来跟踪当前选定的颜色选项,从 0 开始。 -
定义
color_options
: 创建一个列表来存储可用的颜色选项。 对于sensor.PALETTE_IRONBOW
,使用元组同时存储调色板和像素格式。 -
设置
debounce_delay
: 以毫秒为单位定义去抖动延时。 - 初始化去抖动变量: 存储上次按钮状态和上次去抖动时间。
-
进入
while True
循环: 此循环连续运行以检查按钮按下并更新颜色选项。 - 读取按钮状态: 获取当前按钮状态。
- 检测按钮状态变化: 如果当前按钮状态与上次记录的状态不同,则记录当前时间为上次去抖动时间。
-
去抖动逻辑:
如果自上次记录的去抖动时间以来已经过了足够的时间(
debounce_delay
),并且当前按钮状态仍然与上次记录的状态不同,则认为这是一个有效的按钮按下。 -
更新上次按钮状态:
将
last_button_state
更新为当前按钮状态。 -
处理按钮按下:
如果按钮被按下 (
button_state == 0
),则增加current_option
并将其限制在可用选项的范围内 (% len(color_options)
。 -
设置颜色选项:
基于
current_option
的值,使用sensor.set_pixformat()
或sensor.set_color_palette()
设置相应的颜色选项。 - 打印当前选项: 可选地打印当前选定的颜色选项以进行调试。
-
添加短暂的延迟:
在循环的每次迭代中添加一个短暂的延迟 (
time.sleep_ms(50)
),以避免占用过多的 CPU 资源。
此代码将允许使用单个按钮在可用的颜色选项之间循环,并使用去抖动逻辑来确保仅注册一次每个按钮按下。
标签:python,micropython From: 67677530