GSM温度报警系统设计
一、系统概述
基于STM32F103C8T6微控制器,集成DS18B20温度传感器与SIM800L GSM模块,实现温度实时监测、超阈值声光报警、GSM短信/电话报警功能。系统支持用户自定义阈值、低功耗模式,适用于仓库、机房、温室大棚等无人值守场景的温度异常预警。
二、系统架构与硬件设计
1. 系统架构
graph TD
A[DS18B20温度传感器] -->|单总线| B[STM32F103C8T6]
B -->|UART| C[SIM800L GSM模块]
B -->|GPIO| D[声光报警 蜂鸣器+LED]
C -->|GSM网络| E[用户手机]
F[电源模块 5V/3.7V] -->|供电| B
F -->|供电| C
F -->|供电| D
2. 关键硬件组件
| 模块 | 型号/参数 | 功能 |
|---|---|---|
| 主控 | STM32F103C8T6(72MHz,64KB Flash) | 温度采集、逻辑控制、GSM通信 |
| 温度传感器 | DS18B20(数字式,±0.5℃精度) | 单总线通信,采集环境温度(-55~125℃) |
| GSM模块 | SIM800L(850/900/1800/1900MHz) | 发送短信/拨打电话,支持AT指令 |
| 报警模块 | 有源蜂鸣器+红色LED | 本地声光报警(超阈值时触发) |
| 电源 | 5V/2A适配器+3.7V锂电池(备用) | 系统供电,支持断电续航 |
3. 核心电路设计
(1)DS18B20接口电路
- 单总线连接:DQ引脚接STM32的PA0(GPIO,开漏输出),需外接4.7kΩ上拉电阻至3.3V;
- 电源:VDD接3.3V,GND接地,支持寄生电源模式(仅DQ供电,需强上拉)。
(2)SIM800L接口电路
- UART通信:TXD接STM32的PA9(USART1_TX),RXD接PA10(USART1_RX),波特率115200bps;
- 控制信号:PWRKEY接PB0(低电平3秒开机),STATUS接PB1(高电平表示模块就绪);
- 电源:VCC接5V(需2A以上电流,加1000μF电容滤波),GND接地。
(3)声光报警电路
- 蜂鸣器:通过S8050三极管驱动,基极接PB5(GPIO输出);
- LED:串联1kΩ电阻接PB6(GPIO输出),阳极接3.3V。
三、软件设计(C语言实现)
1. 主程序流程
#include "stm32f10x.h"
#include "ds18b20.h"
#include "sim800l.h"
#include "alarm.h"
#include "delay.h"
// 系统配置
#define TEMP_HIGH_THRESHOLD 30.0f // 高温阈值(℃)
#define TEMP_LOW_THRESHOLD 0.0f // 低温阈值(℃)
#define PHONE_NUMBER "+8613800138000" // 报警手机号
#define CHECK_INTERVAL 5000 // 检测间隔(ms)
int main(void) {
// 初始化硬件
System_Init(); // 时钟、GPIO、UART
DS18B20_Init(); // 温度传感器初始化
SIM800L_Init(); // GSM模块初始化
Alarm_Init(); // 声光报警初始化
float current_temp = 0.0f;
uint8_t alarm_flag = 0;
while (1) {
// 1. 读取温度
current_temp = DS18B20_ReadTemp();
// 2. 判断阈值
if (current_temp > TEMP_HIGH_THRESHOLD || current_temp < TEMP_LOW_THRESHOLD) {
if (!alarm_flag) { // 首次超阈值
// 3. 触发报警
Alarm_Trigger(); // 本地声光报警
SIM800L_SendSMS(PHONE_NUMBER, "温度异常! 当前:%.1f℃", current_temp); // 发送短信
// SIM800L_Call(PHONE_NUMBER); // 可选: 拨打电话
alarm_flag = 1;
}
} else {
if (alarm_flag) { // 恢复正常
Alarm_Reset(); // 停止声光报警
SIM800L_SendSMS(PHONE_NUMBER, "温度恢复! 当前:%.1f℃", current_temp);
alarm_flag = 0;
}
}
// 4. 低功耗管理(空闲时休眠)
if (!alarm_flag) {
Enter_Sleep_Mode(CHECK_INTERVAL);
} else {
Delay_ms(CHECK_INTERVAL); // 报警时持续检测
}
}
}
2. 关键模块实现
(1)DS18B20温度传感器驱动
// DS18B20单总线驱动(STM32 HAL库)
#include "ds18b20.h"
#include "stm32f10x_gpio.h"
#define DQ_PIN GPIO_Pin_0
#define DQ_PORT GPIOA
// 初始化
void DS18B20_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = DQ_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DQ_PORT, &GPIO_InitStruct);
GPIO_SetBits(DQ_PORT, DQ_PIN); // 初始高电平
}
// 单总线写1字节
void DS18B20_WriteByte(uint8_t data) {
for (int i=0; i<8; i++) {
GPIO_ResetBits(DQ_PORT, DQ_PIN); // 拉低开始写时隙
Delay_us(2);
if (data & 0x01) GPIO_SetBits(DQ_PORT, DQ_PIN); // 写1
else GPIO_ResetBits(DQ_PORT, DQ_PIN); // 写0
Delay_us(60); // 保持时隙
GPIO_SetBits(DQ_PORT, DQ_PIN); // 释放总线
data >>= 1;
}
}
// 单总线读1字节
uint8_t DS18B20_ReadByte(void) {
uint8_t data = 0;
for (int i=0; i<8; i++) {
GPIO_ResetBits(DQ_PORT, DQ_PIN); // 拉低开始读时隙
Delay_us(2);
GPIO_SetBits(DQ_PORT, DQ_PIN); // 释放总线
Delay_us(8);
if (GPIO_ReadInputDataBit(DQ_PORT, DQ_PIN)) data |= 0x01 << i; // 读1
Delay_us(50); // 完成读时隙
}
return data;
}
// 读取温度(℃)
float DS18B20_ReadTemp(void) {
uint8_t temp_l, temp_h;
int16_t temp;
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动转换
Delay_ms(750); // 等待转换完成
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读暂存器
temp_l = DS18B20_ReadByte(); // 低8位
temp_h = DS18B20_ReadByte(); // 高8位
temp = (temp_h << 8) | temp_l;
return temp * 0.0625f; // 转换为℃
}
(2)SIM800L GSM模块驱动
// SIM800L AT指令驱动(STM32 HAL库)
#include "sim800l.h"
#include "usart.h" // STM32 UART驱动
// 发送AT指令并等待响应
uint8_t SIM800L_SendAT(const char* cmd, const char* expect, uint32_t timeout) {
USART_SendString(USART1, cmd); // 发送指令(如"AT\r\n")
return WaitForResponse(expect, timeout); // 等待期望响应(如"OK")
}
// 初始化模块
void SIM800L_Init(void) {
// 1. 检查模块是否就绪
while (SIM800L_SendAT("AT\r\n", "OK", 1000) != 0);
// 2. 设置短信模式(Text模式)
SIM800L_SendAT("AT+CMGF=1\r\n", "OK", 1000);
// 3. 设置字符集(UTF-8)
SIM800L_SendAT("AT+CSCS=\"UCS2\"\r\n", "OK", 1000);
// 4. 检查信号强度(>10表示正常)
SIM800L_SendAT("AT+CSQ\r\n", "+CSQ:", 1000);
}
// 发送短信
void SIM800L_SendSMS(const char* phone, const char* fmt, float temp) {
char cmd[128], sms_content[64];
sprintf(sms_content, fmt, temp); // 格式化内容(如"温度异常! 当前:30.5℃")
// 1. 设置接收方号码
sprintf(cmd, "AT+CMGS=\"%s\"\r\n", phone);
USART_SendString(USART1, cmd);
Delay_ms(100);
// 2. 发送短信内容
USART_SendString(USART1, sms_content);
Delay_ms(100);
// 3. 发送结束符(Ctrl+Z, ASCII 26)
USART_SendData(USART1, 26);
WaitForResponse("OK", 5000); // 等待发送完成
}
// 拨打电话
void SIM800L_Call(const char* phone) {
char cmd[32];
sprintf(cmd, "ATD%s;\r\n", phone);
SIM800L_SendAT(cmd, "OK", 1000);
Delay_ms(10000); // 通话10秒后挂断
SIM800L_SendAT("ATH\r\n", "OK", 1000); // 挂断
}
(3)声光报警控制
// 声光报警驱动
#include "alarm.h"
#include "stm32f10x_gpio.h"
#define BUZZER_PIN GPIO_Pin_5
#define BUZZER_PORT GPIOB
#define LED_PIN GPIO_Pin_6
#define LED_PORT GPIOB
// 初始化
void Alarm_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 蜂鸣器
GPIO_InitStruct.GPIO_Pin = BUZZER_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(BUZZER_PORT, &GPIO_InitStruct);
// LED
GPIO_InitStruct.GPIO_Pin = LED_PIN;
GPIO_Init(LED_PORT, &GPIO_InitStruct);
GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN);
GPIO_ResetBits(LED_PORT, LED_PIN);
}
// 触发报警(声光)
void Alarm_Trigger(void) {
GPIO_SetBits(BUZZER_PORT, BUZZER_PIN); // 蜂鸣器响
GPIO_SetBits(LED_PORT, LED_PIN); // LED亮
}
// 停止报警
void Alarm_Reset(void) {
GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN);
GPIO_ResetBits(LED_PORT, LED_PIN);
}
参考代码 GSM温度报警系统设计 www.youwenfan.com/contentcss/160956.html
四、系统测试与优化
1. 测试指标
| 参数 | 指标 | 测试方法 |
|---|---|---|
| 温度测量精度 | ±0.5℃(-10~50℃) | 恒温箱对比标准温度计 |
| 报警响应时间 | ≤5秒(超阈值后) | 人为改变温度,记录报警触发时间 |
| 短信发送成功率 | ≥99%(信号良好时) | 连续发送10条短信,统计成功次数 |
| 续航时间 | ≥72小时(锂电池供电) | 3.7V/2000mAh电池,测量工作电流 |
2. 优化方向
- 低功耗:空闲时STM32进入Stop模式(电流<10μA),通过定时器唤醒(如每5分钟检测一次);
- 抗干扰:DS18B20数据线加10kΩ上拉电阻,SIM800L电源加TVS管防静电;
- 多阈值:通过短信指令(如"SET:25,5")远程设置高/低温阈值;
- 历史记录:用STM32内部Flash存储最近100条温度数据,通过短信查询。
五、总结
本设计基于STM32+DS18B20+SIM800L实现了低成本、高可靠的GSM温度报警系统,核心功能包括温度采集、超阈值声光报警、GSM远程通知。系统通过C语言驱动各模块,代码简洁、易移植,可扩展为多节点温度监测网络(通过GSM模块组网)。