首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
V2EX  ›  分享创造

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

  •  7
     
  •   dbw9580 · 2018-08-10 21:08:36 +08:00 · 4824 次点击
    这是一个创建于 439 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    于是考虑写个定时脚本,每个小时自动调节一次亮度。亮度随时间变化的曲线是根据平时手动调节的经验设置的,起初的效果还挺不错的。略有遗憾的是,遇到阴雨天气,正午的环境亮度远不及晴天,这时依旧需要手动调整。不过稍微忍一忍也就过去了,就这么用了大概半年,从冬天转到夏天了——当初针对冬季正午晴天的亮度设置的水平明显不够了!毋庸置疑可以在脚本里再加上对季节的判断,然后给四季分别设置一条亮度曲线……可是不能忍!要就要彻底的自动化,彻底的自由![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 个多月,每次早上开机,看到屏幕起先是前天晚上的很低的亮度,马上自动适应环境变亮起来,就感觉浑身舒服^_^!

    40 回复  |  直到 2019-07-12 12:56:41 +08:00
        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
    这个东西好像可以产品化哦
        8
    wafm   2018-08-10 23:15:13 +08:00
    @akira 软硬不结合也没法做到 普通用户要这么折腾能给售后累死吧
        9
    Cambrian07   2018-08-10 23:24:57 +08:00 via Android
    不错,我认为显示器以后都要集成上这个功能比较好
        10
    F1024   2018-08-10 23:34:10 +08:00
    前段时间好像有发过一个调节显示器亮度的软件 但不是每个显示器都能用
        11
    CEBBCAT   2018-08-11 00:05:52 +08:00 via Android
    @F1024 记得那个是 Python 写的(但用的是显示器们提供的接口
        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   2018-08-11 11:35:55 +08:00
    >>18
    @aheadlead 要做色温调节就需要知道光线里不同频率成分的比例,9900 这个传感器只有一个通道,而换成 APDS9960 就有 RGB 三个通道,就可以知道色温了。不过价格也是 9900 的三倍。稍微对控制的脚本做下修改就可以了吧。

    >>19
    @zhangneww f.lux 是调色温的,和亮度还是有点不一样。色温我就靠 Win10 自带的那个定时开关,效果还不错。
        25
    0attocs   2018-08-11 11:37:15 +08:00 via iPhone
    @Osk 夜灯是可以自定义色温的。
        26
    dbw9580   2018-08-11 11:42:02 +08:00
    >>22
    @Osk 嗯,这个好,我办公室的显示器不像 dell 给了 DDM,还是要靠 DDC/CI 控制。
        27
    LeungJZ   2018-08-11 12:54:06 +08:00 via Android
    v2 大神就是多。
        28
    aheadlead   2018-08-11 13:18:56 +08:00
    @dbw9580 赞!我用的是 Mac,可以用 nshift 和 ddcctl 来控制
        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   225 天前
    @dbw9580 您好,我也想做一个和您这个一样的调光的东西,显示器也是 dell 的,但不会写代码,请问能把控制脚本发我一份吗? [email protected]
        39
    jicakangel   130 天前
    不懂代码 能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。[email protected]
        40
    jicakangel   103 天前
    能分享下控制软件吗?同款光敏硬件都买了,戴尔 U2311 的显示器,希望楼主不吝分享谢谢 。[email protected]
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   973 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 34ms · UTC 20:40 · PVG 04:40 · LAX 13:40 · JFK 16:40
    ♥ Do have faith in what you're doing.