【毕业设计】基于STM32的冷链温湿度监测与报警系统设计(DS18B20+GPS+GSM短信+上位机)
本文设计了一套基于STM32F103C8T6的冷链运输监测系统,通过DS18B20和SHT30传感器采集箱内温湿度数据,结合NEO-6M GPS模块获取位置信息。系统采用本地蜂鸣器告警和SIM800C GSM短信报警双重机制,并通过串口将数据传输至上位机进行实时监控和数据存储。系统实现了冷链运输过程中的环境参数采集、异常报警、位置追踪等功能,解决了传统方案中远程告警缺失、数据记录不完整等问题。硬件

一、项目概述
1.1 课题背景
冷链运输最大的难点,不在“采集数据”,而在“采集到异常后能不能及时处理”。像药品、疫苗、生鲜、乳制品这些场景,对温度波动都比较敏感,一旦运输箱温度超限,可能直接造成整批货物失效。
传统冷链监控方案常见问题有:
- 只做本地温度显示,没有远程告警能力
- 数据记录不完整,后期追溯困难
- 只采集温度,不关注湿度和运输位置
- 断网或长距离运输场景下,监控链路不稳定
所以,这类毕业设计不能只停留在“温度传感器 + LCD 显示”层面,而是要把 多参数采集、超限报警、定位、通信、数据管理 串起来,形成完整系统。
本文设计一套基于 STM32F103C8T6 的冷链运输监测系统,结合 DS18B20、SHT30、NEO-6M GPS、SIM800C GSM 模块、蜂鸣器、继电器和上位机监控软件,实现运输箱体内部环境采集、越限报警、位置回传和历史记录管理。
1.2 设计目标
- 实时采集冷链箱内温度与湿度
- 对温度超限、湿度异常、箱门开启等状态进行报警
- 通过 GSM 短信向管理员发送异常通知
- 通过 GPS 获取当前位置和时间信息
- 在上位机中显示实时曲线与历史记录
1.3 主要功能
- 温度、湿度周期采集与本地显示
- 上下限阈值设置与本地蜂鸣器告警
- GSM 短信异常通知
- GPS 经纬度解析与运输轨迹记录
- 串口上传到上位机,完成数据可视化和日志存储
- 断电恢复后自动继续运行,保证运输过程连续记录
二、技术选型
| 模块 | 选型 | 说明 |
|---|---|---|
| 主控芯片 | STM32F103C8T6 | 通用性强,接口资源满足项目需求 |
| 温度采集 | DS18B20 | 单总线通信,精度较高,适合冷链场景 |
| 湿度采集 | SHT30 | I2C 接口,测量稳定 |
| 定位模块 | NEO-6M | 常见 GPS 模块,资料多、调试方便 |
| 短信报警 | SIM800C | 支持 AT 指令,适合异常短信通知 |
| 显示模块 | OLED / LCD1602 | 显示实时温湿度、定位和告警状态 |
| 报警模块 | 蜂鸣器 + LED | 本地声光告警 |
| 上位机 | Python + PyQt5 | 便于做曲线和历史查询 |
| 存储方式 | SQLite / CSV | 轻量记录,易导出分析 |
三、系统总体架构
3.1 架构分层
整个系统可以拆成三个层次:
- 感知层:DS18B20、SHT30、门磁开关采集箱体状态
- 通信层:GPS 负责定位,SIM800C 负责短信告警,串口负责上传到 PC
- 应用层:上位机负责界面显示、报警记录、历史查询和轨迹管理
整体链路如下:
DS18B20/SHT30/门磁
↓
STM32 数据采集处理
↓
本地显示 + 蜂鸣器告警
↓
GPS 定位解析 / GSM 短信报警
↓
串口上传到上位机
↓
实时曲线 + 历史存储 + 异常记录
3.2 数据管理思路
为了让系统更像一个完整毕设,建议把数据流分成三路:
- 本地路:OLED 显示当前状态,便于现场调试
- 应急路:短信报警,确保异常时能第一时间通知
- 管理路:串口上位机存档,便于后续复盘和出图
3.3 报警策略
报警逻辑可以设计得稍微完整一些:
- 温度高于上限或低于下限时触发告警
- 湿度超限时给出预警,但优先级低于温度报警
- 箱门开启时间过长时追加安全提醒
- 同一类报警在短时间内只发送一次短信,避免轰炸
四、硬件设计
4.1 硬件组成
| 组件 | 数量 | 作用 |
|---|---|---|
| STM32F103C8T6 | 1 | 系统核心控制器 |
| DS18B20 | 1~2 | 采集冷链箱内温度 |
| SHT30 | 1 | 采集箱内湿度 |
| NEO-6M | 1 | 位置与时间获取 |
| SIM800C | 1 | 发送短信告警 |
| OLED | 1 | 本地显示 |
| 蜂鸣器 | 1 | 本地声响告警 |
| 门磁开关 | 1 | 检测箱门开闭状态 |
| 按键 | 2~3 | 模式切换与阈值设置 |
4.2 典型引脚设计
| 功能 | STM32 引脚 |
|---|---|
| DS18B20 数据口 | PA1 |
| SHT30 I2C | PB6 / PB7 |
| GPS 串口 | PA9 / PA10 |
| SIM800C 串口 | PB10 / PB11 |
| 蜂鸣器 | PB12 |
| 门磁输入 | PA8 |
| OLED I2C | PB6 / PB7 |
4.3 硬件实现注意事项
- SIM800C 发短信时电流脉冲较大,供电必须稳,建议单独降压
- DS18B20 数据线需要 4.7k 上拉
- GPS 天线位置尽量避开金属遮挡,否则室内冷链箱测试可能不容易定位
- 如果箱体是金属外壳,模块布局要考虑射频影响
五、STM32 软件实现
5.1 程序模块划分
固件可拆分为以下模块:
ds18b20.c:温度采集sht30.c:湿度采集gps_parse.c:NMEA 数据解析gsm.c:AT 指令封装与短信发送alarm.c:告警状态机oled_ui.c:界面刷新protocol.c:上位机数据上传协议
5.2 主循环逻辑
while (1)
{
temp = DS18B20_ReadTemp();
SHT30_ReadData(&humi);
door_state = HAL_GPIO_ReadPin(DOOR_GPIO_Port, DOOR_Pin);
GPS_ParseFrame();
Alarm_Process(temp, humi, door_state);
OLED_ShowRealtime(temp, humi, latitude, longitude, alarm_state);
Upload_Frame(temp, humi, latitude, longitude, alarm_state);
HAL_Delay(1000);
}
5.3 温度超限判断
void Alarm_Process(float temp, float humi, uint8_t door)
{
alarm_state = 0;
if (temp > temp_high_limit || temp < temp_low_limit)
{
alarm_state |= 0x01;
}
if (humi > humi_high_limit)
{
alarm_state |= 0x02;
}
if (door == 1 && temp > temp_high_limit)
{
alarm_state |= 0x04;
}
if (alarm_state)
{
Buzzer_On();
GSM_TrySendAlarmSMS(temp, humi, alarm_state);
}
else
{
Buzzer_Off();
}
}
这段逻辑适合写进文章的原因很简单:它把“采集数据”和“业务判断”分开了,代码层次更清晰,答辩时也更容易解释。
5.4 DS18B20 采样示例
float DS18B20_ReadTemp(void)
{
uint8_t temp_l, temp_h;
int16_t raw;
DS18B20_Start();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
HAL_Delay(750);
DS18B20_Start();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
temp_l = DS18B20_ReadByte();
temp_h = DS18B20_ReadByte();
raw = (temp_h << 8) | temp_l;
return raw / 16.0f;
}
5.5 GSM 短信发送示例
void GSM_TrySendAlarmSMS(float temp, float humi, uint8_t state)
{
static uint32_t last_send_tick = 0;
char sms[128];
if (HAL_GetTick() - last_send_tick < 300000)
{
return;
}
sprintf(sms, "ColdChain Alarm! T=%.1fC H=%.1f%% State=%d", temp, humi, state);
GSM_SendSMS(\"13800138000\", sms);
last_send_tick = HAL_GetTick();
}
5.6 上位机上传协议
建议采用固定字段格式,便于上位机解析:
T=3.6,H=68.2,LAT=31.2304,LON=121.4737,DOOR=0,ALARM=1
六、上位机设计
6.1 界面模块建议
一个能拿得出手的毕业设计上位机,至少要有这些区域:
- 实时数据显示区
- 温湿度曲线区
- 当前位置信息区
- 报警日志区
- 阈值设置区
6.2 Python 串口解析示例
def parse_frame(frame: str):
data = {}
for item in frame.strip().split(','):
key, value = item.split('=')
data[key] = value
return data
6.3 日志入库表设计
CREATE TABLE cold_chain_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
temperature REAL,
humidity REAL,
latitude REAL,
longitude REAL,
door_state INTEGER,
alarm_state INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
七、系统调试与问题处理
7.1 DS18B20 温度偶发异常
常见原因:
- 单总线时序不稳定
- 线太长,干扰大
- 上拉电阻取值不合适
建议:
- 优先缩短连线
- 校验 CRC
- 对异常值做一次剔除,避免直接触发短信报警
7.2 SIM800C 发短信失败
重点排查:
- SIM 卡状态是否正常
- 天线连接是否可靠
- 电源是否能承受发射瞬时电流
- AT 指令返回值是否正确处理
7.3 GPS 无法快速定位
这是冷链项目里很常见的问题,特别是室内测试时。建议:
- 先在室外完成定位调试
- 答辩演示时可提前缓存最近一次定位
- 若只是演示链路,也可以把 GPS 数据解析和历史轨迹作为辅助亮点展示
7.4 报警短信重复发送
如果没有做节流,系统会在连续超温时不断发送短信。解决方式:
- 设置最小发送间隔
- 增加“进入报警态才发一次”的状态机
- 恢复正常后再允许下一次报警触发
八、测试方案
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| 温度超限报警 | 加热传感器附近环境 | 蜂鸣器响起并触发短信 |
| 湿度异常 | 人为制造高湿环境 | 上位机显示预警状态 |
| 门磁联动 | 打开箱门 | 状态位变化并记录日志 |
| GPS 定位 | 室外通电测试 | 获取经纬度信息 |
| 串口上传 | 连接上位机持续运行 | 曲线连续刷新、日志正常入库 |
九、总结与可扩展方向
这套基于 STM32 的冷链温湿度监测系统,适合毕业设计的核心原因在于,它把“传感器采集”升级成了“面向实际运输场景的监测闭环”:
- 有环境采集,体现硬件基础
- 有 GSM 告警,体现异常处理
- 有 GPS 定位,体现项目完整度
- 有上位机可视化,体现系统集成能力
后续可以进一步扩展:
- 接入 4G MQTT 平台,替代短信方案
- 增加 SD 卡本地断点存储
- 增加多点温度探头,监测箱体不同区域
- 增加制冷机继电器控制,形成监测 + 控制闭环
如果你也在做 STM32 毕业设计、冷链监测、温湿度报警系统、GSM 短信告警、GPS 运输监控 相关项目,这个题目很适合整理成 CSDN 技术文章、开题报告或者论文实现章节。后续如果需要,我也可以继续补:
- 开题报告版本
- 论文正文版本
- 完整 HAL 工程代码版本
- PyQt5 上位机界面版本
更多推荐



所有评论(0)