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

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()

关键修改点说明

  1. 状态变量last_level:

    • 用来存储上一次的亮度档位,初始值设为None表示首次运行。
    • 每次循环判断当前档位是否与last_level不同,只有变化时才执行调亮度操作。
  2. 单次读取环境光:

    • 原代码每次判断都调用rc_time,既浪费资源又可能因环境光瞬间波动导致判断矛盾。现在只读取一次light_count,基于该值完成档位判断。
  3. 用elif优化条件判断:

    • 原代码的三个if是独立判断,改用elif确保同一时间只会匹配一个档位,逻辑更严谨。
  4. 封装亮度调节函数:

    • 把ddcutil调用封装成set_display_brightness函数,方便后续调整亮度数值或扩展功能。
    • 添加了异常捕获,避免调节失败导致脚本崩溃。
  5. 添加循环延迟:

    • 循环末尾加入time.sleep(1),避免脚本持续占用过高CPU资源,可根据实际监测需求调整延迟时长。

内容的提问来源于stack exchange,提问作者Some guy you don't know

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:32:21