1. 系统架构设计思路
第一次接触STM32和GPRS模块做智能家居系统时,我被各种专业术语搞得一头雾水。后来发现,其实可以把整个系统想象成一个"智能管家":STM32是它的大脑,GPRS模块是它的手机,各种传感器是它的眼睛鼻子。这个管家24小时值班,帮你盯着家里的温湿度、光照,还能远程控制电器开关。
硬件选型上我走了不少弯路。主控芯片最终选定STM32F103R8T6,这款Cortex-M3内核的芯片性价比超高,72MHz主频完全够用,GPIO口也足够连接各种外设。GPRS模块用的是SIM900A,虽然现在4G更流行,但考虑到系统只需要发短信和简单数据传输,GPRS的性价比和稳定性反而更合适。
系统架构可以拆解为五个关键部分:
- 感知层:DHT11温湿度传感器+光敏电阻,相当于系统的感官神经
- 控制层:STM32主控,负责数据处理和逻辑判断
- 通信层:SIM900A模块,实现远程短信控制
- 执行层:继电器组和步进电机,负责开关电器和窗帘
- 交互层:OLED屏幕+按键,提供本地操作界面
2. 硬件电路设计详解
电路设计中最容易出问题的是电源部分。我最初直接用USB供电,结果GPRS模块工作时电流波动导致系统频繁重启。后来改用LM2596稳压模块单独给SIM900A供电,主控和其他传感器共用另一路电源,问题才解决。
传感器接口设计有几个注意点:
- DHT11温湿度传感器只需要一根数据线,但必须接上拉电阻
- 光敏电阻模块输出模拟量和数字量两种信号,模拟量接ADC引脚,数字量接普通GPIO
- SIM900A的TXD/RXD要交叉连接到STM32的串口,记得加电平转换芯片
继电器驱动电路我推荐用ULN2003达林顿阵列,一个芯片能驱动多路继电器,比用三极管省事多了。窗帘电机控制可以用L298N驱动模块,注意要给电机两端加续流二极管。
3. 软件程序设计要点
程序架构采用前后台系统,主循环不断扫描各个功能模块。关键是要处理好这几个任务:
- 定时读取传感器数据(建议每2秒一次)
- 实时监测串口是否有GPRS数据
- 快速响应按键操作
- 及时处理异常报警
短信协议解析是个技术活。我定义的指令格式是"#指令编号 参数",比如:
- "#1 ON" 打开1号继电器
- "#2 OFF" 关闭2号继电器
- "#STATUS" 查询当前状态
温湿度报警逻辑要注意防抖动。我设置的是连续3次检测超标才触发报警,避免临时波动导致误报。报警短信内容要包含具体数值和时间,比如:"警报!当前温度32.5℃,超过阈值30℃"。
4. 系统调试实战经验
第一次通电时OLED没显示,排查发现是I2C地址搞错了。STM32的硬件I2C有点坑,后来改用软件模拟I2C反而更稳定。GPRS模块初始化要按严格时序:
- 先给VCC上电
- 等待1秒再给PWRKEY高电平
- 维持2秒后拉低
- 等待模块注册网络(约30秒)
继电器测试时遇到过诡异现象:明明程序控制断开,电器却还在工作。后来发现是继电器常开常闭接反了,这个坑新手一定要注意。
光照自动窗帘的调试技巧:
- 先用电位器模拟光敏电阻,找到合适的阈值电压
- 测试电机转向是否正确
- 设置合理的延时,避免光照轻微波动导致频繁动作
5. 性能优化与扩展
系统稳定运行后,我又做了几个优化:
- 增加看门狗,防止程序跑飞
- 添加EEPROM存储配置参数
- 实现短信白名单功能,只有授权号码能控制
- 开发微信小程序替代短信控制(需增加ESP8266模块)
如果想扩展更多功能,可以考虑:
- 增加烟雾传感器实现火灾报警
- 接入人体红外传感器实现安防监控
- 添加语音控制模块
- 移植FreeRTOS实现多任务管理
电源管理方面,可以设计锂电池+太阳能充电方案,这样停电时系统还能继续工作。我还试过用SIM900A的TCP/IP功能上传数据到云平台,但GPRS的网络延迟比较大,适合对实时性要求不高的场景。