DIY 给显示器加装光传感器,实现自动调节亮度

2018-08-10 21:08:36 +08:00
 dbw9580

宿舍的电脑桌侧对着窗户,因此白天阳光强烈的时候,显示器亮度相对于环境光就严重不足;如果这时手动调高了亮度,到晚上又嫌太亮;再调节,到白天又嫌暗。如此反复,甚为折腾。这是起因。

于是考虑写个定时脚本,每个小时自动调节一次亮度。亮度随时间变化的曲线是根据平时手动调节的经验设置的,起初的效果还挺不错的。略有遗憾的是,遇到阴雨天气,正午的环境亮度远不及晴天,这时依旧需要手动调整。不过稍微忍一忍也就过去了,就这么用了大概半年,从冬天转到夏天了——当初针对冬季正午晴天的亮度设置的水平明显不够了!毋庸置疑可以在脚本里再加上对季节的判断,然后给四季分别设置一条亮度曲线……可是不能忍!要就要彻底的自动化,彻底的自由![doge]

于是寻找可以根据环境光自动调节亮度的方法。发现明基在 17 年出了款带有光传感器的显示器,可以像手机和笔记本电脑的屏幕一样自动调节亮度。但是出于没钱,不想换显示器,那就只好自己给显示器加个光传感器啦!

在淘宝随便翻翻,选中这块 APDS9900 的光传感器。市面上还有其他厂商的其他型号的芯片,基本都是大同小异,在测量的动态范围、灵敏度方面会有些差异,价格也都是 10 元以下,任君挑选。唯一要注意的是一定要选数字的,也就是自带 AD 转换的,不然买了模拟的芯片回来,还需要自己解决供电、AD 转换,以及到 PC 的接口等等一系列问题,你是绝对不会想要继续自己画电路图、刻 PCB 板的。

这块芯片是 I2C 接口的,不能直接连到电脑的主板上,解决的办法有很多,最简单的是用一个 I2C 到 USB 的转换器。

这些转换器主要有国内沁恒的 CH341 和英国 FTDI 的 FT232 系列,国产的便宜 10 块钱左右。两者的功能和性能有些差异,但是用在连接低速的传感器上都是能完全胜任的。最终影响我的决定的是有家店同时有传感器和 FTDI 的片子卖,就省了我一份运费的钱。而且买回来发现,FTDI 的片子 Win10 已经会自动安装驱动,省事不少。另外还有现成的 PyFtdi 的库可以直接使用,省去从 Python 里调用 DLL 库的各种麻烦。

现役的显示器是戴尔 P2214H,购于 15 年年中。虽然不过千元出头,到了连线安装的时候,戴尔这显示器的好处就体现出来了:戴尔 P 系列都带 2-3 个 USB 接口,通过一根上行线连到主机上,相当于一个 USB Hub,那个 I2C2USB 的转换器正好插在显示器背后的接口里,恰到好处;不然转换器插在主机屁股上,传感器要贴在显示器正面,要用长长的连线连起来,麻烦不说,如果因为线缆过长引起信号畸变,还需要做补偿。而且显示器侧边框刚好和传感器的 PCB 一样宽,用双面胶贴到边框上非常简单。

硬件安装好之后,就是写个脚本,读取传感器数值,把环境光的照度转换成显示器的亮度百分比,来调节显示器的亮度。戴尔提供了 Dell Display Manager,带有 CLI 的接口,很容易通过脚本调用,调节显示器的很多设置,又省下不少工夫。

至于照度 lux 到显示亮度百分比的映射关系,有些研究文献提出过一些结果,微软也在 Win10 的开发者文档里有参考样例,但是我觉得还是基于自己的偏好和显示器的素质自己确定最合适。比如微软的例子里在 100lux 的照度下(大约相当于晴天上午非日光直射的室内)显示器的亮度设为 58%对于我来说就太高了,大约 40%左右就觉得足够了。所以自己根据以前的脚本里的时刻到亮度的映射曲线重新拟合了一个。

还有一些用户体验的问题。我在计划任务里设置脚本每小时运行一次,然后在桌面上放个快捷方式,应对临时的急剧的照度变化,可以手动调节亮度。后来闲的时候,又改成每两秒读取一次传感器读数,然后和历史前 10s 的平均数对比,出现急剧的变化也可以实现自动调节,基本上和手机的自动亮度调节效果一样了。

目前已经正常运行 1 个多月,每次早上开机,看到屏幕起先是前天晚上的很低的亮度,马上自动适应环境变亮起来,就感觉浑身舒服^_^!

10185 次点击
所在节点    分享创造
42 条回复
huclengyue
2018-08-11 10:41:34 +08:00
@aheadlead 色温调节 win 好像自带了
Osk
2018-08-11 11:18:12 +08:00
@huclengyue win 自带的夜灯怕不是假调节。 :doge:

