Arduino光控夜灯:Proteus仿真、代码详解与硬件实现全流程
Arduino 光控自动夜灯:从 Proteus 仿真到硬件落地的完整教程
本项目基于 Arduino UNO + LDR 分压 + BC547 三极管驱动继电器,实现环境光照度低于阈值自动点亮灯具、高于阈值自动熄灭。包含原理图、PCB 要点、Arduino 代码、Proteus 仿真步骤,适合嵌入式入门与自动化控制教学。
1. 系统框图与信号流
[LDR+10kΩ分压] → [Arduino A3 ADC采样 0~1023] → [软件阈值比较] → [D12 输出 HIGH/LOW] → [BC547 放大] → [5V继电器线圈] → [220V灯具通断]
2. 硬件清单与关键参数
| 元件 | 规格 | 选型要点 |
|---|---|---|
| Arduino UNO | ATmega328P, 5V/16MHz | 官方板或兼容板,建议 DIP-28 封装便于维修 |
| LDR | GM55, 暗阻 1MΩ, 亮阻 10kΩ | 分压电阻 10kΩ 匹配量程,ADC 值跨度大 |
| 分压电阻 | 10kΩ 1% 金属膜 | 精度 1% 提升阈值一致性 |
| BC547 | NPN, Ic=100mA, Vceo=45V, hFE=110-800 | 基极串联 1kΩ 限流,集电极驱动继电器线圈 |
| 继电器模块 | 5V 低电平触发, 光耦隔离, 接点 10A/250VAC | 含续流二极管、指示 LED、端子排,接线安全 |
| 续流二极管 | 1N4007 (若模块未集成) | 并联线圈两端,吸收反向感应电压保护三极管 |
3. 原理图与 PCB 关键点

- 分压电路:LDR 接 VCC (5V),10kΩ 接 GND,中点接 A3。亮→电压高,暗→电压低;
- 驱动级:D12 → 1kΩ → BC547 基极,发射极接地,集电极接继电器线圈一端,线圈另端接 5V;
- 强弱电隔离:继电器模块自带光耦隔离,PCB 上强弱电区域物理分槽 ≥ 4mm,走线加粗 (≥1mm);
- 去耦电容:Arduino 5V/GND、继电器 VCC/GND 根部各加 100μF 电解 || 0.1μF 陶瓷;
- 测试点:预留 A3、D12、继电器线圈两端测试点,便于示波器/万用表调试。
4. Arduino 代码 (含滞回比较、串口调试、看门狗)
#include <avr/wdt.h>
const uint8_t LDR_PIN = A3;
const uint8_t RELAY_PIN = 12;
const uint16_t THRESHOLD_ON = 300; // 暗态 ADC 值,约 1.47V (9V*300/1023) → 继电器吸合
const uint16_t THRESHOLD_OFF = 350; // 亮态 ADC 值,滞回 50 码防抖
uint16_t adcVal;
bool lampState = false;
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // 低电平触发模块,LOW=导通
wdt_enable(WDTO_2S); // 2s 看门狗防死机
}
void loop() {
wdt_reset();
adcVal = analogRead(LDR_PIN);
Serial.print("ADC: "); Serial.println(adcVal);
if (!lampState && adcVal < THRESHOLD_ON) { // 灭→亮
digitalWrite(RELAY_PIN, HIGH); // 模块低电平触发,HIGH=断开?需确认模块极性!
lampState = true;
Serial.println("LAMP ON");
} else if (lampState && adcVal > THRESHOLD_OFF) { // 亮→灭
digitalWrite(RELAY_PIN, LOW);
lampState = false;
Serial.println("LAMP OFF");
}
delay(500); // 降低采样频率,减少串口输出
}
⚠ 关键修正:代码中 `digitalWrite(RELAY_PIN, HIGH)` 对应“灯亮”假设模块为**高电平触发**。若模块为**低电平触发** (常见),逻辑需取反。请实测模块 IN 引脚悬空/接高/接低时的通断状态,修正代码逻辑。
5. Proteus 仿真全流程
- 安装 Proteus 8.10+ 与 Arduino IDE 1.8+;
- Proteus 元件库搜索:`ARDUINO UNO`、`LDR`、`RELAY`、`BC547`、`RES`、`CAP`、`VOLTAGE_PROBE`;
- 按原理图接线,**LDR 属性**设置:`LIGHT_LEVEL` 绑定滑块 (0~1000 Lux),`RESISTANCE_DARK=1M`,`RESISTANCE_LIGHT=10K`;
- Arduino 属性 → `Program File` 填入编译生成的 `.hex` 路径 (IDE: 文件→首选项→勾选“编译”和“上传”详细输出,编译后控制台最后一行即路径);
- 运行仿真,拖动 LDR 光照滑块,观察:
- 虚拟示波器/电压探针监测 A3 电压、D12 电平、继电器线圈电流;
- 终端窗口打印 ADC 值与状态切换日志; - 验证滞回逻辑:光照 300→350→300 循环,继电器仅动作一次,无抖动。
6. 硬件调试与阈值标定
- 上电,打开串口监视器 (9600),记录不同时刻 ADC 值:
正午阳光: ______
室内办公: ______
黄昏/阴天: ______
全黑/遮挡: ______ - 选取“黄昏值”与“全黑值”中点作为 `THRESHOLD_ON`,`THRESHOLD_OFF = THRESHOLD_ON + 30~50`;
- 实测继电器动作声、灯具亮灭,连续运行 24h 观察稳定性。
7. 进阶功能扩展
- PWM 调光:将继电器改为 MOSFET (IRLZ44N) + PWM (D9/D10),实现亮度平滑过渡;
- RTC 定时 + 光控双模式:DS3231 模块,设定“日落后/日出前”强制开关,节能更智能;
- NB-IoT/LoRa 远程上报:BC95/RA-02 模块,上报开关状态、光照曲线、故障告警;
- 光伏供电:TP4056 充电 + 18650 电池 + 5V 升压,实现零布线部署。
结语: 本项目完整覆盖了“传感-采样-判决-执行”控制闭环,代码引入滞回比较与看门狗提升工程鲁棒性,Proteus 仿真验证逻辑正确性,硬件标定落地真实环境。掌握此流程,可快速迁移至温控、液位、气体等各类阈值型自动化项目。
工业技术
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- Arduino Uno WiFi 网页服务器:通过浏览器控制 LED 开关
- Arduino 自动化 Chrome 恐龙游戏 - LDR 光敏电阻 + Python 实现全自动跳跃
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY
- Arduino + OpenCV 实时人脸追踪云台系统
- WARAN 家庭自动化套件:树莓派 + Arduino + nRF24L01+ 模块化设计
- 自动换刀装置(ATC)工作原理与选型应用全解析
- 制造商如何利用自动化规模化电商履约