想做一个天黑自动亮的小夜灯,光敏电阻(LDR)是最省钱省力的选择。它遇光阻值变小、遇暗阻值变大,配合一个固定电阻做分压,让 Arduino 用模拟口读取亮度对应的电压,就能判断白天黑夜再决定是否开灯。这篇把原理、接线、代码一次理顺。
光敏电阻为什么能感知光
LDR 是一种阻值受光照影响的电阻:光照强时它的阻值会掉到几百欧到几千欧,环境变暗时阻值会升到几十千欧甚至几兆欧。把它串一个 10kΩ 固定电阻接到 5V 和 GND 之间,中间那个点接 Arduino 的模拟口 A0,就构成一个分压电路。A0 读到的不是阻值本身,而是分压点上对应的电压(0~5V),用 analogRead(A0) 得到 0~1023 的数值。环境越暗,LDR 阻值越大,分压点电压越高,读到的数值越大——这就是「越暗读数越大」的来源,记住这个方向后面写代码就不容易晕。

接线清单与关键点
你需要一块 LDR、一颗 10kΩ 电阻、几个跳线。接法:5V 出来先接 LDR 一脚,LDR 另一脚接 A0,同时 A0 这个点再经 10kΩ 电阻下拉到 GND,LED 接在数字脚 13 上(板载也行)。这样 A0 读到的电压就是 LDR 与 10k 分压后的结果。注意光敏电阻不分正负极,怎么接都行,但分压电阻阻值不能省,没有它 A0 只能读到 5V 或 0V 两个极端,分不出中间亮度。

自动感光小夜灯代码
代码思路很直接:每 200ms 读一次 A0 的模拟值,阈值我默认设 500(相当于比较暗),读数大于阈值就点亮 LED,小于就熄灭,并在串口打印当前亮度方便你定自己的阈值。你也可以先打印一串一天里不同时段的读数,观察白天黑夜的数值范围,把阈值设在它们中间,触发就最稳。
const int sensorPin=A0;
const int ledPin=13;
int threshold=500; // 自己按环境实测调整
void setup(){ pinMode(ledPin,OUTPUT); Serial.begin(9600);}
void loop(){
int light=analogRead(sensorPin);
Serial.print("Light="); Serial.println(light);
if(light>threshold){ digitalWrite(ledPin,HIGH);}
else{ digitalWrite(ledPin,LOW);}
delay(200);
}进阶:让它变成光线感应开关
因为这个「越暗读数越大」的方向是固定的,想要「天亮熄灭、天黑亮」就按上面写;想要「天亮才亮」把大于号改成小于号再调阈值即可。除了做小夜灯,把阈值改成区间判断,还能做遮光窗帘的自动控制或相机的自动曝光提醒。接到继电器上还能自动控制楼道灯,让光照控制物联化。
本篇为实操改写整理,光敏种类不同读数范围会有差异,务必先实测出白天黑夜两个极值再定阈值。







看完顺便把家里阳台灯也改成光照控制了,挺有趣的。
10k分压配任何一个光敏都行,我用AO读100-900之间,阈值很稳。
分压电阻的逻辑终于看懂了,原来是要A0读的就是电压不是阻值。
请教一下,想做成天亮了才亮有没有办法,是取反就行吗?
天黑自动亮灯这个我放在走廊,真的省心,孩子房间也能用。