新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于 Arduino 的自动昼夜 LED 灯带控制器设计

基于 Arduino 的自动昼夜 LED 灯带控制器设计

作者: 时间:2025-11-14 来源: 收藏


1. 项目概述:让灯自己知道“天黑了”

本项目实现了一个 自动灯光控制系统
当环境变暗时,Arduino 自动打开 12V LED 灯带;
当环境光线变亮时,又自动关闭灯带。

系统核心特性:

  • 利用 LDR 光敏电阻 感知环境亮度;

  • 通过 电压分压电路 将光强转换为可测电压;

  • 使用 Arduino UNO Mini 读取光强并做逻辑判断;

  • 通过 5V 继电器模块 控制 12V LED 灯带通断;

  • 无需按键、无需人为干预,实现 全自动“天黑亮灯,天亮熄灯”

这是一个非常适合入门的 Arduino 项目,可以一次性学到:

  • 模拟传感器读取(analogRead

  • 电阻分压原理

  • 继电器驱动高压/大功率负载

  • 简单的控制逻辑与阈值判断


2. 硬件清单与功能说明

2.1 主要元件

  1. Arduino UNO Mini × 1

    • 基于 ATmega328P 微控制器;

    • 5V 逻辑电平,板载 USB 接口;

    • 负责采集 LDR 信号、执行控制算法、驱动继电器。

  2. LDR 光敏电阻(约 5 MΩ)× 1

    • 亮:电阻值降低;暗:电阻值升高;

    • 通过与 10k 电阻组成分压,将光照强度转换为电压。

  3. 10kΩ 电阻 × 1

    • 与 LDR 组成 电压分压器

    • 10k 是典型室内光照下比较常用的分压值,能得到合适的 ADC 读数范围。

  4. 5V 继电器模块 × 1(如:DFRobot Gravity 5A Relay)

    • 线圈侧使用 Arduino 的 5V 逻辑控制;

    • 触点侧串联在 12V LED 灯带的供电回路中;

    • 提供 电气隔离,保护 Arduino 不直接接触 12V 负载电路。

  5. 12V LED 灯带 × 1

    • 项目中的光源负载;

    • 通常需要单独的 12V DC 电源适配器 供电。

  6. 12V 电源适配器 × 1

    • 专门为 LED 灯带提供电源;

    • 通过继电器控制灯带的“断/通”;

    • 注意电流能力应匹配灯带功耗。

  7. 面包板与若干杜邦线

    • 用于快速搭建原型电路;

    • 连接 Arduino ↔ LDR 分压 ↔ 继电器模块 ↔ 12V 灯带。

  8. 热熔胶枪(可选)

    • 用于固定 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. 硬件连接步骤(汇总)

  1. LDR 分压接线

  • LDR 一脚 → 5V

  • LDR 另一脚 → A0

  • 10k 电阻一端接 A0,另一端接 GND

  1. 继电器模块接线

  • VCC → 5V

  • GND → GND

  • IN → D2(即 RELAY_PIN

  1. 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_DARKTHRESHOLD_LIGHT

  • 确认继电器模块是否为“低电平触发”,如果不是,将 RELAY_ACTIVE_LOW 改成 false


6. 原始“按键控制继电器”代码的定位

你提供的这段代码本身是很好的 继电器 + 按键防抖 教学示例:

  • 使用 INPUT_PULLUP 作为按键输入模式;

  • loop() 中做简单防抖;

  • RELAY_ACTIVE_LOW 适配不同继电器模块的触发逻辑。

这段代码可以作为 “手动开关模式”调试用模式,例如:

  • 先用按键确认继电器和灯带接线无误;

  • 再切换到上面的 LDR 自动模式。

你可以把它单独作为“附录:按键控制继电器示例”放在文章末尾。


7. 测试方法与调试步骤

  1. 单独测试继电器 + 灯带

    • 先使用“按键控制继电器”的简化代码;

    • 手动按键,看灯带是否跟随 ON/OFF;

    • 确认继电器接线、电源极性正确。

  2. 测试 LDR 读数

    • 使用一个只做 analogRead(A0)Serial.println() 的小程序;

    • 在明亮、半暗、全暗环境下记录 lightValue

    • 以实际读数为依据设置 THRESHOLD_DARK / THRESHOLD_LIGHT

  3. 整体联调

    • 上传自动控制代码;

    • 用手遮住 LDR,观察串口显示是否识别为“DARK”并点亮灯带;

    • 用手机手电筒/台灯照向 LDR,观察是否识别为“BRIGHT”并熄灭灯带;

    • 根据实际使用环境微调阈值和延时。


8. 小结与扩展方向

这个 基于 Arduino 的自动昼夜 LED 灯带控制器,在结构上非常简单,却完整涵盖了 IoT 与嵌入式入门所需的多个核心知识点:

  • 传感器(LDR) → 模拟信号采集;

  • 电阻分压与 ADC 读数之间的关系;

  • 继电器驱动高功率负载的安全做法;

  • 状态逻辑 + 阈值 + 迟滞,避免抖动。

在此基础上,你还可以进一步扩展:

  • 使用 电位器 调节“灵敏度”,实时改变阈值;

  • 加入 手动模式/自动模式切换开关

  • OLED 或 LCD1602 实时显示光照值与当前灯状态;

  • 使用 ESP8266 / ESP32 + Wi-Fi,把光照和灯状态上传到手机 App 或云平台。



关键词: DIY

评论


相关推荐

技术专区

关闭