You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Arduino按键切换状态代码适配为树莓派Python代码

树莓派Python版按键切换LED状态实现

完整适配代码

import RPi.GPIO as GPIO
import time

# 定义引脚(对应树莓派BOARD引脚编号,可根据实际接线调整)
BLUE_LED = 3
RED_LED = 6
BUTTON_PIN = 12

mode = 0
button_state = 0

def setup():
    GPIO.setmode(GPIO.BOARD)
    # 初始化LED引脚为输出
    GPIO.setup(BLUE_LED, GPIO.OUT)
    GPIO.setup(RED_LED, GPIO.OUT)
    # 初始化按键引脚为输入,带上拉电阻(避免浮空误触发)
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    # 创建PWM对象,频率设为1000Hz(贴近Arduino analogWrite默认频率)
    global blue_pwm, red_pwm
    blue_pwm = GPIO.PWM(BLUE_LED, 1000)
    red_pwm = GPIO.PWM(RED_LED, 1000)
    blue_pwm.start(0)
    red_pwm.start(0)
    
    # 读取初始按键状态
    global button_state
    button_state = GPIO.input(BUTTON_PIN)

def state0():
    blue_pwm.ChangeDutyCycle(0)
    red_pwm.ChangeDutyCycle(0)
    print("Off")

def state1():
    blue_pwm.ChangeDutyCycle(100)  # 树莓派PWM占空比范围0-100,对应Arduino的0-255
    red_pwm.ChangeDutyCycle(0)
    print("Blue")

def state2():
    blue_pwm.ChangeDutyCycle(0)
    red_pwm.ChangeDutyCycle(100)
    print("Red")

def check_button():
    global mode, button_state
    # 消抖逻辑:两次读取间隔10ms,状态一致才判定有效
    check1 = GPIO.input(BUTTON_PIN)
    time.sleep(0.01)
    check2 = GPIO.input(BUTTON_PIN)
    
    if check1 == check2:
        if check1 != button_state:
            mode += 1
            button_state = check1  # 更新按键状态,防止重复触发

def loop():
    while True:
        check_button()
        # 根据mode取模结果切换状态
        current_mode = mode % 3
        if current_mode == 0:
            state0()
        elif current_mode == 1:
            state1()
        elif current_mode == 2:
            state2()
        time.sleep(0.1)  # 降低CPU占用率

if __name__ == "__main__":
    try:
        setup()
        loop()
    except KeyboardInterrupt:
        # 程序终止时清理GPIO资源
        blue_pwm.stop()
        red_pwm.stop()
        GPIO.cleanup()
        print("程序终止")

关键适配点说明

  • 引脚模式:用GPIO.BOARD对应树莓派物理引脚编号,和Arduino引脚编号逻辑一致,方便对照接线;若使用BCM模式需对应树莓派GPIO编号。
  • PWM实现:树莓派没有直接的analogWrite函数,需通过PWM对象的ChangeDutyCycle()控制亮度,占空比范围是0-100(Arduino为0-255)。
  • 按键消抖:沿用原Arduino的两次读取+延时逻辑,同时更新按键状态变量,避免按住按键时重复触发模式切换。
  • 资源清理:捕获Ctrl+C中断信号,确保程序退出时释放PWM和GPIO资源,避免引脚状态异常。

常见问题排查

  1. 按键无响应:检查接线是否正确,确保按键一端接GND、另一端接引脚(代码使用上拉电阻)。
  2. LED不亮:确认LED串接了限流电阻,阳极接引脚、阴极接GND,PWM对象已正确初始化并启动。
  3. 模式切换混乱:可调整消抖延时时长(time.sleep(0.01)),或检查按键是否存在硬件接触不良。

内容的提问来源于stack exchange,提问作者Crosboi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:46:33