宿舍的电脑桌侧对着窗户,因此白天阳光强烈的时候,显示器亮度相对于环境光就严重不足;如果这时手动调高了亮度,到晚上又嫌太亮;再调节,到白天又嫌暗。如此反复,甚为折腾。这是起因。
于是考虑写个定时脚本,每个小时自动调节一次亮度。亮度随时间变化的曲线是根据平时手动调节的经验设置的,起初的效果还挺不错的。略有遗憾的是,遇到阴雨天气,正午的环境亮度远不及晴天,这时依旧需要手动调整。不过稍微忍一忍也就过去了,就这么用了大概半年,从冬天转到夏天了——当初针对冬季正午晴天的亮度设置的水平明显不够了!毋庸置疑可以在脚本里再加上对季节的判断,然后给四季分别设置一条亮度曲线……可是不能忍!要就要彻底的自动化,彻底的自由![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 个多月,每次早上开机,看到屏幕起先是前天晚上的很低的亮度,马上自动适应环境变亮起来,就感觉浑身舒服^_^!
1
yukiww233 2018-08-10 21:14:59 +08:00
这个厉害
|
2
CEBBCAT 2018-08-10 21:44:31 +08:00 via Android
我咋就没想到呢,改天用 AT Tiny 搞一个
|
3
mx1700 2018-08-10 21:57:55 +08:00 via Android
很棒,动手能力强
|
4
zhujinliang 2018-08-10 22:03:30 +08:00 via iPhone
厉害👍
|
5
RHFS 2018-08-10 22:28:15 +08:00
牛的一批 这也能想到
|
6
wafm 2018-08-10 23:12:10 +08:00
厉害!
|
7
akira 2018-08-10 23:12:38 +08:00 1
这个东西好像可以产品化哦
|
9
Cambrian07 2018-08-10 23:24:57 +08:00 via Android
不错,我认为显示器以后都要集成上这个功能比较好
|
10
F1024 2018-08-10 23:34:10 +08:00
前段时间好像有发过一个调节显示器亮度的软件 但不是每个显示器都能用
|
12
johnyu 2018-08-11 07:25:09 +08:00
不错。求加 qq.
|
13
minamike 2018-08-11 07:55:31 +08:00 via iPhone 1
写个客户端 再把传感器做个好看的壳 就可以卖了(滑稽
|
14
springmarker 2018-08-11 08:20:10 +08:00 via Android
笔记本自带的有,不过有时候挡住光,或者开下灯啥的,变得很频繁,直接关了
|
15
mattx 2018-08-11 08:37:24 +08:00 via iPhone
牛逼了,改天也试试,答主也是对光线很敏感。
|
16
nuko 2018-08-11 09:08:28 +08:00
这时候就显示出笔记本自带的好处了
|
17
P233 2018-08-11 09:42:59 +08:00
有些独立显示器也带这个功能,不过传感器在正前方,当显示器背对光源的时候就很难用了。
|
18
aheadlead 2018-08-11 09:52:08 +08:00 via iPhone
楼主很棒!有没有考虑过山寨一个 Mac 的 True Tone (自动色温调节)?
个人可能很难做到苹果的质量…不过听起来也挺有趣 |
19
zhangneww 2018-08-11 10:02:09 +08:00
楼主前面的脚本不就是 f.lux 吗?很好奇楼主调节亮度的接口是哪来的,是操作系统的还是显示器有提供?
|
20
aheadlead 2018-08-11 10:39:32 +08:00
@zhangneww 亮度调节可以考虑用显示器的 DDC/CI 功能,可以通过 HDMI 和 DP 线直接调整几乎所有的显示器参数(包括色温、亮度……)
|
21
huclengyue 2018-08-11 10:41:34 +08:00 via Android
@aheadlead 色温调节 win 好像自带了
|
22
Osk 2018-08-11 11:18:12 +08:00 via Android
@huclengyue win 自带的夜灯怕不是假调节。 :doge:
@zhangneww 我自己之前撸的 python DDC/CI 操作模块: https://www.v2ex.com/t/424733,可以在其它程序中 import vcp,然后控制下显示器亮度,色温什么的 |
23
kn007 2018-08-11 11:19:32 +08:00
好想法
|
24
dbw9580 OP |
27
LeungJZ 2018-08-11 12:54:06 +08:00 via Android
v2 大神就是多。
|
29
chroming 2018-08-11 16:55:28 +08:00
感谢楼主分享,等有空了照着这个帖子弄个
|
30
yingtl 2018-08-11 17:36:07 +08:00
是不是可以读取手机的亮度传感器,通过网络去控制显示器亮度呢
|
31
zhujinliang 2018-08-11 17:48:26 +08:00
打个板子,用 APDS9900 和 atmega16u2,上位机可以搞 libusb 或者做成 hid,有搞头没?
或者直接一步到胃用 APDS9960 ? |
32
OhkindjiLL 2018-08-11 19:01:12 +08:00
谢谢楼主分享,抽时间自己也试下看看
|
33
jason94 2018-08-12 12:57:31 +08:00
想法不错,支持一下
|
34
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 |
35
aheadlead 2018-08-12 21:42:35 +08:00
之后有空再把它和 nshift 接起来吧~
|
36
aheadlead 2018-08-12 23:46:32 +08:00
简单用 nc + shell 实现了一下 效果挺好的
|
37
stone1996 2018-08-13 12:37:00 +08:00
f.lux 可以自动调,是个软件,根据日落时间啥的调节护眼模式
|
38
future1987 2019-03-12 11:56:30 +08:00
@dbw9580 您好,我也想做一个和您这个一样的调光的东西,显示器也是 dell 的,但不会写代码,请问能把控制脚本发我一份吗? [email protected]
|
39
jicakangel 2019-06-15 12:55:55 +08:00
不懂代码 能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。[email protected]
|
40
jicakangel 2019-07-12 12:56:41 +08:00
能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。[email protected]
|
41
bushnerd 2021-05-05 10:19:42 +08:00
有人用 AOC 的显示器吗?我找不到支持 CLI 的接口。
|