本项目实现了一个 自动灯光控制系统:
当环境变暗时,Arduino 自动打开 12V LED 灯带;
当环境光线变亮时,又自动关闭灯带。
系统核心特性:
利用 LDR 光敏电阻 感知环境亮度;
通过 电压分压电路 将光强转换为可测电压;
使用 Arduino UNO Mini 读取光强并做逻辑判断;
通过 5V 继电器模块 控制 12V LED 灯带通断;
无需按键、无需人为干预,实现 全自动“天黑亮灯,天亮熄灯”。
这是一个非常适合入门的 Arduino 项目,可以一次性学到:
模拟传感器读取(analogRead)
电阻分压原理
继电器驱动高压/大功率负载
简单的控制逻辑与阈值判断
Arduino UNO Mini × 1
基于 ATmega328P 微控制器;
5V 逻辑电平,板载 USB 接口;
负责采集 LDR 信号、执行控制算法、驱动继电器。
LDR 光敏电阻(约 5 MΩ)× 1
亮:电阻值降低;暗:电阻值升高;
通过与 10k 电阻组成分压,将光照强度转换为电压。
10kΩ 电阻 × 1
与 LDR 组成 电压分压器;
10k 是典型室内光照下比较常用的分压值,能得到合适的 ADC 读数范围。
5V 继电器模块 × 1(如:DFRobot Gravity 5A Relay)
线圈侧使用 Arduino 的 5V 逻辑控制;
触点侧串联在 12V LED 灯带的供电回路中;
提供 电气隔离,保护 Arduino 不直接接触 12V 负载电路。
12V LED 灯带 × 1
项目中的光源负载;
通常需要单独的 12V DC 电源适配器 供电。
12V 电源适配器 × 1
专门为 LED 灯带提供电源;
通过继电器控制灯带的“断/通”;
注意电流能力应匹配灯带功耗。
面包板与若干杜邦线
用于快速搭建原型电路;
连接 Arduino ↔ LDR 分压 ↔ 继电器模块 ↔ 12V 灯带。
热熔胶枪(可选)
用于固定 LDR 位置或整理线材,提升结构可靠性。
LDR 的电阻值会随光强变化:
亮光 → 电阻变小(几千欧甚至更低)
黑暗 → 电阻变大(可达兆欧级)
直接测电阻不方便,因此使用经典的 电压分压电路:
LDR 一端接 5V
LDR 另一端接模拟输入 A0
在 A0 与 GND 之间串接 10k 电阻
形成如下结构:
A0 点的电压随光照变化而变化,Arduino 通过 analogRead(A0) 读到 0–1023 之间的数值,即可反映当前亮度。
为了安全与隔离,LED 灯带不直接由 Arduino 供电,而是:
灯带的 正极(+) 直接接 12V 电源正极;
灯带的 负极(-) 经继电器常开触点 (NO, COM) 串联后接到 12V 电源负极。
典型接法:
当继电器吸合时 NO 与 COM 接通,LED 灯带形成完整回路 → 点亮;
当继电器断开时,回路被切断 → 熄灭。
继电器控制脚连接:
Relay VCC → Arduino 5V
Relay GND → Arduino GND
Relay IN → Arduino 数字引脚 D2
LDR 分压接线
LDR 一脚 → 5V
LDR 另一脚 → A0
10k 电阻一端接 A0,另一端接 GND
继电器模块接线
VCC → 5V
GND → GND
IN → D2(即 RELAY_PIN)
LED 灯带与 12V 电源
灯带 “+” → 12V 适配器 “+”
灯带 “–” → 继电器 COM 接线端
继电器 NO → 12V 适配器 “–”
⚠️ 安全提示:
虽然这里使用的是 12V 低压直流,但依然要注意极性与接线牢固,避免短路。若将来扩展到市电负载(220V AC),必须使用符合安全规范的继电器与布线方式,并做好绝缘防护。
你原文里附带的代码是一个 “按键控制继电器” 示例(BUTTON_PIN + INPUT_PULLUP),非常适合练习继电器控制和防抖。但要实现真正的 “自动白天关灯、夜晚开灯”,我们需要改成读取 LDR 的模拟值,并根据阈值控制继电器。
下面给出一个 基于 LDR 的自动控制完整示例,逻辑为:
读取 A0 模拟值 lightValue;
设置“变暗阈值”和“变亮阈值”,形成简单 迟滞,避免光线波动时灯频繁闪烁;
根据当前状态和光照水平,决定是否吸合/释放继电器。
使用建议:
上传代码后,打开串口监视器(9600 波特率),在不同光照下查看 lightValue 大致范围;
根据实际环境,微调 THRESHOLD_DARK 与 THRESHOLD_LIGHT;
确认继电器模块是否为“低电平触发”,如果不是,将 RELAY_ACTIVE_LOW 改成 false。
你提供的这段代码本身是很好的 继电器 + 按键防抖 教学示例:
使用 INPUT_PULLUP 作为按键输入模式;
在 loop() 中做简单防抖;
用 RELAY_ACTIVE_LOW 适配不同继电器模块的触发逻辑。
这段代码可以作为 “手动开关模式” 或 调试用模式,例如:
先用按键确认继电器和灯带接线无误;
再切换到上面的 LDR 自动模式。
你可以把它单独作为“附录:按键控制继电器示例”放在文章末尾。
单独测试继电器 + 灯带
先使用“按键控制继电器”的简化代码;
手动按键,看灯带是否跟随 ON/OFF;
确认继电器接线、电源极性正确。
测试 LDR 读数
使用一个只做 analogRead(A0) 并 Serial.println() 的小程序;
在明亮、半暗、全暗环境下记录 lightValue;
以实际读数为依据设置 THRESHOLD_DARK / THRESHOLD_LIGHT。
整体联调
上传自动控制代码;
用手遮住 LDR,观察串口显示是否识别为“DARK”并点亮灯带;
用手机手电筒/台灯照向 LDR,观察是否识别为“BRIGHT”并熄灭灯带;
根据实际使用环境微调阈值和延时。
这个 基于 Arduino 的自动昼夜 LED 灯带控制器,在结构上非常简单,却完整涵盖了 IoT 与嵌入式入门所需的多个核心知识点:
传感器(LDR) → 模拟信号采集;
电阻分压与 ADC 读数之间的关系;
继电器驱动高功率负载的安全做法;
状态逻辑 + 阈值 + 迟滞,避免抖动。
在此基础上,你还可以进一步扩展:
使用 电位器 调节“灵敏度”,实时改变阈值;
加入 手动模式/自动模式切换开关;
用 OLED 或 LCD1602 实时显示光照值与当前灯状态;
使用 ESP8266 / ESP32 + Wi-Fi,把光照和灯状态上传到手机 App 或云平台。



0 条