1. 项目背景与核心需求
去年夏天有次出门忘关空调,回家发现电费单直接爆表。作为一个嵌入式开发老鸟,我决定自己动手解决这个痛点——用最便宜的硬件实现家电远程控制。这个方案的核心诉求就三点:低成本(整套控制在100元内)、低功耗(待机电流<10mA)、强兼容(能适配90%以上的老式家电)。
传统智能家居方案要么贵(某米生态链设备),要么需要改造线路(智能开关)。我的思路是:利用现有家电的红外遥控功能+物理按键触发,通过GSM短信指令控制继电器模块,实现非侵入式改造。实测下来,这套系统稳定运行8个月,累计接收指令1200+次零失误。
2. 硬件选型与电路设计
2.1 主控芯片方案对比
最终选择STC15W408AS单片机,理由很实在:
- 价格仅3.5元/片,支持宽电压(2.4V-5.5V)
- 内置看门狗和EEPROM,省去外围电路
- 实测待机电流仅6mA(关闭ADC和PWM时)
淘汰方案包括STM32F030(成本过高)和ESP8266(功耗太大)。这里有个坑:早期用STC89C52时,发现GSM模块启动瞬间的电流尖峰会导致MCU复位,后来在电源输入端加了470μF电解电容才解决。
2.2 GSM模块选型实战
SIM800L是性价比之王(某宝28元包邮),但要注意:
- 必须使用独立电源(建议2A输出)
- 天线位置要远离继电器(干扰会导致信号衰减10dB)
- 修改AT指令超时时间为15秒(默认5秒容易超时)
我的参数配置:
arduino复制AT+CMGF=1 // 文本模式
AT+CNMI=2,2,0,0 // 新短信直接输出
AT+CLIP=1 // 来电显示
2.3 继电器驱动电路设计
控制空调需要16A继电器,但普通开发板上的继电器模块驱动电流不够。改进方案:
- 用S8050三极管放大驱动信号
- 在继电器线圈两端反向并联1N4148二极管
- 触点两端并联0.1μF电容防火花
实测电路图:
code复制MCU GPIO -> 1K电阻 -> S8050基极
|
V
继电器线圈 -> +12V电源
3. 核心功能实现细节
3.1 红外学习与重放
老空调的红外编码用NEC协议,用VS1838B接收头抓取编码时发现:
- 不同品牌的引导码长度不同(美的4.5ms,格力5ms)
- 重复码间隔需要精确到微秒级
存储方案优化:
c复制struct IR_Code {
uint16_t leader_on;
uint16_t leader_off;
uint32_t custom_code;
uint32_t data_code;
uint8_t repeat_count;
} __attribute__((packed));
3.2 短信指令解析算法
考虑到老年父母的使用习惯,指令设计极简:
- 开空调:"KT ON"
- 关空调:"KT OFF"
- 煮饭:"DG 30"(30分钟后断电)
解析时要用状态机处理UTF-8编码,关键代码:
c复制while(Serial.available()) {
char c = Serial.read();
if(c == '\r') continue;
if(c == '\n') {
parseSMS(buffer);
memset(buffer, 0, sizeof(buffer));
ptr = 0;
} else {
buffer[ptr++] = c;
}
}
3.3 电源管理策略
为降低待机功耗,采取以下措施:
- GSM模块每小时唤醒1次检查短信
- 红外发射管仅在发送时供电
- 关闭MCU所有未用外设
实测功耗对比:
| 模式 | 电流 | 持续时间 |
|---|---|---|
| 待机 | 6mA | 持续 |
| 短信接收 | 80mA | 2秒 |
| 继电器动作 | 150mA | 0.5秒 |
4. 踩坑实录与优化方案
4.1 信号干扰问题
初期测试时发现:当继电器动作时,GSM模块会掉线。解决方案:
- 在继电器线圈两端并联压敏电阻(10D471K)
- GSM天线远离继电器至少10cm
- 电源输入端加π型滤波电路(100μF+0.1μF)
4.2 红外编码丢失
存储的空调编码偶尔会丢失,原因是:
- STC单片机EEPROM有写入次数限制(10万次)
- 频繁保存会提前损坏存储区
优化方案:
c复制void saveIRCode() {
static uint8_t write_count = 0;
if(++write_count > 10) { // 每10次变更才实际写入
EEPROM_write(addr, &code, sizeof(code));
write_count = 0;
}
}
4.3 短信延迟处理
某次测试发现指令延迟达5分钟,排查发现:
- SIM卡欠费时运营商会有缓存
- 基站拥塞会导致短信排队
加入心跳检测机制:
arduino复制void checkNetwork() {
sendAT("AT+CSQ");
if(!waitResponse("+CSQ:")) {
restartGSM();
}
}
5. 成品优化与扩展功能
5.1 外壳设计与安全防护
用3mm亚克力板激光切割制作外壳,特别注意:
- 开孔位置避开天线辐射区
- 继电器高压部分用热缩管包裹
- 增加温控开关(60℃自动断电)
5.2 状态反馈增强
升级版增加了状态回传功能:
- 执行成功后自动回复短信
- 加入RTC芯片记录操作时间
- 电压检测提醒更换电池
回复短信模板:
code复制[设备状态]
空调:已开启
电饭煲:剩余12分钟
电量:78%
最后操作:2023-08-20 14:30
5.3 多设备联动方案
通过级联315MHz射频模块,实现:
- 一个主机控制多个从机
- 射频编码采用滚动码加密
- 中继模式扩展控制距离
硬件连接示意图:
code复制GSM主机 --RF--> 从机1 --IR--> 空调
|
+--> 从机2 --Relay--> 电饭煲
这个项目最让我自豪的是老父亲现在每天午睡前会用老年机发"KT ON",再也不用满屋子找遥控器了。整套系统物料成本仅92元,比买智能空调省了至少2000块。最近正在尝试加入语音识别模块,等调试稳定了再来分享新版方案。