1. 项目概述与核心设计思路
这个基于GSM模块的风速温湿度多路采集系统,是我去年指导电子工程专业学生完成的毕业设计项目。系统采用主从机分布式架构,通过ZigBee实现无线组网,最终实现了环境参数的实时监测、阈值报警和远程短信通知功能。整套方案成本控制在300元以内,特别适合农业大棚、仓库监控等需要多点监测的场景。
系统最核心的创新点在于将传统有线传感器网络升级为无线物联网架构。两个从机节点分别搭载DHT11温湿度传感器和风速检测模块,通过ZigBee与主机通信。主机采用STM32F103C6T6作为主控,集成OLED显示屏、蜂鸣器和SIM800C GSM模块,构成了完整的监测报警终端。实测表明,在50米半径范围内,系统可以实现98%以上的数据传输成功率。
关键设计指标:
- 温度测量范围:0-50℃ ±2℃
- 湿度测量范围:20-90%RH ±5%
- 风速测量范围:0-30m/s ±0.5m/s
- ZigBee传输距离:室内50米/室外100米
- GSM短信响应延迟:<15秒
2. 硬件设计与关键器件选型
2.1 主控芯片选择
我们对比了三种常见方案:
- STM32F103C6T6:72MHz主频,32KB Flash,性价比最高
- ATmega328P:20MHz主频,资源有限但功耗低
- ESP32:双核240MHz,自带WiFi但成本较高
最终选择STM32主要基于三点考虑:
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 充足的GPIO数量(37个)满足多模块连接需求
- 成熟的开发环境和库函数支持
2.2 传感器模块选型
温湿度传感器
测试了三种常见型号:
- DHT11:±2℃精度,响应慢但价格仅5元
- DHT22:±0.5℃精度,价格25元
- SHT30:±0.3℃精度,I2C接口,价格40元
考虑到成本因素选择DHT11,实际使用中发现需注意:
- 每次采集间隔需>1秒
- DATA线必须接5.1K上拉电阻
- 长期使用建议做防潮处理
风速传感器
选用FS300A三杯式风速传感器,关键参数:
- 量程:0-30m/s
- 输出:0.4-2V模拟信号
- 启动风速:0.5m/s
信号处理电路需要:
- LM358搭建电压跟随器
- 10uF电容滤波
- STM32的ADC采样(12位分辨率)
2.3 无线通信方案
ZigBee模块选用XBEE S2C,配置要点:
c复制// ZigBee参数设置
ATID 1234 // 网络ID
ATDL 5678 // 目标地址
ATBD 4 // 波特率115200
ATWR // 保存配置
实测中发现两个优化点:
- 天线应远离金属物体至少5cm
- 主机和从机最好使用相同固件版本
3. 系统软件设计详解
3.1 主机程序架构
采用前后台系统设计,主循环处理显示和用户输入,中断处理通信和报警:
c复制void main() {
hardware_init();
while(1) {
oled_show_data();
key_scan();
if(alarm_flag) {
buzzer_alert();
gsm_send_sms();
}
}
}
void USART1_IRQHandler() {
if(USART_GetITStatus(USART1, USART_IT_RXNE)) {
zigbee_rx_buf[rx_cnt++] = USART_ReceiveData(USART1);
}
}
3.2 从机程序设计
从机采用状态机设计,每2秒采集一次数据:
c复制enum {SAMPLE, SEND, SLEEP} state;
void main() {
while(1) {
switch(state) {
case SAMPLE:
dht11_read();
adc_read_wind();
state = SEND;
break;
case SEND:
zigbee_send_data();
state = SLEEP;
break;
case SLEEP:
delay_ms(2000);
state = SAMPLE;
break;
}
}
}
3.3 关键算法实现
风速计算公式
c复制float calc_wind_speed(float voltage) {
// FS300A转换公式:Vout = 0.00488*风速 + 0.3
return (voltage - 0.3) / 0.00488;
}
温湿度校验算法
c复制uint8_t check_dht11(uint8_t *data) {
uint8_t sum = data[0] + data[1] + data[2] + data[3];
return (sum == data[4]); // 校验第五位校验和
}
4. 系统调试与优化实录
4.1 常见问题排查
问题1:ZigBee通信不稳定
- 现象:数据丢包率>30%
- 排查:
- 用逻辑分析仪抓取串口波形
- 发现电源纹波达200mV
- 解决:
- 增加100uF钽电容滤波
- 修改天线安装位置
问题2:GSM模块无法注册网络
- 现象:SIM800C返回"ERROR"
- 排查:
- 检查APN设置
- 测量模块供电电流(峰值需>2A)
- 解决:
- 更换4.7uF+100uF组合电容
- 添加2000mAh锂电池作为备用电源
4.2 性能优化技巧
-
低功耗优化:
- 从机采集间隔从1秒改为2秒
- 启用STM32的Stop模式
- 实测电流从25mA降至8mA
-
显示刷新优化:
c复制void oled_refresh() {
static uint8_t refresh_cnt;
if(++refresh_cnt > 5) { // 每5次主循环刷新1次
oled_show();
refresh_cnt = 0;
}
}
- 报警防抖处理:
c复制if(sensor_value > threshold) {
if(++alarm_cnt > 3) { // 连续3次超阈值才报警
trigger_alarm();
}
} else {
alarm_cnt = 0;
}
5. 完整电路设计与制作要点
5.1 PCB设计注意事项
-
布局原则:
- GSM模块远离模拟信号线
- ZigBee天线伸出板外
- 传感器接口做防插反设计
-
布线要点:
- 数字地和模拟地单点连接
- 晶振走线尽量短且包地
- 电源线宽≥0.5mm
-
典型电路:
code复制[风速信号调理电路]
Vin --[10k]--+--[LM358]--> ADC
|
[0.1uF]
5.2 焊接与组装
-
焊接顺序:
- 电源电路
- 最小系统
- 通信模块
- 传感器接口
-
调试步骤:
- 上电测试5V/3.3V电压
- 烧录测试程序
- 逐个模块验证
-
外壳设计:
- 从机采用IP65防水盒
- 主机开散热孔
- 天线位置预留开口
6. 项目扩展与改进方向
在实际部署后,我们发现了几个值得改进的方向:
-
太阳能供电方案:
- 6V/5W太阳能板
- TP4056充电管理
- 18650电池组
-
数据持久化存储:
c复制void save_to_flash() {
FLASH_Unlock();
FLASH_ProgramHalfWord(0x0800F000, data);
FLASH_Lock();
}
- 云端监控扩展:
- 改用ESP32+MQTT协议
- 接入阿里云IoT平台
- 开发微信小程序
这个项目最让我满意的部分是它的可靠性——在连续三个月的田间测试中,系统始终保持稳定运行。对于初学者来说,我建议先从主机部分开始调试,逐步添加从机和通信功能。遇到问题时,多用逻辑分析仪抓取时序波形,这往往比串口打印更直接有效。