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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:00