树莓派资料
显示屏资料
系统下载
树莓派Pico
首页 动态 发帖 版块 我的
 退出
游客  
等级:
金币:
经验值:

控制板载ABCD按键,自定义功能实现开关控制效果

  9013 
 0
 1
RASPI   RASPI 

一:按键功能介绍

我们可以看到扩展板上分别有A,B,C,D四个按键,对应的引脚序号为(A键-GP22、B-GP21、C-GP20、D-GP19)

我们以读取A按键(GP22)输入为例,只需要在编程代码中,将引脚GP22设为输入,当按下时自然输入信号,此时代表按键功能成功!

Image

二:Python代码

在下面这段代码中,我们设定了A按键的引脚序号GP22为输入模式,并且上拉内部电阻使其默认是高电平。当按键按下时会输入低电平信号给GP22引脚,在进行打印并显示为:“按键成功”


from machine import Pin
import time

# 初始化GP22为输入模式,并启用内部上拉电阻
# 这样未按下时为高电平(1),按下时为低电平(0)
button_pin = Pin(22, Pin.IN, Pin.PULL_UP)

# 用于记录按键状态,避免重复触发
last_state = 1
debounce_time = 0.05  # 50ms防抖时间

print("等待按键触发...")

while True:
    # 读取当前引脚状态
    current_state = button_pin.value()
    
    # 检测到从高电平变为低电平(按键按下)
    if current_state == 0 and last_state == 1:
        print("按键成功")
        # 短暂延时防抖
        time.sleep(debounce_time)
    
    # 更新上一次状态
    last_state = current_state
    
    # 短暂延时,降低CPU占用
    time.sleep(0.01)
    

代码说明:

引脚初始化:

我们将 GP22 配置为输入模式 Pin.IN

使用 Pin.PULL_UP 启用内部上拉电阻,这样在没有外部信号时,引脚会保持高电平

防抖处理:

加入了 50ms 的防抖时间 debounce_time,避免机械按键的抖动导致误触发

通过比较当前状态和上一次状态,只在状态变化时响应

检测逻辑:

当引脚从高电平 (1) 变为低电平 (0) 时,判定为按键按下

此时在终端打印 "按键成功" 的消息

低功耗考虑:

循环中加入了 10ms 的短暂延时,既保证了响应速度,又不会过度占用 CPU

你可以通过 Thonny IDE 运行这个程序,并在 Shell 窗口中看到 "按键成功" 的提示信息。如果需要,还可以在此基础上添加 LED 指示功能,让按键成功时 LED 点亮。

三:代码进阶升级增加功能

以下代码在上面的基础上新增了功能,当按A键时,板载的RGB灯亮红色,按B键亮绿色,按C键亮蓝灯,按D键是彩色自动变换



代码均有中文注释,可自行学习:


from machine import Pin
import neopixel
import time

# 配置WS2812 LED
NUM_LEDS = 1
PIN_NUM = 23  # LED数据引脚

# 初始化neopixel
np = neopixel.NeoPixel(Pin(PIN_NUM), NUM_LEDS)

# 增加按键功能(默认上拉输入模式)
btn_red = Pin(22, Pin.IN, Pin.PULL_UP)      # GP22: 红色
btn_green = Pin(21, Pin.IN, Pin.PULL_UP)    # GP21: 绿色
btn_blue = Pin(20, Pin.IN, Pin.PULL_UP)     # GP20: 蓝色
btn_rainbow = Pin(19, Pin.IN, Pin.PULL_UP)  # GP19: 彩虹渐变闪烁

# 定义7种颜色
COLORS = [
    (255, 0, 0),    # 红色
    (0, 255, 0),    # 绿色
    (0, 0, 255),    # 蓝色
    (255, 255, 0),  # 黄色
    (255, 0, 255),  # 深红
    (0, 255, 255),  # 青色
    (255, 255, 255) # 白色
]

# 颜色索引
current_color_idx = 0
# 当前模式:0-固定颜色,1-彩虹渐变
current_mode = 0

# 设置LED颜色
def set_color(r, g, b):
    np[0] = (r, g, b)
    np.write()

# 彩虹渐变效果
def rainbow_effect():
    for i in range(len(COLORS)):
        # 检查是否有其他按键按下,退出彩虹模式
        if not btn_red.value() or not btn_green.value() or not btn_blue.value():
            global current_mode
            current_mode = 0
            return
        
        set_color(*COLORS[i])
        time.sleep(0.5)  # 每种颜色停留0.5秒
        
        # 闪烁效果
        set_color(0, 0, 0)  # 关闭
        time.sleep(0.1)
        set_color(*COLORS[i])
        time.sleep(0.5)

# 初始设置为白色
set_color(255, 255, 255)

# 主循环
while True:
    # 检测按键(低电平表示按下,因为使用了上拉电阻)
    if not btn_red.value():
        current_mode = 0
        set_color(255, 0, 0)
        time.sleep(0.2)  # 简单消抖
    
    elif not btn_green.value():
        current_mode = 0
        set_color(0, 255, 0)
        time.sleep(0.2)
    
    elif not btn_blue.value():
        current_mode = 0
        set_color(0, 0, 255)
        time.sleep(0.2)
    
    elif not btn_rainbow.value():
        current_mode = 1
        time.sleep(0.2)
    
    # 如果处于彩虹模式,执行渐变效果
    if current_mode == 1:
        rainbow_effect()
    
    time.sleep(0.05)  # 短暂延迟,降低CPU占用
    

四:总结

通过以上的两个Python代码,我们学习了如何定义按键功能,增加控制效果。在第二个代码更是加入了按键来实现自定义的控制各种颜色。








技术支持(对本页存在疑难问题可联系我们工程师)

联系人:张工
电话:0755-32914578
QQ:2251000002
微信:扫下方二维码添加,请备注来意

提供:人工智能,IOT物联网,工控数显,嵌入式软硬件开发,科创教育,产品定制,生产,方案解决...



标签:
作者签名: www.raspi.cc   楼主  2025-08-25 22:17:09
回复列表
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权
您的IP: 18.97.9.171 , 2025-11-12 20:14:55
Powered by RASPI _VERSION
© 2017-2025 树莓派极客版权