RPi4B环境光控显示器亮度:实现条件变更时单次执行
解决环境光触发的显示器亮度重复执行问题
核心问题是没有记录上一次的亮度档位状态,导致每次循环都执行输出/调亮度操作。只需添加状态变量跟踪档位变化,仅当档位改变时才执行对应操作,同时优化环境光读取逻辑。
修改后的代码
#!/usr/local/bin/python import RPi.GPIO as GPIO import time import subprocess __author__ = 'Gus (Adapted from Adafruit)' __license__ = "GPL" __maintainer__ = "pimylifeup.com" GPIO.setmode(GPIO.BOARD) # 定义光敏电路连接的引脚 pin_to_circuit = 3 def rc_time(pin_to_circuit): count = 0 # 输出低电平放电 GPIO.setup(pin_to_circuit, GPIO.OUT) GPIO.output(pin_to_circuit, GPIO.LOW) time.sleep(0.2) # 切换为输入模式,等待充电到高电平 GPIO.setup(pin_to_circuit, GPIO.IN) while GPIO.input(pin_to_circuit) == GPIO.LOW: count += 1 return count # 执行ddcutil调节亮度的函数 def set_display_brightness(level): # 根据档位设置对应的亮度值(可自行调整数值) brightness_values = { "dark": 10, "medium": 50, "bright": 100 } try: subprocess.run(["ddcutil", "setvcp", "10", str(brightness_values[level])], check=True) except subprocess.CalledProcessError: print(f"调节亮度到{level}档失败") try: # 初始化上一次的亮度档位,初始值为None表示未设置过 last_level = None while True: # 只读取一次环境光值,避免重复GPIO操作 light_count = rc_time(pin_to_circuit) current_level = None # 判断当前环境光对应的档位 if light_count > 4000: current_level = "dark" print("环境过暗,切换到暗档亮度") elif 1000 < light_count <= 4000: current_level = "medium" print("环境亮度适中,切换到中档亮度") elif light_count <= 1000: current_level = "bright" print("环境明亮,切换到亮档亮度") # 只有当前档位和上一次不同时,才执行亮度调节 if current_level != last_level and current_level is not None: set_display_brightness(current_level) # 更新上一次的档位记录 last_level = current_level # 延迟1秒,降低CPU占用(可根据需求调整) time.sleep(1) except KeyboardInterrupt: pass finally: GPIO.cleanup()
关键修改点说明
状态变量
last_level:- 用来存储上一次的亮度档位,初始值设为
None表示首次运行。 - 每次循环判断当前档位是否与
last_level不同,只有变化时才执行调亮度操作。
- 用来存储上一次的亮度档位,初始值设为
单次读取环境光:
- 原代码每次判断都调用
rc_time,既浪费资源又可能因环境光瞬间波动导致判断矛盾。现在只读取一次light_count,基于该值完成档位判断。
- 原代码每次判断都调用
用
elif优化条件判断:- 原代码的三个
if是独立判断,改用elif确保同一时间只会匹配一个档位,逻辑更严谨。
- 原代码的三个
封装亮度调节函数:
- 把
ddcutil调用封装成set_display_brightness函数,方便后续调整亮度数值或扩展功能。 - 添加了异常捕获,避免调节失败导致脚本崩溃。
- 把
添加循环延迟:
- 循环末尾加入
time.sleep(1),避免脚本持续占用过高CPU资源,可根据实际监测需求调整延迟时长。
- 循环末尾加入
内容的提问来源于stack exchange,提问作者Some guy you don't know
相关产品推荐
相关产品推荐

