让设备读懂环境光和颜色
一颗报出 lux 的光传感器,看起来已经把整件事做完了,直到读数在一盏白炽灯下爬高、而那盏灯在眼睛看来并不更亮。麻烦在于裸硅看得很深、一直看进红外,而眼睛在那里什么都看不到,于是一颗不为自己的光谱响应做校正的传感器,量的是和人所经历的不同的另一束光。把环境光测好,很大程度上是让传感器按应用需要的方式去看,而不是按硅天生的方式去看。一颗光电二极管和一只眼睛都把光变成信号,可它们应于不同的波段,而弥合这个差别,正是每一次光读数背后那份安静的功夫。
硅看到的和眼睛看到的之间那道缝,贯穿这里的每一个选择。有些器件把校正埋在内部,加一片模仿眼睛响应的滤光片、报出一个设计者能信的 lux 值。另一些交回一个或多个波段上的原始计数、把解读留给主机。颜色是同一个问题再上一个台阶,因为读颜色意味着一次量好几个波段,还要不让红外渗进它们每一个。
直接报 lux 的器件
那些方便的器件把光谱校正和转换都在内部做了,交回一个已经是 lux 的数。它们适合任何要随环境亮度调整的东西,一部把屏幕调暗的手机、或一个读室内光的恒温器,那里主机想要一个答案、而不是一份要去处理的测量。它们之间的差别落在精度、动态范围、以及各自跟眼睛跟得多紧上。一颗三样都做到顶的器件更贵、也很少需要,所以选择通常是在掂量这活儿到底该校正到什么程度。
BH1750 直接在 I²C 上给一个数字 lux 读数,是一颗便宜又流行的器件,不用校准就能用、除了去耦外不要外围。它从零点几 lux 分辨到几万 lux,够跨一个昏暗房间和一扇明亮的窗,而它可选的测量模式在分辨率和速度之间取舍。一个地址脚让两颗共用一条总线,一次完整转换跑在几十毫秒,快到一块跟踪房间的屏幕从不觉得卡。它的光谱响应是对眼睛的一个粗略近似、而不是紧密匹配,所以它是那颗用来大致知道一个空间有多亮的器件,这正是很多随环境调整的活儿所需要的、不多也不少。
VEML7700 以更高精度测环境光,对眼睛响应的匹配也更近,带一个宽动态范围、和可配置的积分时间与增益。在低端它能拉长积分时间、从接近黑暗里抠出一个读数,在高端它降增益、好让直射阳光不把输出顶死,正是这两个调整让一颗器件覆盖一个室内和一扇阳光下的窗。当 lux 数必须准时它就是那个升级,在一台照度计、或一块对着目标校准自己亮度的显示屏里,那里松松地跟着房间走满足不了要求。
OPT3001 按眼睛响应的方式测亮度,专门造来匹配人的明视觉曲线、并抑制那些本会在白炽灯或阳光下把读数抬高的红外。这在任何一个设备必须和人对亮度的感知保持一致的地方都要紧,因为一颗去数人看不见的红外的传感器,会在一盏暖光灯下把屏幕调错。它在 I²C 上报 lux、校正已经做好,还在亮度越过主机设定的一个窗口时拉一个中断,于是一个设备能睡着、让器件替它盯着光照变化,而不必去轮询,这在一个电池设备里要紧,那里整天醒着读光会把电芯耗干。
这三颗都终于一个 lux 数,它们之间怎么选,是这个数要多紧地代表眼睛所代表的,再对着成本掂量。
把裸光当成电流来读
在那一切积分之前,光是一股电流。一颗光电二极管产生一股与照在它上面的光成正比的电流,而BPW34 就是这样一颗常用的光电二极管,是设计者想拿到原始光信号、并打算自己在它周围搭放大器和响应整形时伸手去拿的那颗。它快、宽谱,而且看得很深进红外,这让它灵活,也意味着周围的电路得自己供上一颗封装好的 lux 传感器本会在内部做掉的光谱整形。它的速度适合一个数中断次数的编码器或光栅,而它裸露的结把"把电流变成一个数"的每一步都交给设计者,用在血氧仪、和任何不合一颗成品传感器的光学活儿里。
TEMT6000 把环境光读成一个模拟输出,是一颗响应大致整形向可见光的光电三极管,给出一个随亮度爬升、直接进 ADC 脚的电压。它坐在裸光电二极管和数字 lux 器件之间,比一颗完整传感器简单、比一颗裸二极管成品,而它窄窄的视场适合读落在某一个点上的光。它是那个便宜亮度读数的选择,那里一个粗略的模拟电平就够了、一条总线会比这活儿需要的多。

