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 个多月,每次早上开机,看到屏幕起先是前天晚上的很低的亮度,马上自动适应环境变亮起来,就感觉浑身舒服^_^!

9756 次点击
所在节点    分享创造
42 条回复
yukiww233
2018-08-10 21:14:59 +08:00
这个厉害
CEBBCAT
2018-08-10 21:44:31 +08:00
我咋就没想到呢,改天用 AT Tiny 搞一个
mx1700
2018-08-10 21:57:55 +08:00
很棒,动手能力强
zhujinliang
2018-08-10 22:03:30 +08:00
厉害👍
RHFS
2018-08-10 22:28:15 +08:00
牛的一批 这也能想到
wafm
2018-08-10 23:12:10 +08:00
厉害!
akira
2018-08-10 23:12:38 +08:00
这个东西好像可以产品化哦
wafm
2018-08-10 23:15:13 +08:00
@akira 软硬不结合也没法做到 普通用户要这么折腾能给售后累死吧
Cambrian07
2018-08-10 23:24:57 +08:00
不错,我认为显示器以后都要集成上这个功能比较好
F1024
2018-08-10 23:34:10 +08:00
前段时间好像有发过一个调节显示器亮度的软件 但不是每个显示器都能用
CEBBCAT
2018-08-11 00:05:52 +08:00
@F1024 记得那个是 Python 写的(但用的是显示器们提供的接口
johnyu
2018-08-11 07:25:09 +08:00
不错。求加 qq.
minamike
2018-08-11 07:55:31 +08:00
写个客户端 再把传感器做个好看的壳 就可以卖了(滑稽
springmarker
2018-08-11 08:20:10 +08:00
笔记本自带的有,不过有时候挡住光,或者开下灯啥的,变得很频繁,直接关了
mattx
2018-08-11 08:37:24 +08:00
牛逼了,改天也试试,答主也是对光线很敏感。
nuko
2018-08-11 09:08:28 +08:00
这时候就显示出笔记本自带的好处了
P233
2018-08-11 09:42:59 +08:00
有些独立显示器也带这个功能,不过传感器在正前方,当显示器背对光源的时候就很难用了。
aheadlead
2018-08-11 09:52:08 +08:00
楼主很棒!有没有考虑过山寨一个 Mac 的 True Tone (自动色温调节)?

个人可能很难做到苹果的质量…不过听起来也挺有趣
zhangneww
2018-08-11 10:02:09 +08:00
楼主前面的脚本不就是 f.lux 吗?很好奇楼主调节亮度的接口是哪来的,是操作系统的还是显示器有提供?
aheadlead
2018-08-11 10:39:32 +08:00
@zhangneww 亮度调节可以考虑用显示器的 DDC/CI 功能,可以通过 HDMI 和 DP 线直接调整几乎所有的显示器参数(包括色温、亮度……)

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

https://www.v2ex.com/t/478729

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

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

© 2021 V2EX