前言

前阵子朋友问我。

说外接显示器亮度没法随光线变化。

能不能想个办法搞定它?

我想了想。

在淘宝花了 12 块钱,买了个光线传感器:

然后接上树莓派,鼓捣了一下午。

终于实现了。

视频:https://v.qq.com/x/page/c0902fu8g7m.html

原理

其实这个原理不麻烦。

既然没有光线传感器,就外接一个。

获取到了光线变化。

想办法用树莓派来控制显示器亮度就行了。

画成图就是这样:

其中最麻烦的步骤其实是控制显示器亮度这里。

后来发现显示器们有个 DDC/CI 协议,全称「Display Data Channel Command Interface」。

简单说,就是无论你是什么显示器,只要支持这个协议。

就可以实现通过命令来控制亮度。

这样一来。

前面有数据,后面可控制,整个流程就跑通了。

下面开搞!

实现

实现总共需要两部分。

树莓派端和电脑端。

树莓派需要搞定接入传感器和控制电脑。

电脑需要搞定通过 DDC/CI 协议命令控制显示器。

由于我这里只有 Macbook,所以就只提供 For Mac 的方法了。

不过你可以研究下。

电脑端

安装 ddcctl

这个就是前面提到的,可以通过 Mac 命令行控制显示器的工具:

ddcctl 的 Github 主页在文章末尾[1]

1、克隆仓库到本地:

git clone https://github.com/kfix/ddcctl[2]

2、按照教程安装:

调试 ddcctl

在终端输入以下命令,试试看亮度会不会降低:

ddcctl -d 1 -b 亮度数值(1~100)

树莓派

采购光线传感器

因为树莓派不带数模/数模转换。

也就是说获取的光线亮度只能是 0 或 1,不能是其他的数字。

所以要自配一个模数转换器:PCF8591,某宝买一个就是了。

连线

到了之后把 PCF8591 接上 P5 的短路帽:

然后开始接线,一共 4 条线需要接。

很简单:

PCF8591 -> 树莓派

•VCC -> 1 号针脚•GND -> 9 号针脚•SDA -> 3 号针脚•SCI -> 5 号针脚

附一张针脚图:

装 Wiring Pi,开启 I2C & SPI

SSH 连接到树莓派,输入:

sudo apt-get install wiringpi -y

这样就安装完了。

接着输入:

sudo raspi-config

找到「Interfacing Options」:

一个一个按回车都打开就行了:

配置无秘钥访问

在 Mac 上依次选择「偏好设置 - 共享 - 远程登录」,打开开关:

在树莓派上输入:

成功的话就是下图这样:

下载我写的程序

写程序,我用 Wiring Pi 写的,好久没用 C 语言了。

在树莓派上直接 Clone:

git clone https://github.com/Sunbelife/auto_brightness_for_mac[3]

然后进入目录:

cd auto_brightness_for_mac

打开 auto_brightness.c 文件,修改图里标出的部分。

改成你自己电脑的用户名和 IP:

编译调试

编译运行一下:

依次输入:

然后用手捂住光线感应器,看看显示器亮度会不会降低。

用灯晃光线感应器,看看显示器亮度会不会提高。

如果有效果的话,就 OK 了。

调整数值

不过一般的情况应该是效果和想象有差别,尤其是光线感应部分。

因为每个人的光线环境都不同。

我写的这个比较简易。

需要你手动设置光线档位。

一共三挡,两个数字。

0-185,185-240,240 以上。

第一次调试的时候控制台会一直输出亮度值。

你可以多测试几次,找到阈值。

然后在图中位置修改代码:

重新编译运行即可。

配置开机自动运行

最后一步是配置开启自启,让树莓派开机的时候就自动生效。

方法挺多的,这里提供一种:

sudo nano /etc/rc.local

在 exit 0; 之前添加:

./home/pi/Desktop/auto_brightness_for_mac/run

然后按下 Ctrl + O,回车保存。

再按下 Ctrl + X,回车退出。

下次重启的时候就生效了。

附链接

[1] ddcctl 的 Github 主页在文章末尾: https://github.com/kfix/ddcctl
[2]https://github.com/kfix/ddcctl
[3]https://github.com/Sunbelife/auto_brightness_for_mac