@zhangneww 我自己之前撸的 python DDC/CI 操作模块: https://tanronggui.xyz/t/424733,可以在其它程序中 import vcp,然后控制下显示器亮度,色温什么的
kn007
2018-08-11 11:19:32 +08:00
好想法
dbw9580
2018-08-11 11:35:55 +08:00
>>18
@aheadlead 要做色温调节就需要知道光线里不同频率成分的比例,9900 这个传感器只有一个通道,而换成 APDS9960 就有 RGB 三个通道,就可以知道色温了。不过价格也是 9900 的三倍。稍微对控制的脚本做下修改就可以了吧。

>>19
@zhangneww f.lux 是调色温的,和亮度还是有点不一样。色温我就靠 Win10 自带的那个定时开关,效果还不错。
0attocs
2018-08-11 11:37:15 +08:00
@Osk 夜灯是可以自定义色温的。
dbw9580
2018-08-11 11:42:02 +08:00
>>22
@Osk 嗯,这个好,我办公室的显示器不像 dell 给了 DDM,还是要靠 DDC/CI 控制。
LeungJZ
2018-08-11 12:54:06 +08:00
v2 大神就是多。
aheadlead
2018-08-11 13:18:56 +08:00
@dbw9580 赞!我用的是 Mac,可以用 nshift 和 ddcctl 来控制
chroming
2018-08-11 16:55:28 +08:00
感谢楼主分享,等有空了照着这个帖子弄个
yingtl
2018-08-11 17:36:07 +08:00
是不是可以读取手机的亮度传感器,通过网络去控制显示器亮度呢
zhujinliang
2018-08-11 17:48:26 +08:00
打个板子,用 APDS9900 和 atmega16u2,上位机可以搞 libusb 或者做成 hid,有搞头没?
或者直接一步到胃用 APDS9960 ?
OhkindjiLL
2018-08-11 19:01:12 +08:00
谢谢楼主分享,抽时间自己也试下看看
jason94
2018-08-12 12:57:31 +08:00
想法不错,支持一下
aheadlead
2018-08-12 21:42:15 +08:00
我买了一个 TCS34725 传感器,官方有树莓派的 lib (再也不想去照着 datasheet 写驱动了)。
效果不错,官方的 lib 自带色温输出。数据还是比较稳定的。

Color: red=2864 green=3050 blue=2464 clear=8712
Color Temperature: 5349 K
Luminosity: 2080 lux
Color: red=2868 green=3055 blue=2468 clear=8726
Color Temperature: 5349 K
Luminosity: 2084 lux
Color: red=2870 green=3056 blue=2469 clear=8728
Color Temperature: 5349 K
Luminosity: 2084 lux
Color: red=2868 green=3050 blue=2465 clear=8714
Color Temperature: 5346 K
Luminosity: 2078 lux
Color: red=2867 green=3052 blue=2467 clear=8720
Color Temperature: 5352 K
Luminosity: 2080 lux
Color: red=2867 green=3052 blue=2467 clear=8719
Color Temperature: 5352 K
Luminosity: 2080 lux
Color: red=2865 green=3051 blue=2466 clear=8717
Color Temperature: 5353 K
Luminosity: 2080 lux
Color: red=2866 green=3053 blue=2467 clear=8721
Color Temperature: 5352 K
Luminosity: 2082 lux
Color: red=2869 green=3056 blue=2469 clear=8728
Color Temperature: 5350 K
Luminosity: 2084 lux
Color: red=2870 green=3055 blue=2468 clear=8727
Color Temperature: 5346 K
Luminosity: 2083 lux
Color: red=2869 green=3052 blue=2466 clear=8721
Color Temperature: 5345 K
Luminosity: 2080 lux
Color: red=2865 green=3050 blue=2465 clear=8713
Color Temperature: 5351 K
Luminosity: 2079 lux
Color: red=2867 green=3052 blue=2466 clear=8718
Color Temperature: 5348 K
Luminosity: 2081 lux
aheadlead
2018-08-12 21:42:35 +08:00
之后有空再把它和 nshift 接起来吧~
aheadlead
2018-08-12 23:46:32 +08:00
简单用 nc + shell 实现了一下 效果挺好的
stone1996
2018-08-13 12:37:00 +08:00
f.lux 可以自动调,是个软件,根据日落时间啥的调节护眼模式
future1987
2019-03-12 11:56:30 +08:00
@dbw9580 您好,我也想做一个和您这个一样的调光的东西,显示器也是 dell 的,但不会写代码,请问能把控制脚本发我一份吗? fxs1973@scdk.uu.me
jicakangel
2019-06-15 12:55:55 +08:00
不懂代码 能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。312438713@qq.com
jicakangel
2019-07-12 12:56:41 +08:00
能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。312438713@qq.com

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/478729

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX