1. 项目背景与核心需求
去年夏天的一个深夜,我出差在外突然想起家里空调没关。这个场景让我萌生了制作远程控制家电装置的想法。经过三个月的业余时间折腾,终于实现了通过短信指令控制空调、电饭煲等家电的功能。这个方案最大的特点是不依赖WiFi网络,使用GSM模块实现全国范围的远程控制。
核心需求很明确:
- 必须支持非智能家电(传统红外遥控空调、机械开关电饭煲)
- 控制指令传输不受家庭网络环境影响
- 设备成本控制在200元以内
- 待机功耗要低(长期插电使用)
2. 硬件选型与电路设计
2.1 主控芯片选择
对比了三种常见方案:
- STM32F103C8T6(72MHz Cortex-M3)
- ESP8266(WiFi功能冗余)
- 51单片机(性能不足)
最终选择STM32原因:
- 丰富的外设接口(3个USART、2个SPI)
- 充足的Flash(64KB)和RAM(20KB)
- 低功耗模式下电流仅2μA
- 开发社区资源丰富
注意:购买时认准"ST"原厂标志,市场上流通的国产兼容芯片稳定性较差。
2.2 GSM模块选型
测试了三种主流模块:
| 型号 | 价格 | 待机电流 | 网络支持 | AT指令响应时间 |
|---|---|---|---|---|
| SIM800L | 35元 | 12mA | 2G | 200-500ms |
| SIM7000C | 120元 | 8mA | 4G | 100-300ms |
| A7670C | 85元 | 15mA | 4G | 300-800ms |
选择SIM800L的考量:
- 控制家电不需要高速网络
- 2G网络覆盖更广(特别是农村地区)
- 成本优势明显
2.3 继电器电路设计
家电控制采用两级隔离设计:
- 光耦隔离(EL357)
- 电磁继电器(HF32F)
关键参数计算:
- 空调额定电流10A,预留3倍余量选用30A继电器
- 继电器线圈驱动电流=5V/400Ω=12.5mA
- STM32 GPIO输出能力20mA,可直接驱动
电路保护措施:
- 继电器线圈并联1N4148续流二极管
- 强电走线与其他线路保持5mm间距
- 使用阻燃等级V0的PCB板材
3. 软件实现细节
3.1 AT指令交互框架
设计状态机处理GSM模块通信:
c复制typedef enum {
GSM_IDLE,
GSM_AT_READY,
GSM_NET_REGISTERED,
GSM_SMS_READY
} gsm_state_t;
void GSM_StateMachine(void) {
static gsm_state_t state = GSM_IDLE;
switch(state) {
case GSM_IDLE:
if(SendATCmd("AT", "OK", 1000)) {
state = GSM_AT_READY;
}
break;
// 其他状态处理...
}
}
短信解析采用正则表达式匹配:
c复制bool ParseSMS(char* msg) {
regex_t regex;
regcomp(®ex, "CTRL:(ON|OFF),DEV:(AC|RICE)", REG_EXTENDED);
return regexec(®ex, msg, 0, NULL, 0) == 0;
}
3.2 红外编码学习
空调遥控采用红外学习方案:
- 使用VS1838B红外接收头
- 38kHz载波采样
- 脉冲宽度编码存储
关键代码片段:
c复制void TIM2_IRQHandler(void) {
static uint32_t lastFall = 0;
if(TIM_GetITStatus(TIM2, TIM_IT_CC1)) {
uint32_t curr = TIM_GetCapture1(TIM2);
pulseWidths[pulseIdx++] = curr - lastFall;
lastFall = curr;
if(pulseIdx >= MAX_PULSES) pulseIdx = 0;
}
}
3.3 低功耗优化
待机功耗从初始设计的45mA降至3.8mA:
- 关闭未用外设时钟(ADC、I2C)
- GSM模块设置慢速休眠模式
- STM32进入STOP模式,RTC唤醒
- 电源管理芯片采用TPS63020(效率95%)
4. 典型问题与解决方案
4.1 短信指令延迟
现象:发送指令后5-10分钟才响应
排查过程:
- 用AT+CSQ检查信号强度(应>15)
- 测试不同运营商SIM卡(移动响应最快)
- 发现模块天线焊点虚焊
解决方案:
- 改用外置弹簧天线
- 在PCB增加天线净空区
- 添加AT+COPS=0自动选网指令
4.2 继电器误触发
现象:上电瞬间继电器会抖动
根本原因:
- 单片机IO上电状态不确定
- 继电器驱动三极管基极缺少下拉电阻
改进措施:
- 增加10kΩ下拉电阻
- 软件初始化时先置低电平
- 继电器电源与逻辑电源分开上电
4.3 红外学习失败
常见错误:
- 采样频率设置错误(应用38kHz)
- 接收头供电电压不稳(需5V±5%)
- 环境光干扰(避免阳光直射)
调试技巧:
- 用手机摄像头观察红外发射管
- 缩短学习距离至10cm内
- 先学习简单的电视遥控码测试
5. 成品测试数据
连续30天稳定性测试结果:
| 指标 | 测试值 |
|---|---|
| 平均响应时间 | 8.7秒 |
| 指令成功率 | 98.3% |
| 待机功耗 | 3.8mA@220V |
| 极端温度测试 | -20℃~60℃正常 |
实际应用案例:
- 出差时提前开启空调
- 煮饭时远程关闭电饭煲
- 定时控制鱼缸照明
- 紧急切断所有电器电源
这个项目最让我惊喜的是GSM模块的可靠性——即使在信号很弱的农村地区,只要有一格信号就能正常工作。不过要提醒的是,千万别用这个系统控制电热水器这类高危电器,安全永远是第一位的。
