树莓派LED达到最大或最小亮度时停止工作问题求助
嘿,我来帮你搞定这个树莓派PWM调LED亮度的问题!
你遇到的核心问题其实很典型:没处理PWM占空比的0-100边界限制。当亮度调到100或者0之后,你的代码还在尝试继续增减数值,但RPi.GPIO的ChangeDutyCycle()只认0到100之间的数,超出范围的操作直接无效,自然就停住不动了。
先结合你的需求(首次长按加亮度,再次按减亮度),给你补全并修复代码:
import RPi.GPIO as GPIO import time def main(): sw_pin = 17 led_pin = 2 current_brightness = 10 # 初始亮度设成你代码里的10 is_brightening = True # 标记当前是加亮还是减暗 long_press_sec = 0.5 # 长按判定:按住超过0.5秒才算有效操作 GPIO.setmode(GPIO.BCM) GPIO.setup(sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(led_pin, GPIO.OUT) pwm_red = GPIO.PWM(led_pin, 500) pwm_red.start(current_brightness) try: while True: # 检测开关被按下(因为是上拉输入,按下时是LOW) if GPIO.input(sw_pin) == GPIO.LOW: press_start = time.time() # 按住期间持续检测 while GPIO.input(sw_pin) == GPIO.LOW: time_pressed = time.time() - press_start # 达到长按阈值后开始调亮度 if time_pressed >= long_press_sec: if is_brightening: # 加亮时最多到100,别超 current_brightness = min(current_brightness + 1, 100) else: # 减暗时最少到0,别低 current_brightness = max(current_brightness - 1, 0) pwm_red.ChangeDutyCycle(current_brightness) time.sleep(0.05) # 控制调亮度的速度,别闪得太快 # 松开开关后,切换增减方向 is_brightening = not is_brightening time.sleep(0.01) # 给CPU喘口气,别占满资源 except KeyboardInterrupt: print("程序被终止啦") finally: # 不管怎么退出,都要清理GPIO和停止PWM pwm_red.stop() GPIO.cleanup() if __name__ == "__main__": main()
关键修复点
- 边界锁死:用
min()和max()把亮度死死卡在0-100之间,再也不会出现无效的PWM值 - 长按逻辑明确:按住超过0.5秒才触发亮度调整,松开就切换增减方向,完全符合你说的“首次长按加,再次按减”的需求
- 资源兜底:加了
try-except-finally,就算你按Ctrl+C终止程序,也不会把GPIO引脚搞坏
如果你的需求是“长按一次跳一段亮度”
要是你不想按住的时候持续调,而是长按一次就加/减固定亮度(比如每次加10),把长按那段代码改成这样就行:
# 替换掉长按循环里的内容 if time_pressed >= long_press_sec: if is_brightening: current_brightness = min(current_brightness + 10, 100) else: current_brightness = max(current_brightness - 10, 0) pwm_red.ChangeDutyCycle(current_brightness) break # 只调一次,松开再按切换方向
这样改完之后,不管亮度到顶还是到底,后续操作都能正常工作啦!
内容的提问来源于stack exchange,提问作者Vitaliy Garasymovych
相关产品推荐
相关产品推荐

