GSM温度报警系统设计(C语言实现)

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接口电路

(2)SIM800L接口电路

(3)声光报警电路

三、软件设计(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+DS18B20+SIM800L实现了低成本、高可靠的GSM温度报警系统,核心功能包括温度采集、超阈值声光报警、GSM远程通知。系统通过C语言驱动各模块,代码简洁、易移植,可扩展为多节点温度监测网络(通过GSM模块组网)。

专注于matlab/simulink,电子电路,编程