将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资源,避免引脚状态异常。
常见问题排查
- 按键无响应:检查接线是否正确,确保按键一端接GND、另一端接引脚(代码使用上拉电阻)。
- LED不亮:确认LED串接了限流电阻,阳极接引脚、阴极接GND,PWM对象已正确初始化并启动。
- 模式切换混乱:可调整消抖延时时长(
time.sleep(0.01)),或检查按键是否存在硬件接触不良。
内容的提问来源于stack exchange,提问作者Crosboi
相关产品推荐
相关产品推荐

