1. 项目概述
这个红外遥控电灯亮度调节器的设计源于日常生活中一个常见痛点:每次想要调整灯光亮度时,都需要走到开关面板前手动操作。特别是在晚上已经躺下后,或者双手正忙着其他事情时,这种不便尤为明显。
红外遥控技术在家电控制领域已有成熟应用,但将其应用于普通照明系统的DIY改造却鲜有详细指导。本项目通过一个简单可靠的电路设计,实现了对普通LED灯具的无线亮度调节功能。整套系统成本控制在50元以内,且不需要对原有灯具进行破坏性改造。
提示:本项目适用于220V交流供电的LED灯具改造,改造前请确保灯具功率不超过设计负载(建议50W以内)。
2. 核心电路设计
2.1 系统架构解析
整个系统由三个主要模块构成:
- 红外接收模块:负责解码遥控器信号
- 控制处理模块:根据指令生成PWM调光信号
- 功率驱动模块:将控制信号转换为灯具可接受的电力输出
我选择了以下核心元器件:
- 红外接收头:VS1838B(兼容NEC协议)
- 主控芯片:ATtiny85(8位AVR单片机)
- 功率开关:BT136三端双向可控硅
- 过零检测:PC817光耦
这种组合在保证功能完整性的同时,将BOM成本压缩到了最低。特别是ATtiny85虽然资源有限,但用于这种单一功能控制绰绰有余,而且可以直接通过Arduino IDE开发,大大降低了开发门槛。
2.2 关键电路详解
2.2.1 红外接收电路
VS1838B的输出直接连接ATtiny85的PB2引脚。这个接收头自带38kHz载波解调功能,能有效抑制环境光干扰。实际测试中,即使在阳光直射的环境下,3米内的遥控信号仍能可靠接收。
arduino复制// 红外接收引脚定义
#define IR_PIN PB2
2.2.2 过零检测电路
使用PC817光耦配合4.7kΩ限流电阻实现交流过零检测。这个设计有两个重要作用:
- 为PWM调光提供同步基准
- 确保可控硅在电压过零点触发,最大限度减少射频干扰
注意:过零检测电路的220V侧必须做好绝缘处理,建议使用热缩管完全包裹焊接点。
2.2.3 可控硅驱动电路
BT136的触发电流仅需5mA,可以直接由ATtiny85的IO口驱动。但在实际布线时,我发现如果驱动线过长(>10cm),容易引入干扰导致误触发。后来在门极串联了100Ω电阻并就近放置0.1μF电容到MT1端,问题得到解决。
3. 软件实现
3.1 PWM调光算法
采用相位角控制方式实现调光,具体通过检测过零信号后延迟触发时间来调节导通角。延迟时间与亮度关系如下表:
| 延迟时间(ms) | 导通角 | 相对亮度 |
|---|---|---|
| 0 | 180° | 100% |
| 2 | 144° | 80% |
| 4 | 108° | 60% |
| 6 | 72° | 40% |
| 8 | 36° | 20% |
实际代码中,使用定时器1的输入捕获功能精确测量过零时刻:
arduino复制void setup() {
// 定时器1初始化
TCCR1 = 0;
GTCCR = 0;
TIMSK = _BV(TOIE1); // 溢出中断使能
}
3.2 红外协议解码
针对常见的NEC协议,我优化了解码算法以适应ATtiny85有限的资源。关键技巧包括:
- 使用状态机代替中断嵌套
- 利用微秒级延时函数测量脉冲宽度
- 采用查表法验证用户码
实测这个方案在8MHz时钟下,仅占用不到1KB的Flash空间。以下是核心解码逻辑:
arduino复制uint32_t irDecode() {
while(digitalRead(IR_PIN)); // 等待起始高电平
// 测量引导脉冲
uint16_t startLow = pulseIn(IR_PIN, LOW, 30000);
if(startLow < 13000) return 0; // 无效信号
// 解码32位数据
uint32_t result = 0;
for(uint8_t i=0; i<32; i++) {
uint16_t lowTime = pulseIn(IR_PIN, LOW, 5000);
uint16_t highTime = pulseIn(IR_PIN, HIGH, 5000);
if(lowTime > 1000) result |= (1UL << i);
}
return result;
}
4. 制作与调试
4.1 PCB布局要点
手工制版时发现几个关键经验:
- 交流侧与直流侧要明确分区,两者间距至少保持5mm
- 红外接收头要伸出外壳,但引脚要尽量短
- 可控硅的散热片需要与PCB保持距离
我最终采用的布局方案是:
- 将高压元件集中在板子一侧
- 使用开槽方式增加爬电距离
- 在红外接收头位置开窗
4.2 系统校准步骤
-
过零检测校准:
- 用示波器同时监测交流输入和检测输出
- 调整限流电阻使光耦输出方波边沿对齐交流过零点
-
调光线性度校准:
- 连接标准负载(如40W白炽灯)
- 测量各亮度档位的实际功率
- 微调延时参数使亮度变化均匀
-
遥控距离测试:
- 在不同环境光条件下测试最远可靠距离
- 必要时调整接收头前的滤光片
5. 常见问题解决
5.1 灯具闪烁问题
现象:调至低亮度时灯具出现明显闪烁
排查步骤:
- 检查过零检测电路是否正常
- 确认PWM频率不低于100Hz
- 测试可控硅是否在过零点附近触发
解决方案:
- 在软件中设置最小导通时间(我设为1ms)
- 在输出端并联0.47μF/400V电容
5.2 遥控响应迟钝
现象:按键后需要多次按压才有反应
可能原因:
- 电源滤波不足导致MCU复位
- 红外接收头供电不稳
- 环境光干扰严重
我的改进方案:
- 在MCU的VCC端增加100μF电解电容
- 为红外接收头单独增加78L05稳压
- 在接收头前加装深红色滤光片
5.3 可控硅异常发热
现象:工作一段时间后可控硅温度明显升高
检查重点:
- 散热片安装是否到位
- 负载是否超过额定值
- 触发脉冲是否足够
最终发现是触发脉冲宽度不足导致不完全导通。通过在软件中将触发脉冲从20μs延长到50μs,温度下降了约15℃。
6. 功能扩展思路
基础版本实现后,可以考虑以下增强功能:
-
记忆功能:保存最后一次设置的亮度
arduino复制#include <EEPROM.h> void saveBrightness(uint8_t level) { EEPROM.write(0, level); } -
渐变调光:亮度平滑过渡
arduino复制void fadeTo(uint8_t target) { while(current != target) { current += (current<target) ? 1 : -1; setBrightness(current); delay(30); } } -
多设备控制:通过不同用户码区分
只需在解码时增加用户码判断逻辑即可支持多个遥控器独立控制不同灯具
这个项目最让我惊喜的是它的实用性远超预期。经过三个月日常使用,系统运行非常稳定,而且家人都反馈灯光调节变得非常方便。特别是在冬天,不用离开温暖的被窝就能关灯,这种小改进带来的幸福感提升确实令人意外。
