一、光照基础与传感器选型

各位同学好,我是老张。做智能家居系统这么多年,我始终觉得光照系统是最能体现「智能」二字的模块。你想想看,窗帘自动开合、灯光随环境亮度变化,这些场景用户每天都能感知到。但要把这件事做好,第一步就得把光照的基础概念和传感器选型搞明白。

今天这一章,我们就来聊聊光照强度单位、常见传感器的原理,以及我这些年踩过的坑。

1.1 光照强度单位:勒克斯与流明

先问大家一个问题:你买的灯泡上写着「800流明」,这到底是什么意思?

流明(lm) 是光通量的单位。说白了,就是光源发出的光总量。一个40W的白炽灯大概能发出400-500流明,而一个8W的LED灯也能达到这个水平。嗯,这里要注意,流明是光源本身的属性,跟你离多远没关系。

勒克斯(lux) 就不一样了。它是照度单位,表示单位面积上接收到的光通量。1勒克斯 = 1流明/平方米。你想想看,同样一个灯泡,离得近照度就高,离得远照度就低。这就是为什么我们做传感器选型时,关注的是勒克斯值,而不是流明值。

核心区别一句话总结:流明是「发出来多少」,勒克斯是「照到多少」。

我在项目中遇到过不少新手,拿着流明值去算光照补偿,结果完全对不上。其实你只要记住:传感器测量的是勒克斯,灯具标注的是流明。两者之间差了一个「面积」的换算。

常见的照度参考值(我平时做项目都会记在笔记本上):

场景 照度范围(lux)
深夜月光 0.1 - 0.3
黄昏/阴天室内 50 - 200
办公室桌面 300 - 500
晴天室内(靠窗) 1000 - 2000
晴天室外 10000 - 100000

1.2 常见光照传感器原理与选型对比

市面上光照传感器种类不少,但真正适合智能家居场景的,我个人常用就三种:BH1750、TSL2561 和光敏电阻。咱们一个一个说。

1.2.1 BH1750 数字光照传感器

这个传感器我用的最多。为什么?因为它直接输出勒克斯值,不需要你手动换算。内部集成了高精度ADC,测量范围1-65535 lux,精度能达到±1 lux。

它的工作原理其实不复杂:利用光电二极管将光信号转为电流,再通过内部电路放大、模数转换,最后通过I2C接口输出数字量。你直接读寄存器就能拿到勒克斯值。

我的使用习惯:BH1750有3种测量模式,我一般用「高分辨率模式2」,分辨率0.5 lux,测量时间120ms。既保证了精度,响应速度也够用。

接线也很简单:VCC接3.3V,GND接地,SCL和SDA接I2C总线。地址引脚ADDR接地时地址是0x23,接VCC时是0x5C。我习惯把ADDR接地,省事。

// BH1750 读取示例(Arduino)
#include <Wire.h>

#define BH1750_ADDR 0x23

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Wire.beginTransmission(BH1750_ADDR);
  Wire.write(0x10); // 高分辨率模式
  Wire.endTransmission();
  
  delay(120);
  
  Wire.requestFrom(BH1750_ADDR, 2);
  uint16_t value = (Wire.read() << 8) | Wire.read();
  float lux = value / 1.2;
  
  Serial.print("光照强度: ");
  Serial.print(lux);
  Serial.println(" lux");
  delay(1000);
}

1.2.2 TSL2561 数字光照传感器

TSL2561 也是个好东西。它有两个光电二极管:一个对可见光敏感,另一个对红外光敏感。通过计算两者的差值,可以更准确地模拟人眼对光的感知。

它的测量范围更宽,0.1-40000 lux,而且功耗极低,适合电池供电的设备。不过,它输出的是原始ADC值,你需要自己换算成勒克斯。换算公式有点复杂,不同光照条件下要用不同的系数。

我曾经踩过的坑:TSL2561的积分时间设置不当,会导致测量值跳变。比如在快速变化的日光灯下,如果积分时间设得太短,读数会忽高忽低。我后来统一设为402ms的积分时间,稳定性好多了。

选型对比时,我一般这样看:

参数 BH1750 TSL2561 光敏电阻
输出类型 数字(I2C) 数字(I2C) 模拟(电压)
测量范围 1-65535 lux 0.1-40000 lux 取决于电路
精度 ±1 lux ±2 lux(典型) 低(±20%)
功耗 0.12mA 0.24mA 取决于分压电阻
价格 中等 较高 极低
易用性 ★★★★★ ★★★☆☆ ★★☆☆☆

1.2.3 光敏电阻(LDR)

光敏电阻,说白了就是一个阻值随光照变化的电阻。暗环境下阻值可达1MΩ以上,强光下可能只有几百欧姆。配合一个固定电阻组成分压电路,用ADC读取电压值就能估算光照强度。

它最大的优点是便宜,几毛钱一个。但缺点也很明显:精度差、响应慢、一致性不好。同一个型号的光敏电阻,不同批次之间阻值可能差30%。

我的建议:如果你做的是玩具级产品,或者只需要判断「白天/黑夜」这种二值场景,光敏电阻够用。但如果你要做精确的自动调光,还是老老实实用BH1750吧。

1.3 选型总结与实战建议

说了这么多,到底怎么选?我个人习惯是这样的:

  • 室内自动调光系统:首选BH1750。精度够、易用性好、价格适中。我最近一个项目里用了20多个BH1750,全部一次性校准通过。
  • 户外或宽动态范围场景:选TSL2561。它能处理从月光到正午阳光的极端变化,而且红外补偿让数据更准。
  • 成本敏感或简单判断:光敏电阻。但记得加一个RC低通滤波,不然读数会抖得厉害。

最后说一个避坑指南:传感器安装位置很重要。我曾经把BH1750装在窗帘盒内侧,结果窗帘拉上后传感器被遮住,系统以为天黑了,把灯全打开了。后来我改成装在窗户上沿、朝外倾斜15度,才解决了这个问题。

好了,这一章就到这里。下一章我们聊聊调光策略——怎么根据光照值平滑地控制窗帘和灯光,让用户感觉不到「顿挫感」。到时候我会分享一个我调试了三个月的PID调光算法,很有意思。