首页 > 编程问答 >如何循环使用按钮输入,在python中的不同选项之间循环?

如何循环使用按钮输入,在python中的不同选项之间循环?

时间:2024-07-28 14:37:24浏览次数:13  
标签:python micropython

我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:

# 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)

代码说明:

  1. 导入必要的库: pyb 用于硬件交互, time 用于时间管理和去抖动。
  2. 设置按钮引脚: switch_pin 设置为输入,并启用上拉电阻。
  3. 初始化 current_option 创建一个变量来跟踪当前选定的颜色选项,从 0 开始。
  4. 定义 color_options 创建一个列表来存储可用的颜色选项。 对于 sensor.PALETTE_IRONBOW ,使用元组同时存储调色板和像素格式。
  5. 设置 debounce_delay 以毫秒为单位定义去抖动延时。
  6. 初始化去抖动变量: 存储上次按钮状态和上次去抖动时间。
  7. 进入 while True 循环: 此循环连续运行以检查按钮按下并更新颜色选项。
  8. 读取按钮状态: 获取当前按钮状态。
  9. 检测按钮状态变化: 如果当前按钮状态与上次记录的状态不同,则记录当前时间为上次去抖动时间。
  10. 去抖动逻辑: 如果自上次记录的去抖动时间以来已经过了足够的时间( debounce_delay ),并且当前按钮状态仍然与上次记录的状态不同,则认为这是一个有效的按钮按下。
  11. 更新上次按钮状态: last_button_state 更新为当前按钮状态。
  12. 处理按钮按下: 如果按钮被按下 ( button_state == 0 ),则增加 current_option 并将其限制在可用选项的范围内 ( % len(color_options)
  13. 设置颜色选项: 基于 current_option 的值,使用 sensor.set_pixformat() sensor.set_color_palette() 设置相应的颜色选项。
  14. 打印当前选项: 可选地打印当前选定的颜色选项以进行调试。
  15. 添加短暂的延迟: 在循环的每次迭代中添加一个短暂的延迟 ( time.sleep_ms(50) ),以避免占用过多的 CPU 资源。

此代码将允许使用单个按钮在可用的颜色选项之间循环,并使用去抖动逻辑来确保仅注册一次每个按钮按下。

标签:python,micropython
From: 67677530

相关文章

  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......
  • 我无法安装 pygame 模块,所以我尝试观看视频,它告诉我这样做。在那个视频中他得到了 pyt
    c:\User\admin>piplistSyntaxError:unexpectedcharacterafterlinecontinuationcharacter我试图获取python模块列表,但出现语法错误出现SyntaxError:unexpectedcharacterafterlinecontinuationcharacter错误是因为你的用户名中包含一个特殊字符......
  • python第五节--conda命令
    这里写自定义目录标题基本命令环境管理包管理环境文件环境变量Conda配置高级操作常见问题基本命令检查Conda版本:conda--version更新Conda:condaupdateconda环境管理创建新环境:condacreate--namemyenv创建包含特定Python版本的新环境:conda......
  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......