基于单片机汽车少儿安全预警系统
文章目录
- 一、前言
- 1.1 项目介绍
- 【1】项目开发背景
- 【2】设计实现的功能
- 【3】项目硬件模块组成
- 【4】设计意义
- 【5】市面上同类产品研究现状
- 【6】摘要
- 1.2 设计思路
- 1.3 系统功能总结
- 1.4 开发工具的选择
- 【1】设备端开发
- 【2】上位机开发
- 1.5 模块的技术详情介绍
- 1.6 框架图
- 框架图说明:
- 二、代码设计思路
- 1. **温度传感器 (DHT11)**
- 2. **人体检测传感器 (海凌科24G毫米波雷达模块 LD2402)**
- 3. **蜂鸣器 (高电平触发)**
- 4. **GSM模块 (Air780e)**
- 5. **按键模块**
- 6. **电源管理 (12V直流电源模块)**
- 7. **主控制流程**
- 8. **液晶显示 (OLED 显示屏)**
- 三、短信发送
- 1. **air780e.h**
- 2. **air780e.c**
- 说明:
- 四、STM32主代码
一、前言
1.1 项目介绍
【1】项目开发背景
随着社会经济的不断发展和人们生活水平的提高,汽车已经成为许多家庭日常出行的重要交通工具。尤其是对于有小孩的家庭,家长们往往会在驾驶过程中把儿童留在车内,尤其是在高温天气下,车内温度迅速上升可能会对儿童的身体健康构成严重威胁。由于儿童的身体调节能力较差,长时间暴露在车内高温环境下可能引发中暑、脱水等危险,甚至会造成生命威胁。因此,设计一个针对汽车儿童安全的预警系统显得尤为重要。
传统的安全措施主要依赖家长的记忆与判断,但是随着日常生活节奏的加快,家长可能会忘记车内的儿童,或者误判车内环境。针对这一问题,基于单片机的汽车儿童安全预警系统应运而生。该系统结合温度传感器和人体检测传感器,能够实时监测车内的温度,并判断车内是否有儿童存在。一旦车内温度超过设定阈值,并且传感器检测到有儿童在车内时,系统将通过蜂鸣器报警并通过GSM模块发送短信提醒车主,确保家长及时注意到孩子的安全问题。
该项目不仅仅关注技术实现,还将考虑到人机交互的易用性,用户能够根据实际需求调整温度阈值,同时可以手动关闭报警系统。此外,系统还设置了短信发送的间隔时间,避免了重复报警的情况,保证了系统的稳定性和可靠性。整体来看,该系统的开发旨在通过智能化手段提高儿童在车内的安全性,减少因疏忽造成的安全事故,充分体现了现代智能硬件技术在提升生活质量中的重要作用。
测试模型
【2】设计实现的功能
- 实时监控车内温度,并判断是否超过设定的高温阈值。
- 人体检测传感器检测车内是否有儿童,并与温度数据结合判断是否触发报警。
- 系统当检测到高温且有儿童时,通过蜂鸣器报警。
- 系统通过GSM模块向车主发送警报短信,提醒车主车内有儿童且温度过高。
- 用户可以通过系统设置温度阈值,以自定义报警条件。
- 用户可以手动关闭报警,并确保在非报警状态下,系统不会继续触发。
- 系统设置间隔时间,避免GSM模块持续发送短信,防止频繁报警。
【3】项目硬件模块组成
- STM32单片机 (STM32F103RCT6):负责整个系统的控制与逻辑判断。
- 温度传感器 (DHT11):实时检测车内温度,并与设定的阈值进行比较。
- 人体检测传感器 (海凌科的24G毫米波雷达模块 LD2402):检测车内是否有儿童存在。
- 蜂鸣器 (高电平触发):报警装置,用于温度过高且有儿童时发出声音提示。
- GSM模块 (Air780e):负责发送短信报警至车主手机。
- 按键模块:用于手动关闭报警。
- 电源模块 (12V直流电源):为系统提供稳定电源。
- 液晶显示屏 (0.96寸OLED):用于显示当前温度与报警状态,提供人机交互界面。
【4】设计意义
本项目的设计意义在于提高汽车安全性,特别是对于有儿童的家庭。在高温天气条件下,将儿童遗忘在车内可能会导致严重的安全事故,甚至危及生命。车内温度迅速上升,儿童在车内的耐受能力较差,可能引发中暑、脱水等危险。设计一个针对这一问题的预警系统,可以有效减少此类安全隐患,确保儿童在车内的安全。
传统的汽车安全预警系统主要集中在车主驾驶过程中可能发生的事故预警,而忽视了车内儿童的安全问题。通过引入温度传感器和人体检测传感器的组合,能够实时监控车内温度并判断是否有儿童存在,极大提升了系统的智能化和准确性。该系统在实际应用中,不仅可以减少家长因疏忽造成的安全事故,还能在温度过高时及时发出警报,提醒家长采取措施,避免危险发生。
此外,该系统通过GSM模块发送短信报警,确保家长即便不在车旁也能够及时收到提醒。这种远程提醒功能进一步提升了系统的实用性和安全性。用户还可以根据需求设置温度阈值和手动关闭报警,使系统更加灵活和适应不同场景。总的来说,项目的设计意义不仅在于解决现实生活中的安全隐患,还能提升社会对儿童安全问题的重视,推动智能硬件技术在日常生活中的广泛应用。
【5】市面上同类产品研究现状
- Safety 1st Car Seat Alarm(美国)
- 功能方案:通过压力传感器(安装在座椅下方)检测儿童重量,配合蓝牙连接手机APP。若家长离开车辆超出安全距离(>10米),APP触发警报。
- 局限性:依赖手机蓝牙信号,无温度监测功能,需额外手动关闭报警。
- 市场反馈:亚马逊评分4.1/5(售价$29.99),用户抱怨误报率高(如放置重物触发)。
- Cybex Sirona S i-Size安全座椅 + SensorSafe技术
- 功能方案:集成在安全座椅卡扣中的传感器,通过蓝牙连接车载系统。若儿童被遗忘且车辆熄火,车内喇叭鸣响,并通过手机APP推送通知。
- 创新点:无需额外设备,直接整合至座椅结构。
- 痛点:仅检测卡扣状态,无法识别高温风险(需用户选配温度模块,额外$45)。
- Volvo汽车原厂系统(欧盟标配)
- 功能方案:通过车内毫米波雷达(60GHz频段)探测生命体征(呼吸动作),结合空调温控数据。若检测到活体且温度>35°C,自动鸣笛+闪灯,并通过Volvo On Call服务推送短信至车主。
- 优势:原厂深度集成,误报率<1%。
- 局限:仅支持2020年后新款车型,无法后装加配。
- Munchkin Brica Baby Alert(便携式方案)
- 功能方案:后装悬挂式设备,结合超声波传感器(检测儿童移动)和温度探头(-10°C~60°C)。触发报警后通过内置SIM卡发送短信至3个预设号码。
- 缺陷:需年付$60服务费(SIM卡流量),高温报警阈值固定(38°C不可调)。
- 国内电商方案(淘宝/京东常见款)
- 典型配置:
- 主控:ESP8266(低成本WiFi方案)
- 传感器:热释电红外(PIR) + DS18B20温度探头
- 报警方式:本地蜂鸣器 + 微信小程序推送
- 问题:
- PIR传感器易受阳光干扰(夏季误报率>30%)
- 无主动关闭功能,依赖断电重启
- 网络依赖性强(地下车库失效)
- 典型配置:
【6】摘要
随着汽车的普及,儿童在车内的安全问题逐渐成为社会关注的焦点。高温天气下,儿童长时间被遗忘在车内,车内温度迅速上升可能导致中暑、脱水等危险,严重时甚至威胁生命。为了解决这一问题,本项目设计了一种基于单片机的汽车儿童安全预警系统。该系统通过温度传感器实时监测车内温度,通过人体检测传感器判断车内是否有儿童。一旦车内温度超过设定的阈值且有儿童存在,系统将触发蜂鸣器报警并通过GSM模块向车主发送短信提醒。用户可以根据需求设置温度阈值,并具有手动关闭报警的功能。此外,系统通过设置短信发送间隔,避免了频繁报警的情况。该项目的实现有效提高了儿童在车内的安全性,减少了因家长疏忽导致的危险事故,具有重要的社会意义和应用价值。
关键字
汽车安全、儿童预警系统、温度传感器、人体检测传感器、GSM模块、蜂鸣器、实时监测、安全报警
1.2 设计思路
本项目的设计思路主要围绕着通过传感器的实时数据监控,结合预警机制来确保儿童在车内的安全。首先,系统通过温度传感器实时监测车内温度。当车内温度超过设定的高温阈值时,系统会触发预警机制,保障车内人员的安全。为了避免误报和错误判断,系统还引入了人体检测传感器,这使得系统能够判断车内是否有儿童存在,避免在没有儿童的情况下误触发报警。
当车内的温度达到设定阈值且检测到有儿童时,系统会通过蜂鸣器发出警报提示车主,提醒其注意车内情况。此外,为了加强远程警示功能,系统通过GSM模块向车主发送短信,及时告知车主车内的危险状况。为了防止短信过于频繁,系统设计了短信发送间隔,使得GSM模块只在需要时才发送短信,而不会重复报警。
为了提高系统的灵活性和适应性,用户可以根据实际需要调整温度阈值,并在必要时手动关闭报警系统。此外,系统具备温度显示功能,通过液晶显示屏实时反馈当前车内的温度信息,使得用户能够方便地查看和设置温度阈值。总体设计思路注重系统的智能化、人性化,并确保能够在车主不在车旁时及时提供安全预警,减少因疏忽造成的安全隐患。
1.3 系统功能总结
功能模块 | 描述 |
---|---|
温度监测 | 通过温度传感器实时监测车内温度,并与设定的高温阈值进行比较。 |
人体检测 | 通过人体检测传感器判断车内是否有儿童存在,以避免误报。 |
报警触发 | 当车内温度超过设定阈值且检测到儿童时,系统通过蜂鸣器发出声音报警。 |
短信报警 | 通过GSM模块向车主发送短信,提醒车主车内有儿童且温度过高。 |
温度阈值设置 | 允许用户设置温度阈值,自定义触发报警的条件。 |
报警关闭功能 | 用户可手动关闭报警,确保在非报警状态下系统不会继续触发。 |
短信发送间隔设置 | 设置短信发送的间隔时间,避免GSM模块频繁发送短信,减少重复报警。 |
温度显示 | 使用液晶显示屏显示车内的实时温度与报警状态,提供用户友好的界面。 |
1.4 开发工具的选择
【1】设备端开发
硬件设备端的开发主要依赖于C语言,利用该语言直接操作硬件寄存器,确保系统运行的高效性和低延迟。C语言在嵌入式开发中具有广泛的应用,它能够直接访问硬件,满足对资源消耗和响应速度的严格要求。为了编写高效、稳定的代码,开发工具选择了Keil uVision 5作为主要的开发环境。Keil是一个专业的嵌入式开发工具,广泛应用于基于ARM架构的微控制器(如STM32)开发。Keil提供了完善的调试、编译和仿真支持,能够帮助在软件开发过程中高效地进行调试、单步执行以及断点设置,确保开发的稳定性和高效性。
STM32F103RCT6是项目中使用的主控芯片,它基于ARM Cortex-M3架构,拥有强大的计算能力和丰富的外设接口。在硬件编程中,寄存器级编程是常用的方式,这要求开发者对芯片的硬件寄存器有深入的理解。在Keil环境中,通过STM32的寄存器直接控制GPIO、ADC、I2C、SPI等硬件接口,以满足各个硬件模块(如传感器、执行器、显示屏等)与主控芯片的交互。使用寄存器编程能够提供更高效、精确的控制,避免了外部库的开销,同时也能深入调控硬件特性,提升系统性能。
【2】上位机开发
本项目的上位机开发基于Qt 5框架,使用**C++**作为主要编程语言。Qt是一个跨平台的应用开发框架,广泛用于开发GUI应用程序。Qt提供了丰富的GUI组件和工具,能够高效地实现图形界面的设计与开发。C++则作为Qt的底层语言,具有高效的性能和良好的控制力,非常适合用于处理设备与系统之间的数据交互、通信协议的实现和复杂的计算任务。在项目中,Qt被用于开发Windows平台的桌面应用程序以及Android平台的手机APP。Qt框架的跨平台特性使得开发者能够使用同一套代码在不同操作系统上进行构建和部署,大大提高了开发效率。
为了方便开发和调试,上位机的开发采用了Qt Creator作为主要的集成开发环境(IDE)。Qt Creator是一款由Qt官方提供的开发工具,专为Qt应用程序开发设计,支持C++、QML和JavaScript等语言。Qt Creator提供了丰富的功能,如代码编辑、调试、构建、版本控制集成等,能够显著提升开发者的生产力。在本项目中,Qt Creator为开发者提供了自动化构建、界面设计工具(如Qt Designer)和调试工具(如QDebug和QML调试工具),使得开发过程更加高效和流畅。
上位机与硬件设备端的通信采用了基于TCP/IP协议的数据传输方式。为了实现这一功能,Qt提供了丰富的网络编程支持,尤其是QTcpSocket和QTcpServer类,使得上位机能够轻松地与硬件设备建立TCP连接,进行数据收发。上位机通过WIFI连接ESP8266-WIFI模块,ESP8266模块创建TCP服务器,上位机应用则作为客户端连接到服务器,进行实时的数据传输与控制命令的下发。
为了满足不同用户的需求,本项目需要支持Windows平台的桌面应用和Android平台的移动APP。Qt的跨平台特性使得开发人员能够在一个代码库下完成多平台应用的开发和移植。开发者仅需要编写一次应用逻辑和用户界面,就可以通过Qt的跨平台构建工具生成Windows和Android两个平台的可执行文件。此外,Qt提供了丰富的文档和社区支持,帮助开发者解决平台差异和兼容性问题,确保应用在不同平台上都能稳定运行。
总体而言,上位机开发环境采用了Qt 5框架和C++语言,结合Qt Creator集成开发环境,提供了一个高效、稳定、跨平台的开发工具链。通过Qt强大的GUI设计、网络通信、多线程支持以及数据库管理功能,开发者能够轻松实现与硬件设备的交互、控制设备、处理传感器数据,并为用户提供直观、流畅的操作体验。
1.5 模块的技术详情介绍
- STM32单片机 (STM32F103RCT6)
- 功能:负责整个系统的控制与逻辑判断,协调各个模块的工作。
- 特点:高性能、低功耗、丰富的外设接口,适合嵌入式系统应用。
- 温度传感器 (DHT11)
- 功能:实时检测车内的温度,并将温度数据传送给STM32单片机,供系统判断是否超过设定的阈值。
- 特点:简单易用、价格低廉、测量范围适中,适用于低成本系统。
- 人体检测传感器 (海凌科24G毫米波雷达模块 LD2402)
- 功能:检测车内是否有儿童或成人存在,判断是否需要触发报警。
- 特点:非接触式检测,适应性强,不受光线或遮挡物影响,能够精准探测人体活动。
- 蜂鸣器 (高电平触发)
- 功能:当满足报警条件时,发出响亮的声音,提醒车主车内的安全隐患。
- 特点:声音响亮、易于驱动,能够在高噪音环境下有效提醒。
- GSM模块 (Air780e)
- 功能:通过短信方式将报警信息发送至车主手机,提醒车主车内的危险情况。
- 特点:支持全球网络,适合远程通讯,具有短信发送功能,稳定可靠。
- 按键模块
- 功能:用于手动关闭报警,确保在非报警状态下系统不会继续触发。
- 特点:简单直观,便于操作,提升系统的灵活性。
- 电源模块 (12V直流电源)
- 功能:为系统提供稳定的电力供应,确保所有模块能够正常工作。
- 特点:稳定高效,能够满足系统的电力需求。
- 液晶显示屏 (0.96寸OLED)
- 功能:实时显示车内的温度和报警状态,提供用户友好的界面,方便设置与监控。
- 特点:小巧、清晰、低功耗,适合嵌入式系统,能够显示详细的信息。
1.6 框架图
graph TDA[单片机控制系统] --> B[温度传感器模块]A --> C[红外传感器模块]A --> D[GSM通信模块]A --> E[蜂鸣器报警模块]A --> F[阈值设置与报警控制]B --> G[实时监测车内温度]C --> H[检测儿童座椅区域人体存在]F --> I[设置高温阈值]F --> J[自动关闭报警条件]F --> K[手动关闭报警功能]G & H --> L{高温+人体同时存在?}L -->|是| M[触发报警系统]M --> E[启动蜂鸣器声音警报]M --> N[GSM模块发送短信]N --> O[设置短信发送间隔时间]classDef module fill:#f9f,stroke:#333,stroke-width:2px;classDef decision fill:#f96,stroke:#333,stroke-width:2px;classDef action fill:#6f9,stroke:#333,stroke-width:2px;class A,B,C,D,E,F module;class L decision;class G,H,M,N,E,O action;
框架图说明:
- 核心控制系统:单片机作为中央处理器
- 输入检测层:
- 温度传感器实时监测车内温度
- 红外传感器专用于儿童座椅区域人体检测
- 智能判断模块:
- 双条件判断逻辑(高温+人体同时存在)
- 可设置高温阈值
- 报警执行层:
- 蜂鸣器本地声音警报
- GSM模块短信通知功能
- 控制功能:
- 不满足条件时自动关闭报警
- 支持手动关闭报警
- 短信发送间隔时间控制
二、代码设计思路
当前项目使用的相关软件工具、模块源码已经上传到网盘:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
以下是项目中各个模块的代码示例,涵盖了温度传感器、人体检测传感器、蜂鸣器、GSM模块、按键模块、电源管理等模块。
1. 温度传感器 (DHT11)
#include "DHT11.h"#define DHT11_PIN GPIO_PIN_0 // 设置连接DHT11的引脚// 读取温湿度数据
void DHT11_Read_Data(uint8_t *temperature, uint8_t *humidity) {uint8_t data[5] = {0}; // 存储温湿度数据DHT11_Init(); // 初始化DHT11传感器DHT11_Read(data); // 读取数据*humidity = data[0]; // 湿度*temperature = data[2]; // 温度
}
2. 人体检测传感器 (海凌科24G毫米波雷达模块 LD2402)
#include "LD2402.h"#define RADAR_PIN GPIO_PIN_1 // 设置连接雷达模块的引脚// 检测车内是否有儿童
uint8_t Detect_Human() {uint8_t status = LD2402_Get_Status(); // 获取雷达模块的状态if (status == 1) {return 1; // 检测到人体} else {return 0; // 未检测到人体}
}
3. 蜂鸣器 (高电平触发)
#define BUZZER_PIN GPIO_PIN_2 // 设置连接蜂鸣器的引脚// 激活蜂鸣器报警
void Buzzer_Alarm() {HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_SET); // 设置蜂鸣器引脚为高电平HAL_Delay(1000); // 蜂鸣器响1秒HAL_GPIO_WritePin(GPIOB, BUZZER_PIN, GPIO_PIN_RESET); // 关闭蜂鸣器
}
4. GSM模块 (Air780e)
#include "gsm.h"#define GSM_PIN GPIO_PIN_3 // 设置GSM模块的引脚// 发送报警短信
void GSM_Send_SMS(char *phone_number, char *message) {UART_Send_Command("AT+CMGF=1\r"); // 设置短信格式为文本模式UART_Send_Command("AT+CMGS=\""); UART_Send_Command(phone_number); UART_Send_Command("\"\r");UART_Send_Command(message); // 发送短信内容UART_Send_Command("\x1A"); // 发送结束符
}
5. 按键模块
#define BUTTON_PIN GPIO_PIN_4 // 设置按键模块的引脚// 检查按键是否被按下
uint8_t Check_Button() {if (HAL_GPIO_ReadPin(GPIOB, BUTTON_PIN) == GPIO_PIN_SET) {return 1; // 按键被按下} else {return 0; // 按键未被按下}
}
6. 电源管理 (12V直流电源模块)
// 电源管理不涉及复杂的代码逻辑,主要通过电源模块供电给STM32单片机和其他模块。
// 电源模块与系统其他模块的连接通常通过稳定的电源适配器来实现。
7. 主控制流程
#include "main.h"
#include "DHT11.h"
#include "LD2402.h"
#include "gsm.h"
#include "button.h"
#include "buzzer.h"uint8_t temperature, humidity;
uint8_t human_detected;int main(void) {HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置时钟while (1) {// 获取温度数据DHT11_Read_Data(&temperature, &humidity);// 获取人体检测状态human_detected = Detect_Human();// 如果温度过高且检测到人体,触发报警if (temperature > 30 && human_detected) {Buzzer_Alarm(); // 蜂鸣器报警GSM_Send_SMS("+1234567890", "警报:车内温度过高且有儿童,请检查!"); // 发送短信提醒// 防止重复发送短信HAL_Delay(10000); // 间隔10秒}// 检查是否按下手动关闭按钮if (Check_Button()) {Buzzer_Alarm(); // 关闭报警}HAL_Delay(1000); // 延时1秒}
}
8. 液晶显示 (OLED 显示屏)
#include "oled.h"// 显示温度信息
void Display_Temperature(uint8_t temperature) {OLED_Clear();OLED_ShowString(0, 0, "Temperature:");OLED_ShowNum(0, 2, temperature, 3);OLED_ShowString(0, 4, "C");
}
这些代码为各个硬件模块提供了基础的操作示例,并通过主控制流程进行协调。
三、短信发送
1. air780e.h
#ifndef __AIR780E_H
#define __AIR780E_H#include "stm32f1xx.h"// 函数声明
void AIR780E_Init(void);
void AIR780E_Send_Command(char *cmd);
void AIR780E_Send_SMS(char *phone_number, char *message);
void UART3_IRQHandler(void);#endif /* __AIR780E_H */
2. air780e.c
#include "air780e.h"
#include "string.h"
#include "stm32f1xx_hal.h"// 串口3配置
#define AIR780E_UART huart3
#define AIR780E_RX_PIN GPIO_PIN_11
#define AIR780E_TX_PIN GPIO_PIN_10
#define AIR780E_GPIO_PORT GPIOB
#define AIR780E_BAUDRATE 9600// 初始化Air780E GSM模块
void AIR780E_Init(void) {// 启用UART3时钟__HAL_RCC_USART3_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();// 配置TX和RX引脚GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = AIR780E_TX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(AIR780E_GPIO_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = AIR780E_RX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(AIR780E_GPIO_PORT, &GPIO_InitStruct);// 配置UART3UART_HandleTypeDef huart3;huart3.Instance = USART3;huart3.Init.BaudRate = AIR780E_BAUDRATE;huart3.Init.WordLength = UART_WORDLENGTH_8B;huart3.Init.StopBits = UART_STOPBITS_1;huart3.Init.Parity = UART_PARITY_NONE;huart3.Init.Mode = UART_MODE_TX_RX;huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart3.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart3);// 启用串口3的中断HAL_NVIC_EnableIRQ(USART3_IRQn);
}// 发送AT指令
void AIR780E_Send_Command(char *cmd) {uint16_t length = strlen(cmd);for (uint16_t i = 0; i < length; i++) {// 发送每个字符while (!(USART3->SR & USART_SR_TXE)); // 等待TX缓冲区空USART3->DR = cmd[i]; // 发送字符}while (!(USART3->SR & USART_SR_TC)); // 等待传输完成
}// 发送短信
void AIR780E_Send_SMS(char *phone_number, char *message) {char cmd[128];// 设置短信格式为文本模式AIR780E_Send_Command("AT+CMGF=1\r\n");HAL_Delay(100);// 设置接收号码sprintf(cmd, "AT+CMGS=\"%s\"\r\n", phone_number);AIR780E_Send_Command(cmd);HAL_Delay(100);// 发送短信内容AIR780E_Send_Command(message);HAL_Delay(100);// 发送Ctrl+Z结束短信AIR780E_Send_Command("\x1A"); // Ctrl+ZHAL_Delay(100);
}// 串口3中断处理函数
void UART3_IRQHandler(void) {if (USART3->SR & USART_SR_RXNE) { // 检查接收缓冲区是否有数据char received_char = (USART3->DR & 0xFF); // 读取接收到的数据// 根据需要处理接收到的数据}
}
说明:
- air780e.h:
- 头文件中声明了
AIR780E_Init()
初始化函数,AIR780E_Send_Command()
发送 AT 指令的函数,以及AIR780E_Send_SMS()
发送短信的函数。 - 串口中断处理函数
UART3_IRQHandler()
用于处理串口3的接收中断。
- 头文件中声明了
- air780e.c:
- AIR780E_Init():配置串口3,设置正确的波特率、数据位、停止位和校验位。
- AIR780E_Send_Command():发送AT指令,通过串口3逐字符发送数据。
- AIR780E_Send_SMS():设置GSM模块为短信模式,发送短信内容,并通过
Ctrl+Z
(即0x1A
)结束短信内容。 - UART3_IRQHandler():这个中断服务程序检查串口3的接收数据寄存器。如果接收到数据,将执行相应处理。
四、STM32主代码
以下是main.c
代码示例,结合了温度传感器、人体检测传感器、蜂鸣器、GSM模块、按键模块、电源管理以及液晶显示等模块。代码实现了汽车儿童安全预警系统的基本功能。
#include "stm32f1xx_hal.h"
#include "DHT11.h"
#include "LD2402.h"
#include "gsm.h"
#include "button.h"
#include "buzzer.h"
#include "oled.h"#define TEMPERATURE_THRESHOLD 30 // 设定温度阈值 30°Cuint8_t temperature, humidity;
uint8_t human_detected;
uint32_t last_sms_time = 0; // 上次发送短信的时间void SystemClock_Config(void);
void GPIO_Init(void);
void UART_Init(void);
void Delay(uint32_t delay);// 初始化系统
int main(void) {HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置时钟GPIO_Init(); // 初始化GPIOUART_Init(); // 初始化UARTOLED_Init(); // 初始化OLED显示屏while (1) {// 获取温度数据DHT11_Read_Data(&temperature, &humidity);// 显示当前温度信息Display_Temperature(temperature);// 获取人体检测状态human_detected = Detect_Human();// 如果温度过高且检测到人体,触发报警if (temperature > TEMPERATURE_THRESHOLD && human_detected) {Buzzer_Alarm(); // 蜂鸣器报警// 检查是否已达到发送短信的间隔时间if (HAL_GetTick() - last_sms_time > 10000) { // 每10秒发送一次短信GSM_Send_SMS("+1234567890", "警报:车内温度过高且有儿童,请检查!");last_sms_time = HAL_GetTick(); // 更新最后发送短信的时间}}// 检查是否按下手动关闭按钮if (Check_Button()) {Buzzer_Alarm(); // 手动关闭报警}}
}// 系统时钟配置
void SystemClock_Config(void) {// 配置系统时钟,这部分根据实际硬件平台设置
}// GPIO初始化
void GPIO_Init(void) {__HAL_RCC_GPIOB_CLK_ENABLE(); // 启用GPIOB时钟GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置蜂鸣器引脚GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置按键引脚GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}// UART初始化
void UART_Init(void) {__HAL_RCC_USART1_CLK_ENABLE(); // 启用USART1时钟UART_HandleTypeDef huart1;huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart1);
}// 延时函数
void Delay(uint32_t delay) {HAL_Delay(delay);
}// 获取当前时间
uint32_t HAL_GetTick(void) {return HAL_GetTick();
}
- 初始化与系统配置:
HAL_Init()
用于初始化硬件抽象层(HAL),SystemClock_Config()
配置时钟,GPIO_Init()
配置GPIO引脚,UART_Init()
初始化UART以与GSM模块通信。 - 温度监测与显示:通过
DHT11_Read_Data()
获取温度数据,并使用Display_Temperature()
将其显示在OLED屏上。 - 人体检测:通过
Detect_Human()
使用雷达模块检查车内是否有儿童或其他人。 - 报警触发:当温度超过设定的阈值(30°C),且人体检测到儿童时,通过蜂鸣器触发报警,并通过GSM模块向车主发送短信。
- 手动关闭报警:通过
Check_Button()
检查按键输入,若按下按钮,系统关闭报警。 - 短信发送间隔:使用
HAL_GetTick()
和last_sms_time
变量,确保短信不会频繁发送,每10秒钟才发送一次。