光敏电阻LDR接Arduino做自动感光小夜灯:接线、分压原理与触发代码

2026-10-20 17:00:30 41阅读

想做一个天黑自动亮的小夜灯,光敏电阻(LDR)是最省钱省力的选择。它遇光阻值变小、遇暗阻值变大,配合一个固定电阻做分压,让 Arduino 用模拟口读取亮度对应的电压,就能判断白天黑夜再决定是否开灯。这篇把原理、接线、代码一次理顺。

光敏电阻为什么能感知光

LDR 是一种阻值受光照影响的电阻:光照强时它的阻值会掉到几百欧到几千欧,环境变暗时阻值会升到几十千欧甚至几兆欧。把它串一个 10kΩ 固定电阻接到 5V 和 GND 之间,中间那个点接 Arduino 的模拟口 A0,就构成一个分压电路。A0 读到的不是阻值本身,而是分压点上对应的电压(0~5V),用 analogRead(A0) 得到 0~1023 的数值。环境越暗,LDR 阻值越大,分压点电压越高,读到的数值越大——这就是「越暗读数越大」的来源,记住这个方向后面写代码就不容易晕。

LDR 光敏电阻分压电路与 Arduino 的接线原理图

接线清单与关键点

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

LDR 光敏电阻配合面包板与 Arduino 的完整接线示例

自动感光小夜灯代码

代码思路很直接:每 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);
}

进阶:让它变成光线感应开关

因为这个「越暗读数越大」的方向是固定的,想要「天亮熄灭、天黑亮」就按上面写;想要「天亮才亮」把大于号改成小于号再调阈值即可。除了做小夜灯,把阈值改成区间判断,还能做遮光窗帘的自动控制或相机的自动曝光提醒。接到继电器上还能自动控制楼道灯,让光照控制物联化。

本篇为实操改写整理,光敏种类不同读数范围会有差异,务必先实测出白天黑夜两个极值再定阈值。


作者:工位上的小周
链接:https://www.aiddithome.com/p/1a3b2ac3f80b7b.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
胶佬憨憨
1楼 · 2026-10-20 17:00:35

看完顺便把家里阳台灯也改成光照控制了,挺有趣的。

触底反弹的Tony
2楼 · 2026-10-20 17:00:34

10k分压配任何一个光敏都行,我用AO读100-900之间,阈值很稳。

刷着刷着入坑了
3楼 · 2026-10-20 17:00:33

分压电阻的逻辑终于看懂了,原来是要A0读的就是电压不是阻值。

修啥都行二哥
4楼 · 2026-10-20 17:00:33

请教一下,想做成天亮了才亮有没有办法,是取反就行吗?

阿强焊点总飞
5楼 · 2026-10-20 17:00:32

天黑自动亮灯这个我放在走廊,真的省心,孩子房间也能用。