在这里插入图片描述

一、项目概述

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 上位机界面版本
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