智能日出闹钟:用柔和光线唤醒你的清晨
元件清单
| Arduino Nano R3 | ×1 |
| DS3231 高精度 RTC 模块(带备用电池) | ×1 |
| TRIAC 双向可控硅(如 BT136) | ×1 |
| 4N35 光耦(过零检测) | ×1 |
| MOC3063 光耦(TRIAC 驱动,非过零型) | ×1 |
| 5V 700mA 降压模块(市电转 5V) | ×1 |
| 废旧灯泡底座(E27/E14) | ×1 |
⚠ 高压安全警告
本项目涉及 市电高压(220V/110V),操作不当可导致严重伤害或死亡。请务必:
- 具备模拟电路与高压安全知识
- 调试时使用隔离变压器
- 成品外壳必须绝缘、防触电
- 非专业人员请勿尝试
原理概述
高压侧:相位切割调光
TRIAC 相当于高速开关,通过控制其在每个半周期的导通角度来改变灯泡两端有效电压,实现无级调光。关键在于过零检测:
- 4N35 (U1):检测市电正弦波过零,输出高电平中断单片机
- MOC3063 (U2):隔离驱动 TRIAC,必须选用非过零型,否则无法任意相位触发


低压侧:控制逻辑
- Arduino Nano:核心控制器,运行调光算法与闹钟逻辑
- DS3231 RTC:掉电走时,提供精准 6:00 触发
- 5V 降压模块:从灯座引入市电,为单片机与 RTC 供电
- 光敏电阻(A6):检测环境光,天亮后不再补光

制作步骤
- 灯泡改造: 砸碎废旧灯泡玻璃,保留铝底座,引出两根线焊接至底座触点
- 电路板制作: 在万用板上布局 Nano、RTC、降压模块、光耦、TRIAC 等元件,注意高低压布线隔离(爬电距离 ≥ 4mm)
- 组装入壳: 将电路板固定在灯泡底座内,光敏电阻外露,TRIAC 散热片贴金属外壳
- 上电测试: 先用低压灯泡验证调光波形,再接实用灯泡
核心代码逻辑
#include <TimerOne.h>
#include <RTClib.h>
#define TRIAC_PIN 2
#define ZERO_CROSS_PIN 3
#define LIGHT_SENSOR_PIN A6
#define FREQUENCY_STEP 75 // 50Hz 下每亮度级步进 75µs(60Hz 改 65)
#define CHANGE_DIM_LEVEL_EVERY 1 // 每秒变化一级
#define MAX_DIM_LEVEL 128 // 全灭
#define MIN_DIM_LEVEL 0 // 全亮
#define DARK_THRESHOLD 300 // 光敏电阻阈值
volatile byte triacCounter = 0;
volatile boolean zeroCrossed = false;
byte dimLevel = MIN_DIM_LEVEL;
boolean lightOn = false;
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200);
pinMode(TRIAC_PIN, OUTPUT); digitalWrite(TRIAC_PIN, LOW);
pinMode(ZERO_CROSS_PIN, INPUT);
pinMode(LIGHT_SENSOR_PIN, INPUT);
if (!rtc.begin()) { while(1); }
if (rtc.lostPower()) rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
noInterrupts();
attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossDetected, RISING);
interrupts();
Timer1.initialize(FREQUENCY_STEP);
Timer1.attachInterrupt(triacTimerInterrupt, FREQUENCY_STEP);
}
void loop() {
delay(CHANGE_DIM_LEVEL_EVERY * 1000);
checkAlarmClock();
adjustDimLevel();
debugPrint();
}
void zeroCrossDetected() {
zeroCrossed = true;
triacCounter = 0;
digitalWrite(TRIAC_PIN, LOW);
}
void triacTimerInterrupt() {
if (dimLevel >= MAX_DIM_LEVEL) digitalWrite(TRIAC_PIN, LOW);
else if (dimLevel <= MIN_DIM_LEVEL) digitalWrite(TRIAC_PIN, HIGH);
else if (zeroCrossed) {
if (triacCounter >= dimLevel) { digitalWrite(TRIAC_PIN, HIGH); zeroCrossed = false; }
else triacCounter++;
}
}
void adjustDimLevel() {
if (lightOn && dimLevel > MIN_DIM_LEVEL) dimLevel--;
else if (!lightOn && dimLevel < MAX_DIM_LEVEL) dimLevel++;
}
void checkAlarmClock() {
if (!lightOn && isRoomDark()) {
DateTime now = rtc.now();
if (now.hour() == 6 && now.minute() == 0) lightOn = true;
}
}
boolean isRoomDark() { return analogRead(LIGHT_SENSOR_PIN) < DARK_THRESHOLD; }
void debugPrint() {
Serial.print("lightOn="); Serial.println(lightOn);
Serial.print("dimLevel="); Serial.println(dimLevel);
DateTime now = rtc.now();
Serial.print(now.year()); Serial.print('/'); Serial.print(now.month()); Serial.print('/'); Serial.print(now.day());
Serial.print(' '); Serial.print(now.hour()); Serial.print(':'); Serial.print(now.minute()); Serial.print(':'); Serial.println(now.second());
Serial.print("lightLevel="); Serial.println(analogRead(LIGHT_SENSOR_PIN));
}
工作流程
- 通电自检:灯泡全亮 → 缓慢变暗至熄灭,确认电路正常
- 夜间待机:RTC 计时,光敏电阻监测环境光
- 早晨 6:00:若房间仍暗,启动“日出模式”——约 30 分钟内从 0 亮度渐变至全亮
- 白天/人工开灯:光敏电阻检测到环境光强,停止补光
- 关灯开关断电:装置断电,RTC 靠纽扣电池走时

后续计划
- 接入手机 App(蓝牙/Wi-Fi)自定义唤醒时间、亮度曲线
- 添加温湿度传感器,结合舒适度调节
- 设计 PCB 与防火外壳,提升产品化程度
原理图
包含高压驱动板与低压控制板两张原理图,详见附件图片。
制造工艺