基于 Arduino 的自动昼夜 LED 灯带控制器设计
1. 项目概述:让灯自己知道“天黑了”
本项目实现了一个 自动灯光控制系统:
当环境变暗时,Arduino 自动打开 12V LED 灯带;
当环境光线变亮时,又自动关闭灯带。
系统核心特性:
利用 LDR 光敏电阻 感知环境亮度;
通过 电压分压电路 将光强转换为可测电压;
使用 Arduino UNO Mini 读取光强并做逻辑判断;
通过 5V 继电器模块 控制 12V LED 灯带通断;
无需按键、无需人为干预,实现 全自动“天黑亮灯,天亮熄灯”。
这是一个非常适合入门的 Arduino 项目,可以一次性学到:
模拟传感器读取(
analogRead)电阻分压原理
继电器驱动高压/大功率负载
简单的控制逻辑与阈值判断
2. 硬件清单与功能说明
2.1 主要元件
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 位置或整理线材,提升结构可靠性。
3. 工作原理与电路设计
3.1 LDR 光敏电阻与电压分压
LDR 的电阻值会随光强变化:
亮光 → 电阻变小(几千欧甚至更低)
黑暗 → 电阻变大(可达兆欧级)
直接测电阻不方便,因此使用经典的 电压分压电路:
LDR 一端接 5V
LDR 另一端接模拟输入 A0
在 A0 与 GND 之间串接 10k 电阻
形成如下结构:
5V ── LDR ── A0 ── 10k ── GND
A0 点的电压随光照变化而变化,Arduino 通过 analogRead(A0) 读到 0–1023 之间的数值,即可反映当前亮度。
3.2 继电器控制 12V LED 灯带
为了安全与隔离,LED 灯带不直接由 Arduino 供电,而是:
灯带的 正极(+) 直接接 12V 电源正极;
灯带的 负极(-) 经继电器常开触点 (NO, COM) 串联后接到 12V 电源负极。
典型接法:
12V 电源 + ───── LED Strip + 12V 电源 - ── Relay NO Relay COM ───── LED Strip -
当继电器吸合时 NO 与 COM 接通,LED 灯带形成完整回路 → 点亮;
当继电器断开时,回路被切断 → 熄灭。
继电器控制脚连接:
Relay VCC → Arduino 5V
Relay GND → Arduino GND
Relay IN → Arduino 数字引脚 D2
4. 硬件连接步骤(汇总)
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),必须使用符合安全规范的继电器与布线方式,并做好绝缘防护。
5. 软件实现:自动昼夜判断逻辑
你原文里附带的代码是一个 “按键控制继电器” 示例(BUTTON_PIN + INPUT_PULLUP),非常适合练习继电器控制和防抖。但要实现真正的 “自动白天关灯、夜晚开灯”,我们需要改成读取 LDR 的模拟值,并根据阈值控制继电器。
下面给出一个 基于 LDR 的自动控制完整示例,逻辑为:
读取 A0 模拟值
lightValue;设置“变暗阈值”和“变亮阈值”,形成简单 迟滞,避免光线波动时灯频繁闪烁;
根据当前状态和光照水平,决定是否吸合/释放继电器。
5.1 自动昼夜控制示例代码(推荐)
// Automatic Day-Night LED Strip Controller Using Arduino
// 硬件:Arduino UNO Mini + LDR + 10k 电阻 + 5V 继电器 + 12V LED 灯带
// 功能:环境变暗 → 自动打开 LED 灯带;环境变亮 → 自动关闭 LED 灯带
const int LDR_PIN = A0; // LDR 分压中间点接 A0
const int RELAY_PIN = 2; // 继电器控制引脚
// 注意:很多继电器模块是“低电平触发”(active LOW)
// 如果是低电平触发,请设为 true;如果是高电平触发,设为 false
const bool RELAY_ACTIVE_LOW = true;
// 根据实测光线情况调节:值越大代表越暗
// 这里用两个阈值实现简单迟滞:
// - 当 lightValue > THRESHOLD_DARK 时认为“够暗,可以开灯”
// - 当 lightValue < THRESHOLD_LIGHT 时认为“够亮,可以关灯”
const int THRESHOLD_DARK = 700; // 暗环境阈值(示例值)
const int THRESHOLD_LIGHT = 600; // 亮环境阈值(示例值)
bool lightOn = false; // 当前灯状态
void setRelay(bool on) {
if (RELAY_ACTIVE_LOW) {
digitalWrite(RELAY_PIN, on ? LOW : HIGH);
} else {
digitalWrite(RELAY_PIN, on ? HIGH : LOW);
}
}
void setup() {
Serial.begin(9600);
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// 启动时默认关闭灯带
lightOn = false;
setRelay(lightOn);
Serial.println("Automatic Day-Night LED Strip Controller");
Serial.println("Cover the LDR to turn the LED strip ON.");
}
void loop() {
int lightValue = analogRead(LDR_PIN); // 读取 0~1023
// 简单迟滞控制
if (!lightOn && lightValue > THRESHOLD_DARK) {
// 环境足够暗且当前灯是关的 → 开灯
lightOn = true;
setRelay(lightOn);
Serial.print("LightValue: ");
Serial.print(lightValue);
Serial.println(" -> DARK, LED Strip ON");
} else if (lightOn && lightValue < THRESHOLD_LIGHT) {
// 环境足够亮且当前灯是开的 → 关灯
lightOn = false;
setRelay(lightOn);
Serial.print("LightValue: ");
Serial.print(lightValue);
Serial.println(" -> BRIGHT, LED Strip OFF");
}
// 调试输出
Serial.print("Current LightValue: ");
Serial.println(lightValue);
delay(200); // 简单节流,避免串口刷屏
}使用建议:
上传代码后,打开串口监视器(9600 波特率),在不同光照下查看
lightValue大致范围;根据实际环境,微调
THRESHOLD_DARK与THRESHOLD_LIGHT;确认继电器模块是否为“低电平触发”,如果不是,将
RELAY_ACTIVE_LOW改成false。
6. 原始“按键控制继电器”代码的定位
你提供的这段代码本身是很好的 继电器 + 按键防抖 教学示例:
使用
INPUT_PULLUP作为按键输入模式;在
loop()中做简单防抖;用
RELAY_ACTIVE_LOW适配不同继电器模块的触发逻辑。
这段代码可以作为 “手动开关模式” 或 调试用模式,例如:
先用按键确认继电器和灯带接线无误;
再切换到上面的 LDR 自动模式。
你可以把它单独作为“附录:按键控制继电器示例”放在文章末尾。
7. 测试方法与调试步骤
单独测试继电器 + 灯带
先使用“按键控制继电器”的简化代码;
手动按键,看灯带是否跟随 ON/OFF;
确认继电器接线、电源极性正确。
测试 LDR 读数
使用一个只做
analogRead(A0)并Serial.println()的小程序;在明亮、半暗、全暗环境下记录
lightValue;以实际读数为依据设置
THRESHOLD_DARK / THRESHOLD_LIGHT。整体联调
上传自动控制代码;
用手遮住 LDR,观察串口显示是否识别为“DARK”并点亮灯带;
用手机手电筒/台灯照向 LDR,观察是否识别为“BRIGHT”并熄灭灯带;
根据实际使用环境微调阈值和延时。
8. 小结与扩展方向
这个 基于 Arduino 的自动昼夜 LED 灯带控制器,在结构上非常简单,却完整涵盖了 IoT 与嵌入式入门所需的多个核心知识点:
传感器(LDR) → 模拟信号采集;
电阻分压与 ADC 读数之间的关系;
继电器驱动高功率负载的安全做法;
状态逻辑 + 阈值 + 迟滞,避免抖动。
在此基础上,你还可以进一步扩展:
使用 电位器 调节“灵敏度”,实时改变阈值;
加入 手动模式/自动模式切换开关;
用 OLED 或 LCD1602 实时显示光照值与当前灯状态;
使用 ESP8266 / ESP32 + Wi-Fi,把光照和灯状态上传到手机 App 或云平台。












评论