为什么光传感器得像眼睛一样看
这一切底下的那条线是光谱响应,一个朴素的事实:一颗传感器和一只眼睛看的不是同一束光。硅在近红外达到峰值,那是人眼根本探测不到的一个波段,所以一颗对着一个场景的光电二极管,报出一大份那个站在那里的人从不感知的红外。一盏白炽灯和太阳都往外倒红外,而一支荧光灯管或一颗白光 LED 几乎不出,于是一颗未校正的传感器,会把同样的可见亮度按光源不同读成两个不同的电平,一块靠它调暗的屏幕在室内会是一种样子、在窗边又是另一种。修法是把传感器的响应弯向眼睛的,那条在绿色处达峰、在可见光两端落到零的明视觉曲线,要么用一片盖在芯片上的滤光片、要么测好几个波段再算出可见的那部分。动态范围是第二个难处,因为有用的光从一个昏暗房间里远不到一 lux、到直射阳光下的几万 lux,一个跨度没有哪个固定增益盖得住,这正是这些器件带可调积分时间和增益、并自动一档档地切的原因。积分时间还定下读数被平滑掉多少、以及它会不会拾到市电驱动照明的闪烁,闪烁会和一个短积分窗拍频、让读数游走,除非把时序选成对整数个市电周期取平均,而 PWM 调光的 LED 照明在更高的速率上抛出同样的问题。这些没有一样出现在首页单独一个 lux 数字里,而它们全决定了这个数是不是一个人会称之为亮度的东西。
读颜色,不只是亮度
颜色是亮度被拆进了波段。不是用一个数说有多少光,一颗颜色传感器报出红、绿、蓝里各落了多少,主机从这些里算出一个颜色或一个色温。红外问题在这里回来得更尖锐,因为渗进任何一个通道的红外,会把报出的颜色从一个人看到的那个推开,而通道本身是盖在光电二极管上的染料滤光片、它们对真正的红绿蓝的匹配是近似的,所以一颗颜色器件成败系于它的红外抑制和它的校准。
APDS-9960 在一颗里做接近、手势和 RGB 检测,把一颗颜色传感器和一个红外发射器加探测器配在一起,于是它还能察觉一只手在靠近或扫过。它是一部手机在一只手挥过时唤醒、在通话中贴着脸颊时熄屏背后的那颗,把好几项光学活儿折进一个小封装。它的手势引擎从它的光电二极管按什么顺序变亮里读出一次挥扫的方向,够做一个挥手翻页或抬手贪睡而不用相机;接近读数来自给它自己红外 LED 的反射计时,所以它在黑暗里也能用,而相机会需要自己的光;它的 RGB 通道给一个粗略的颜色读数,够不上一个校准过的测量。
TCS34725 带一片红外阻挡滤光片测颜色,那片盖在芯片上的滤光片,正是让它报出一个接近眼睛所见、而不是被红外带偏的颜色的关键。它在 I²C 上给红、绿、蓝和清光通道,从它们的比值主机算出一个相关色温,也就是一台相机或一颗智能灯泡用来设白平衡的那个偏暖偏冷的数。常见的扩展板带自己的照明 LED,于是颜色读数不取决于碰巧落在目标上的环境光。

一个特定波长上的光
有时重点不是总体亮度,而是某一个特定波段上的光,这时挑传感器,看它忽略什么和看它读什么一样重要。把响应过滤到一个窄范围,就把一颗光传感器变成对单独一样东西的测量,这就是一颗光学器件怎么干一件宽谱传感器只会搅浑的活。
VEML6070 测紫外强度,响应 UV-A 波段、报出一个映射向 UV 指数的电平,是给一个会就晒伤示警的可穿戴或气象节点的那颗。它读眼睛看不见的那个波段、忽略那束灌满每一个户外场景的可见光,而它的积分时间定下速度和灵敏度之间的平衡,原始计数通过一张有据可查的表映射到 UV 指数、而不是一个单一的比例因子。这正是一颗专用紫外器件存在、而不是从一颗可见光传感器去猜的全部理由。
SFH5711-2/3-Z 为显示屏背光调节而造,是一颗响应整形到眼睛、输出是对数的光传感器,把从一个黑暗房间到明亮阳光那个庞大的范围压进一个好处理的信号。对数这个形状正是背光调节要的,因为被感知的亮度本身就是对数的,于是输出上一个线性的台阶就对应一个被感知的亮度台阶。每十倍的光把输出移动一个固定的量,这意味着几毫伏的变化总是代表同样的亮度比例,无论在黑暗房间还是正午阳光下,一块靠它调暗的屏幕在整个范围里跟着眼睛的预期走,不必为昏暗端和明亮端分开处理。
让问题来决定传感器
纵观这一整组,反复出现的教训是,一颗光传感器只和它的光谱响应与它所服务的眼睛或应用之间的匹配一样好。一颗响应不对的器件,交回一个自信的 lux 数,却和每一个看着同一个场景的人意见相左,而再高的分辨率也救不回一个从一开始就在测错光的读数。
所以第一个问题,很少是一颗器件能分辨多少 lux。而是这活儿在乎的是什么光、以及这颗传感器能被做到多接近只看那束光,这正是分开一个人会认同的亮度读数、和一个只是看着精确的数的地方。
相关信息

- 2026.06.04 给设备做声音采集和振动监测

- 2026.06.04 把流量和液位测准的传感方案

- 2026.06.04 无接触地把位置和角度测出来

- 2026.06.04 在联网设备里感知温湿度、气体与空气质量
