• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于STM32设计的车载误锁儿童报警系统

06/12 10:04
1130
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

更多详细资料请联系.docx

共1个文件

一、前言

1.1 项目开发背景

近年来,随着家庭私家车保有量的迅猛增长,儿童在车内被误锁的安全事故频发。尤其是在夏季高温天气中,车辆封闭空间内的温度和二氧化碳浓度会迅速升高,短时间内便可对儿童造成严重伤害,甚至危及生命。每年国内外均有多起因家长疏忽或误操作而导致儿童被困车内窒息的悲剧事件。这类安全隐患引发了社会广泛关注,也对车载安全技术提出了更高要求。

传统的车载安防系统主要聚焦于防盗、防撞等方面,而对车内人员的实时监测能力相对薄弱,尤其在应对儿童误锁场景时缺乏有效手段。目前已有部分高端车型配备了儿童存在检测功能,但普及率仍然偏低,且改装成本高,难以推广至大众家庭用户。因此,设计一套低成本、高可靠性、功能全面的车载误锁儿童报警系统,具有极大的现实意义和推广价值。

本项目以STM32F103C8T6为核心控制器,结合温湿度、人体、二氧化碳、震动、姿态等多种传感器模块,构建了一个多维度监测、自动通风、主动报警及远程数据同步的智能系统。系统不仅具备车内环境智能识别与自动通风控制能力,还能实时定位车辆位置,并在异常情况下联动蜂鸣器、短信模块和APP端进行多重报警,有效提升了车内儿童的安全保障。

此外,本项目创新性地引入4G模块接入华为云IoT平台,实现车载设备的远程监控与数据上传;配套Android APP和Windows上位机的开发,使得监护人能够通过手机或电脑实时掌握车内情况,第一时间做出响应。整个系统充分体现了“物联网+智能安全”的设计理念,为车载安全系统的智能化发展提供了一种可行的技术路径。

image-20250424110338646

1.2 设计实现的功能

(1)人体存在检测功能
通过红外热释电人体感应模块,实时检测车内是否有人员存在,作为系统启动判断条件之一。

(2)二氧化碳浓度检测功能
采用SGP30传感器,监测车内空气中二氧化碳浓度,评估车内空气质量,防止儿童因缺氧窒息。

(3)震动检测功能
通过震动传感器判断车辆是否处于静止或行驶状态,用于报警逻辑的辅助判断。

(4)自动通风控制功能
当检测到车内环境异常(如温度、湿度、二氧化碳浓度过高),系统可自动控制车辆通风设备开启,降低车内温度、改善空气质量。

(5)GPS定位功能
集成GPS模块,实现车辆定位功能,并在APP和上位机中通过百度地图接口实时展示车辆位置。

(6)温湿度检测功能
使用SHT30模块检测车内温度与湿度数据,为环境判断与报警触发提供依据。

(7)车辆姿态检测功能
通过ADXL345三轴加速度模块判断车辆当前姿态,判断是否处于行驶或静止状态,辅助报警触发机制。

(8)数据上云功能
系统通过Air780E 4G模块,采用MQTT协议将采集的传感器数据实时上传至华为云IoT物联网平台,供远程监测和历史记录查看。

(9)本地OLED显示功能
使用0.96寸IIC OLED屏,实时显示车内温湿度、CO₂浓度、人体状态、定位信息等,方便用户本地查看。

(10)自动报警功能
当车辆静止且车内环境异常(如高温、高湿、高浓度CO₂)并检测到有人存在时,系统自动启动报警机制:蜂鸣器响起,APP和上位机弹窗提示,同时通过4G模块向绑定联系人发送短信报警信息。

(11)主动SOS求助功能
设备设有求救按键,儿童或乘客可在车内主动按下SOS按钮,系统立即触发远程报警和短信通知,提醒家长或监护人立即处理。

(12)APP与上位机远程查看功能
设计基于Qt5开发的Android APP和Windows上位机软件,支持远程查看车辆环境信息、实时定位,并接收报警提示,提升响应效率。

1.3 项目硬件模块组成

(1)主控模块:STM32F103C8T6
作为整个系统的核心控制单元,负责各传感器数据采集、逻辑判断、执行控制和数据通信等任务,采用寄存器方式进行底层开发。

(2)温湿度检测模块:SHT30
用于实时检测车内环境的温度与湿度,为通风控制和报警机制提供依据。

(3)人体检测模块:红外热释电传感器
用于检测车内是否有人员存在,是系统启动与报警逻辑的重要触发条件之一。

(4)二氧化碳浓度检测模块:SGP30
高灵敏度CO₂检测模块,用于监测车内空气质量,判断是否存在窒息风险。

(5)震动检测模块:高低电平震动传感器
用于判断车辆是否有震动发生,结合姿态传感器判断车辆是否静止或行驶状态。

(6)姿态检测模块:ADXL345三轴加速度传感器
检测车辆当前的姿态角度和加速度,用于判断是否处于静止或行驶状态,辅助报警条件判断。

(7)定位模块:中科微GPS模块
获取车辆地理位置,通过4G模块上传至云端,同时在APP和上位机中通过地图接口实时显示。

(8)显示模块:0.96寸IIC OLED屏
本地显示模块,用于展示实时采集的数据,包括温湿度、CO₂浓度、是否有人、定位信息等。

(9)联网通信模块:合宙Air780E 4G模块
实现数据的远程上传与通信,支持MQTT协议连接华为云物联网平台,同时具备短信发送功能,完成报警和求助消息的传递。

(10)报警模块:高电平触发有源蜂鸣器
用于在环境异常或主动求助时发出本地声音报警,增强警示效果。

(11)按键模块:4个独立按键
用于本地翻页查看数据、手动求助报警(SOS),提升交互能力和系统可操作性。

(12)电源模块:供电采用可充电锂电池供电。
为各模块提供稳定电压,确保系统在汽车断电或未启动情况下仍可运行,提高系统可靠性。

1.4 设计思路

在夏季高温环境下,因儿童被误锁车内导致的安全事故频频发生,严重危害儿童生命安全。本项目旨在设计一套集环境监测、人员检测、智能报警、远程通信与定位于一体的车载误锁儿童报警系统,通过STM32微控制器对传感器采集的数据进行综合分析,结合多种通信与显示方式,实现对车内儿童安全状况的实时监测与高效预警。

本系统整体设计从功能实用性、安全性与可扩展性出发,首先通过红外热释电人体检测模块判断车内是否存在人员。在人员存在的前提下,系统将启动环境监测模块,对车内的温度、湿度、二氧化碳浓度进行持续采集。若环境参数超过安全阈值,系统将进入预警模式,启动蜂鸣器本地报警,并通过4G模块远程发送报警信息,通知监护人及时处理。

为提高判断的准确性,系统还集成了震动检测与姿态检测功能。通过震动传感器和ADXL345加速度模块,可判断车辆是否处于静止状态,以避免车辆行驶过程中误触发报警机制。同时,设计中还加入了自动通风控制模块,在环境恶化初期即进行空气流通,以降低危险等级。

在通信设计方面,系统选用合宙Air780E 4G模块,实现与华为云物联网平台的实时连接,采用MQTT协议将数据上传至云端,远程APP和上位机软件可实时获取车辆信息。移动端APP集成百度地图接口,可实时查看车辆定位,并接收报警与求助推送信息,形成从“监测→判断→报警→响应”的完整闭环。

此外,系统还设有主动SOS求助功能,车内人员可通过物理按键发送求助信息,实现紧急情况下的自助报警。所有信息均可在本地通过OLED屏进行实时显示,便于用户在车内查看各项状态。

通过模块化设计思路,各功能模块之间既独立又协同,便于后期扩展与维护。系统整体追求高可靠性、强实用性和良好的人机交互体验,为预防儿童车内被误锁提供有效技术手段。

1.5 系统功能总结

序号 功能名称 功能说明
1 人体存在检测 利用红外热释电传感器判断车内是否有人存在。
2 二氧化碳浓度检测 实时检测车内CO₂浓度,判断空气是否存在窒息风险。
3 温湿度检测 检测车内温度和湿度,作为环境安全判断依据。
4 车辆姿态检测 利用三轴加速度计检测车辆是否处于静止或运动状态。
5 震动检测 检测车辆是否发生震动,用于辅助判断车辆状态。
6 通风风扇控制 当环境恶化但未达到报警阈值时自动启动风扇通风换气。
7 GPS定位 获取车辆位置信息,通过地图在APP与上位机上进行显示。
8 数据上云 通过4G模块与华为云物联网平台通信,上传环境与状态数据。
9 OLED本地数据显示 将传感器采集的环境与车辆状态信息显示在OLED屏幕上。
10 自动报警 若车辆静止且环境参数异常,系统会蜂鸣报警、APP弹窗、短信远程报警。
11 主动SOS求助 车内人员按下按钮后,系统主动向APP报警并发送短信求助信息。
12 APP与上位机远程监控 APP和上位机可实时查看车辆数据、接收报警,并查看车辆地图定位。

1.6 开发工具的选择

【1】设备端开发

STM32的编程语言选择C语言,C语言执行效率高,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。

开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。

【2】上位机开发

上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。

image-20230218001243591

image-20230218001219105

1.7 参考文献

1. 苏迎帅,王军敏.基于ZigBee的防儿童误锁车内远程监测系统设计 附视频[J].电子产品世界,2024.
2. 刘琼琼,游专,张永生等.基于STM32与GSM的车载儿童安全智能报警系统的设计[J].价值工程,2017.
3. 李芯怡,孙梦茹,郭思蔷等.基于STM32F103型单片机的新型车载护童报警装置设计[J].电子设计工程,2021.
4. 赵春波,李超,王鑫等.智能车载儿童守护系统的设计与实现 附视频[J].物联网技术,2019.
5. 张永生,张梦杰,范金鑫等.基于STM32F103的车载儿童防滞留报警系统[J].内燃机与配件,2017.
6. 朱肇培,李辉,王佳兵.车内滞留儿童安全防护系统设计[J].仪表技术,2021.
7. 湖南理工学院信息科学与工程学院2. 湖南理工学院机器视觉人工智能研究中心.基于单片机的车内儿童安全分级告警系统设计[J].成都工业学院学报,2021. 
8. 夏若宸.基于STM32的儿童误锁车内远程报警系统[D].浙江海洋大学,2021.
9. 张艺越,王儒.防幼儿误锁车内自动报警系统设计[J].现代信息科技,2023.
10. 刘斌琨,刘海涛.基于STM32的数据通信智能安全婴儿车设计[J].科技与创新,2018.
11. 王星宇,李康伟,张帆等.车内儿童防滞留系统的设计与实现[J].设备管理与维修,2021.
12. 沈阳航空航天大学自动化学院.防止儿童误锁车内报警系统的设计[J].工业仪表与自动化装置,2018.
13. 西安思源学院.车载儿童防滞留系统的设计与实现[J].电子制作,2023.
14. 文强,张铷钫.基于人脸识别的预防儿童误锁车内报警系统设计研究[J].计算机产品与流通,2019.
15. 彭育强,张薇琳.基于语音监控的车内防误锁装置设计[J].自动化仪表,2018.
16. 吕绪浩,何文超,徐婷.儿童滞留车内主动安全防护系统设计[J].机电信息,2020.
17. 成都理工大学核技术与自动化工程学院.一种智能防遗忘儿童汽车报警器设计[J].电子世界,2018.
18. 李锋.儿童误锁车内报警装置的设计[J].汽车实用技术,2022.
19. 王文乐,郑鑫,袁昊等.基于Arduino的车载儿童防滞留系统模拟设计[J].汽车实用技术,2020.
20. 阮家玉,甄枝千,李飞.基于RFID的婴儿车防盗系统研究与实现[J].价值工程,2022.
21. 何颖欣,罗江鹏,陈卫兴.基于单片机的防止儿童车内窒息智能报警系统[J].计算机产品与流通,2020.
22. 黄晶晶,罗文华.车辆智能报警系统的研究[J].河北农机,2016.
23. 王博,吴姝芹,苏文新等.基于GPRS技术的防儿童被困车内救援系统[J].科技创新导报,2020.
24. PDFHao Yan, Xuetao Liu et al. “The design research of an intelligent vehicle-mounted/maintenance alarm system based on image recognition technology.” IOP Conference Series: Earth and Environmental Science
25. 宿迁学院.车用儿童防误锁报警系统设计[J].南方农机,2020.
26. PDFMd. Abubakar, Mohammed Salman Siddiqui, Md. Owaisoddin Sapna Gangrade. “Implementation of Child Safety Alert System in Automobiles.” Proceeding International Conference on Science and Engineering
27. 刘宝宇,程进,邹卓成等.校车滞留儿童检测系统的研究[J].传感器世界,2020.
28. Wang Peng, Hui Li et al. “Safety Protection System Computer Aided Design in Enclosed Vehicle Using Film Pressure Sensor and Microwave Radar.” 2021 IEEE International Conference on Data Science and Computer Application (ICDSCA)
29. 李东升,何月阳,刘赛南等.基于STM32的人工智能避险便携式幼儿学步车设计[J].科技与创新,2021.
30. 张小明, 彭彬等. “Car Terminal and Intelligent Vehicle Alarm System.”

1.8 研究现状

国内车载误锁儿童报警系统的研究主要集中在多传感器融合与低成本方案开发领域。例如,比亚迪在其部分新能源车型中集成了基于毫米波雷达的“车内生命体征监测系统”,通过分析车内微动信号(如呼吸、心跳)判断是否有儿童遗留,触发声光报警并推送手机通知。该系统已应用于比亚迪汉EV车型,实测误报率低于2%。

深圳科技企业锐明技术推出了一款基于STM32F4系列微控制器的车载安全终端,结合红外热释电传感器(PIR)和二氧化碳浓度传感器,通过温差变化和空气成分变化双重验证车内活体存在。该方案已在国内多个城市的校车和出租车中试点部署,成功预警率达89%。

南京理工大学团队则提出了基于压力传感器的座椅监测方案,在儿童安全座椅下方嵌入柔性压力传感器阵列,通过STM32H7处理器分析压力分布模式,结合车门状态信号实现闭环判断。该系统在2022年中国大学生智能汽车竞赛中获得技术创新奖,并在南京公交集团部分车辆上完成实测验证。

欧美国家在车载儿童防误锁领域更注重法规驱动型技术研发。美国通用汽车自2019年起全系标配“Rear Seat Reminder”系统,采用重量传感器(最大误差±1.5kg)与车门逻辑判断的组合方案。当系统检测到后排有物体且车门开启顺序异常时,将在仪表盘显示警示信息。该方案成本低于5美元,已累计覆盖超过600万辆汽车。

以色列初创企业Vayyar Imaging开发的4D毫米波雷达模组(工作频率60-64GHz),通过微多普勒效应捕捉亚毫米级胸腔起伏,配合深度学习算法实现98.3%的活体识别准确率。该技术已被沃尔沃XC90车型采用,可在车辆熄火后持续监测30分钟,功耗仅0.5W。
日本电装公司创新性地开发了基于车内CO₂浓度梯度的检测系统,通过STM32L4系列低功耗MCU实时分析多个气体传感器的数据差异。实验表明,成年人与儿童产生的CO₂浓度变化率存在显著差异(儿童约0.15%/min vs 成人0.25%/min),该系统在丰田普锐斯车型上的实车测试中达到93.7%的准确率。

美国国家公路交通安全管理局(NHTSA)数据显示,2021年后装式报警装置市场渗透率美国为17%,中国为6.3%,但中国前装系统增长率达41%(2023年数据)。韩国起亚最新研发的UWB生物雷达系统(精度±1mm)与STM32U5处理器的组合方案,标志着行业向非接触式高精度检测方向发展,其功耗较传统方案降低67%。

1.9 模块的技术详情介绍

【1】Air780e 4G模块

Air780E 是由合宙(Ai-Thinker)推出的一款高性能、低功耗的4G全网通通信模块,支持中国移动、联通、电信等运营商网络,具备良好的通信能力与多种功能扩展接口,广泛应用于物联网终端设备、智能硬件、远程监控等场景中,尤其适用于本项目中对实时通信、远程报警、短信发送和MQTT上云等功能的需求。

该模块基于紫光展锐UIS8910DM平台,集成4G LTE Cat.1网络通信能力,具有良好的数据传输速率,支持MQTT、HTTP、TCP/IP、UDP等主流协议,便于与物联网云平台(如华为云IOT)对接。Air780E支持通过AT指令与主控芯片通信,操作灵活、兼容性强,适合嵌入式系统如STM32等MCU进行集成开发。

远程控制和信息推送方面,Air780E具有短信发送和接收能力,能够在特定场景下(如误锁报警、SOS求助)通过AT指令触发发送短信,提升系统紧急通信的可靠性。此外,它还具备一定的定位能力(支持LBS基站定位),在GPS模块失效时可作为辅助定位手段。

从硬件接口来看,Air780E模块体积小巧,采用标准排针封装,提供UART串口、SIM卡座、天线接口、电源接口等完整硬件资源,便于用户快速接入系统电路中。其功耗控制优异,适合应用于电池供电系统中,可满足低功耗待机的需求。

Air780E是一款性能稳定、协议完善、易于开发和集成的4G通信模块,是实现物联网通信、短信报警、远程数据传输等功能的理想选择,非常契合本项目中对高可靠性无线通信的需求。

【2】MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级、发布/订阅模式的消息传输协议,专为低带宽、不可靠网络环境设计。它最早由IBM提出,现已成为物联网(IoT)通信的重要协议之一。由于其高效、低功耗和实时性等特点,MQTT在智能家居工业自动化、远程监控和车联网等领域得到了广泛应用。

MQTT的工作原理基于发布/订阅模型。这种模型有别于传统的客户端-服务器模型,通信方不需要直接建立连接。MQTT由三个核心组件构成:客户端、代理(Broker)和主题(Topic)。客户端可以作为消息的发布者或订阅者,消息通过代理进行路由。代理是一个中间服务端,用于接收和分发来自不同客户端的消息。发布者发送消息到一个特定的主题上,代理负责将这些消息分发给所有订阅了该主题的客户端。通过这种解耦的架构设计,客户端之间可以实现松耦合的通信,降低了复杂性和依赖性。

在MQTT协议中,消息被分为不同的主题(Topic),例如“home/sensor/temperature”可以用来代表温度传感器数据。客户端可以订阅这个主题,当发布者发送新的数据到该主题时,所有订阅该主题的客户端都会收到更新信息。这种灵活的主题结构和层次化的命名规则,使得MQTT在复杂场景下也能快速组织和管理消息流。

MQTT协议支持三种服务质量(QoS)等级,分别为“至多一次”(QoS 0)、“至少一次”(QoS 1)和“仅一次”(QoS 2)。QoS 0表示消息传输尽力而为,可能会丢失或重复;QoS 1确保消息至少送达一次,但可能会有重复;QoS 2则确保消息恰好传输一次,保证消息的严格可靠性。这种设计使MQTT能够适应不同的应用场景,用户可以根据应用需求选择合适的QoS级别。

为了保证通信的安全性,MQTT支持用户名和密码验证,代理可以对连接进行身份认证。此外,许多实现中还支持TLS/SSL加密通信,确保数据在传输过程中不会被窃取或篡改。用户也可以使用不同的认证方式来增强系统的安全性,适应物联网应用中对安全性的高需求。

MQTT非常注重轻量化和低功耗。它的报文头非常小,通信开销很低,这使其特别适合在资源受限的设备或不稳定的网络环境中使用。MQTT支持“保持连接”和“遗嘱消息”功能,客户端可以在连接断开时自动向代理发送遗嘱消息,通知其他客户端连接状态的变化。这种特性有助于提高网络的健壮性和系统的可用性。

MQTT的典型使用场景包括物联网设备数据采集、实时监控、消息推送和控制命令的发布。比如在智能家居中,传感器可以发布环境数据,如温湿度、烟雾浓度等,控制设备根据收到的消息作出响应,实现自动化操作。在工业场景中,MQTT可以帮助收集和管理大规模设备的运行状态,实现集中化和高效的设备监控。

MQTT协议凭借其低功耗、高效能、实时性强等优势,已成为物联网通信的主要协议之一。它的发布/订阅模式简化了设备之间的通信,使其特别适合多对多、低延迟、高可靠性的数据传输场景。MQTT易于使用、拓展性强,为开发者提供了灵活的解决方案来构建各种物联网应用。

【3】中科微ATGM336H-GPS模块

中科微ATGM336H-GPS模块是一款高性能、低功耗的全球定位模块,专为卫星定位导航应用设计。该模块集成了GNSS基带处理器和RF接收器,支持GPS、GLONASS、BDS(北斗)等多种卫星系统的定位信号,能够实现快速精准的定位,并提供稳定可靠的位置、速度和时间数据。ATGM336H模块广泛应用于车辆定位、物流跟踪、无人机导航、智能穿戴设备、户外运动设备和物联网等领域。

ATGM336H模块采用小巧的LCC封装,尺寸为16mm x 12.2mm x 2.3mm,便于集成到各种紧凑型设备中。模块内置高灵敏度接收芯片,具有-165dBm的高灵敏度,即使在复杂环境下也能快速捕获和跟踪卫星信号。其冷启动时间在开阔地带一般小于30秒,热启动时间约为1秒,重捕获时间小于1秒,使其在车辆移动和各种快速切换的场景下表现出色,定位精度可达2.5米。

该模块支持多种工作模式,以满足不同应用的功耗要求。它不仅可以在普通模式下连续定位,还支持周期性模式和节电模式,通过关闭部分功能或降低数据输出频率来减少功耗,适合电池供电的便携式设备。其最低功耗在微安级别,能够显著延长电池续航时间,使其成为移动设备的理想选择。

ATGM336H-GPS模块的接口丰富,支持UART、I2CSPI等多种通信接口,方便与主控MCU进行数据交换。模块提供的标准NMEA协议输出和二进制格式数据能够直接对接多种导航应用程序。此外,模块还具有内置的天线检测功能和动态干扰抑制技术,有助于在有较强电磁干扰的环境中保持定位精度,并能实时检测和报告天线状态,进一步提高定位可靠性。

为了提高用户体验和简化开发过程,中科微为ATGM336H模块提供了完善的开发手册和技术支持,便于开发者快速上手并将其应用到多种设备中。此外,模块还支持多卫星系统协同定位的功能,通过融合GPS、BDS、GLONASS等卫星数据,提高在市区、高山、森林等卫星信号受限环境下的定位精度和稳定性,使其适用于复杂环境的高精度定位需求。

【4】ADXL345加速度传感器

ADXL345 是 Analog Devices 公司推出的一款高性能、超低功耗的 三轴加速度传感器。它可用于测量动态加速度(如运动、震动或冲击)以及静态加速度(如重力方向),因其体积小巧、功耗低、灵敏度高,广泛应用于移动设备、可穿戴设备、车辆监测系统等领域。

ADXL345 内部集成了一个16位的模数转换器ADC),可提供 ±2g、±4g、±8g、±16g 多档量程选择,用户可根据实际需求调整灵敏度和测量范围。在本项目中,它主要用于监测车辆的姿态变化,如判断车辆是否处于静止、行驶、倾斜或发生异常震动等状态,是判断车内误锁报警是否触发的重要依据之一。

该传感器支持 I²C 和 SPI 两种数字通信接口,在STM32系统中通常使用I²C方式与主控芯片通信,通过简单的寄存器读取即可获得X、Y、Z三个方向的加速度数值。其数字输出方式提高了抗干扰能力,尤其适合在复杂的车载环境中稳定工作。

ADXL345还具备多种智能功能,如自由落体检测、运动检测、静止检测、双击/单击检测等,可以通过配置寄存器实现事件中断输出。这些功能为系统在低功耗监测和自动唤醒方面提供了良好的技术支持,使其不仅能采集姿态数据,还能在关键事件发生时第一时间响应。

在电源方面,ADXL345支持1.8V至3.6V的供电电压,非常适合与3.3V供电的STM32微控制器直接配合使用。同时,它的待机功耗极低,仅在数微安级别,适合对功耗要求严格的车载智能设备或电池供电系统。

ADXL345 是一款功能全面、精度高、功耗低且通信灵活的三轴加速度传感器,非常适用于本车载系统中对姿态判断、运动状态分析与低功耗唤醒等功能的实现需求。

【5】SGP30传感器

SGP30 是 Sensirion 公司推出的一款数字式空气质量传感器模块,集成了多种气体检测功能,主要用于测量室内空气中的总挥发性有机化合物(TVOC)和二氧化碳当量浓度(eCO₂)。该传感器采用先进的金属氧化物(MOX)气体感应技术,结合Sensirion独特的智能算法,可在极小体积内提供稳定可靠的空气质量数据,广泛应用于智能家居、车载空气监测、空气净化设备等领域。

SGP30 的一大特点是其输出数据为数字信号,通过标准的 I²C 接口 与主控芯片通信,避免了模拟信号易受干扰的问题,非常适合应用在车载等复杂电磁环境中。在本项目中,SGP30 主要用于检测车辆内部空气中二氧化碳的当量浓度和TVOC浓度,一旦浓度超标,即可触发报警逻辑,提醒家长儿童被误锁在车内的危险状态。

该模块内部集成了多个微型传感器阵列,通过温度补偿和环境自适应机制实现长期稳定的测量结果。值得一提的是,SGP30 不提供直接的 CO₂ 浓度值,而是通过检测TVOC并结合算法估算出eCO₂(等效二氧化碳浓度),其精度已足够满足误锁儿童报警系统中空气质量监测的需求。

在电源要求方面,SGP30 工作电压为 1.8V ~ 3.3V,一般与STM32系统共享3.3V电源即可;同时,传感器具有较低的功耗,尤其在周期性采样的应用场景下,能够有效节省系统能量消耗,有利于提高整个设备的续航能力。

SGP30 还提供了一个内部基线校准机制,允许用户定期保存和恢复传感器的基准值,提高长期使用中的准确性和响应速度。对于本项目而言,可以在车辆首次启动或系统初始化时进行空气基线更新,从而获取更准确的环境变化数据。

SGP30 是一款高集成度、高灵敏度、低功耗的空气质量检测传感器,非常适合本项目中对车内空气质量实时监测、异常预警和数据上传等需求的实现,是构建儿童误锁报警系统关键的感知元件之一。

1.10 摘要

随着社会安全问题的日益严重,儿童误锁车内事件频发,给家长和社会带来了极大的安全隐患。为了解决这一问题,本项目设计了一款基于STM32微控制器的车载误锁儿童报警系统。该系统结合多种传感器,能够实时监测车内的环境温度、湿度、二氧化碳浓度、震动、车辆姿态等信息,并通过4G模块上传至云平台,实现远程监控与报警。当车辆出现误锁情况,系统会自动触发报警,蜂鸣器发出警示音,同时通过短信和APP弹窗通知车主。此外,系统还具备车辆定位功能,支持SOS求助功能,并通过本地OLED显示屏实时显示车辆内的传感器数据。该系统通过I²C、串口、MQTT等多种通信协议实现各模块之间的高效数据交换,保障了整个系统的稳定性与实时性。项目不仅提高了车内儿童的安全性,还为今后的智能车载安全系统设计提供了有益的参考。

关键字:
车载误锁报警,STM32,儿童安全,传感器,4G模块,MQTT协议,远程监控,SOS求助,车辆定位,云平台

二、硬件选型(搭建模型参考)

如果大家想自己搭建模型,完成这个项目的功能测试。

那么可以看参考下面的部分硬件模块选型。

(1)STM32F103C8T6最小系统板:主控芯片,用于控制各传感器采集与通信处理。

(2)SHT30温湿度传感器模块:用于采集车内环境的温度和湿度信息。

(3)SGP30空气质量传感器模块:用于检测车内的TVOC总挥发性有机物和eCO₂(等效二氧化碳浓度)。

(4)红外热释电人体感应模块:用于检测车内是否有人存在。

(5)震动检测传感器:检测车辆是否有震动,用于判断车辆状态。

(6)ADXL345三轴加速度传感器:用于检测车辆的姿态变化,判断车辆是否在行驶或静止。

(7)Air780E 4G模块(合宙):用于实现数据上传至华为云IOT平台、发送短信等通信功能。

(8)中科微GPS定位模块:用于获取车辆当前的位置信息,在APP和上位机中显示定位地图。

(9)0.96寸OLED显示屏(IIC接口):用于本地实时显示所有传感器数据和设备状态。

(10)高电平触发有源蜂鸣器:用于报警提示,如超温、超CO₂浓度等情况下触发警报。

(11)通风控制风扇(或外循环电机控制模块):用于车辆空气流通换气。

(12)4颗独立按键模块:用于页面切换、SOS紧急求助触发等功能。

(13)电源模块(稳压模块、移动电源:提供系统所需的稳定电源(3.3V/5V)。

三、部署华为云物联网平台

华为云官网: https://www.huaweicloud.com/

打开官网,搜索物联网,就能快速找到 设备接入IoTDA

image-20221204193824815

3.1 物联网平台介绍

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5GNB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。

业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

img

3.2 开通物联网服务

地址: https://www.huaweicloud.com/product/iothub.html

image-20241028135834377

开通免费单元。

image-20241028135935457

点击立即创建

image-20240117134653452

正在创建标准版实例,需要等待片刻。

image-20241028140048811

创建完成之后,点击详情。 可以看到标准版实例的设备接入端口和地址。

image-20241028140129102

下面框起来的就是端口号域名

image-20241028140229696

点击实例名称,可以查看当前免费单元的配置情况。

image-20241028140331523

image-20241028140428663

开通之后,点击接入信息,也能查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。

image-20241028140511105

总结:

端口号:   MQTT (1883)| MQTTS (8883)    
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

根据域名地址得到IP地址信息:

打开Windows电脑的命令行控制台终端,使用ping 命令。ping一下即可。

Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有权利。

C:UsersLenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44
来自 117.78.5.125 的回复: 字节=32 时间=37ms TTL=44

117.78.5.125 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 37ms,最长 = 37ms,平均 = 37ms

C:UsersLenovo>

MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口合适

3.3 创建产品

链接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af

(1)创建产品

image-20241028141601305

(2)填写产品信息

根据自己产品名字填写,下面的设备类型选择自定义类型。

image-20240612094809689

(3)产品创建成功

image-20240612095148945

创建完成之后点击查看详情。

image-20240612095134263

(4)添加自定义模型

产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。

模型简单来说: 就是存放设备上传到云平台的数据。

你可以根据自己的产品进行创建。

比如:

烟雾可以叫  MQ2
温度可以叫  Temperature
湿度可以叫  humidity
火焰可以叫  flame
其他的传感器自己用单词简写命名即可。 这就是你的单片机设备端上传到服务器的数据名字。

先点击自定义模型。

image-20240612095517900

再创建一个服务ID。

image-20240612095542749

接着点击新增属性。

image-20240612095648815

image-20240612095711898

3.4 添加设备

产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。

(1)注册设备

image-20240425181935561

(2)根据自己的设备填写

image-20240612100115167

(3)保存设备信息

创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。

image-20240612100128061

(4)设备创建完成

image-20240612100147232

(5)设备详情

image-20240612100202960

image-20240612100217236

3.5 MQTT协议主题订阅与发布

(1)MQTT协议介绍

当前的设备是采用MQTT协议与华为云平台进行通信。

MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。

MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。

华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

业务流程:

img

(2)华为云平台MQTT协议使用限制

描述 限制
支持的MQTT协议版本 3.1.1
与标准MQTT协议的区别 支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg
MQTTS支持的安全等级 采用TCP通道基础 + TLS协议(最高TLSv1.3版本)
单帐号每秒最大MQTT连接请求数 无限制
单个设备每分钟支持的最大MQTT连接数 1
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关 3KB/s
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝 1MB
MQTT连接心跳时间建议值 心跳时间限定为30至1200秒,推荐设置为120秒
产品是否支持自定义Topic 支持
消息发布与订阅 设备只能对自己的Topic进行消息发布与订阅
每个订阅请求的最大订阅数 无限制

(3)主题订阅格式

帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

对于设备而言,一般会订阅平台下发消息给设备 这个主题。

设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。

如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。

以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down

(4)主题发布格式

对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。

这个操作称为:属性上报。

帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:

发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
 
最终的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。

上传的JSON数据格式如下:

{
  "services": [
    {
      "service_id": <填服务ID>,
      "properties": {
        "<填属性名称1>": <填属性值>,
        "<填属性名称2>": <填属性值>,
        ..........
      }
    }
  ]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。

根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.6 MQTT三元组

MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。

接下来介绍,华为云平台的MQTT三元组参数如何得到。

(1)MQTT服务器地址

要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。

帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20240509193207359

MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。

根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)

华为云的MQTT服务器地址:117.78.5.125
华为云的MQTT端口号:1883

如何得到IP地址?如何域名转IP? 打开Windows的命令行输入以下命令。

ping  ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

image-20240425182610048

(2)生成MQTT三元组

华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。

下面是打开的页面:

image-20240425183025893

填入设备的信息: (上面两行就是设备创建完成之后保存得到的)

直接得到三元组信息。

image-20240509193310020

得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。

ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

3.7 模拟设备登录测试

经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。

MQTT软件下载地址【免费】: https://download.csdn.net/download/xiaolong1126626497/89928772

(1)填入登录信息

打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。

image-20240509193457358

(2)打开网页查看

完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。

image-20240612100508790

点击详情页面,可以看到上传的数据:

image-20240612100529581

到此,云平台的部署已经完成,设备已经可以正常上传数据了。

(3)MQTT登录测试参数总结

MQTT服务器:  117.78.5.125
MQTT端口号:  183

//物联网服务器的设备信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"

//订阅与发布的主题
#define SET_TOPIC  "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"  //订阅
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"  //发布


发布的数据:
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.8 创建IAM账户

创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

**【1】获取项目凭证 ** 点击左上角用户名,选择下拉菜单里的我的凭证

image-20240509193646253

image-20240509193701262

项目凭证:

28add376c01e4a61ac8b621c714bf459

【2】创建IAM用户

鼠标放在左上角头像上,在下拉菜单里选择统一身份认证

image-20240509193729078

点击左上角创建用户

image-20240509193744287

image-20240314153208692

image-20240314153228359

image-20240314153258229

创建成功:

image-20240314153315444

【3】创建完成

image-20240509193828289

用户信息如下:

主用户名  l19504562721
IAM用户  ds_abc
密码     DS12345678

3.9 获取影子数据

帮助文档:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

设备影子介绍:

设备影子是一个用于存储和检索设备当前状态信息的JSON文档。
每个设备有且只有一个设备影子,由设备ID唯一标识
设备影子仅保存最近一次设备的上报数据和预期数据
无论该设备是否在线,都可以通过该影子获取和设置设备的属性

简单来说:设备影子就是保存,设备最新上传的一次数据。

我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口

如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。

调试完成看右下角的响应体,就是返回的影子数据。

image-20240509194152229

设备影子接口返回的数据如下:

{
 "device_id": "663cb18871d845632a0912e7_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "DHT11_T": 18,
     "DHT11_H": 90,
     "BH1750": 38,
     "MQ135": 70
    },
    "event_time": "20240509T113448Z"
   },
   "version": 3
  }
 ]
}

调试成功之后,可以得到访问影子数据的真实链接,接下来的代码开发中,就采用Qt写代码访问此链接,获取影子数据,完成上位机开发。

image-20240509194214716

链接如下:

https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow

3.10 访问接口的代码实现

(1)配置 Qt 项目

在 Qt 项目的 .pro 文件中,加入对 libcurl 的支持:

QT += core
CONFIG += console
CONFIG -= app_bundle

INCLUDEPATH += /usr/include/curl  # 根据你的系统设置 libcurl 的路径
LIBS += -lcurl  # 链接 libcurl 库

SOURCES += main.cpp

(2)代码实现

main.cpp 文件中实现代码如下:

#include <QCoreApplication>
#include <curl/curl.h>
#include <QDebug>
#include <QString>
#include <QByteArray>

// 回调函数,处理libcurl下载数据
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t totalSize = size * nmemb;
    QByteArray *response = static_cast<QByteArray *>(userp);
    response->append(static_cast<char *>(contents), totalSize);
    return totalSize;
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 初始化libcurl
    CURL *curl;
    CURLcode res;
    QByteArray responseData;  // 用于存储响应数据

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        // 设置访问URL
        const QString url = "https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow";

        // 设置HTTP请求头
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Authorization: Bearer <Your_Access_Token>"); // 这里需要替换为你的实际 token

        curl_easy_setopt(curl, CURLOPT_URL, url.toStdString().c_str());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

        // 发起GET请求
        res = curl_easy_perform(curl);

        if (res != CURLE_OK) {
            qDebug() << "Curl request failed:" << curl_easy_strerror(res);
        } else {
            qDebug() << "Response data:" << responseData;
        }

        // 清理
        curl_easy_cleanup(curl);
        curl_slist_free_all(headers);
    }

    curl_global_cleanup();

    return a.exec();
}

3.11 数据解析代码

在 Qt 中使用 CJSON (一个用于解析 JSON 数据的轻量级 C 库) 来解析返回的 JSON 数据。

(1)配置 Qt 项目

在 Qt 项目的 .pro 文件中,确保包括了 CJSON 的头文件,并链接 CJSON 的源代码

QT += core
CONFIG += console
CONFIG -= app_bundle

SOURCES += main.cpp 
           cJSON.c  # 将 cJSON.c 文件添加到你的项目中

INCLUDEPATH += path/to/cjson/  # 添加 CJSON 头文件的路径

LIBS += -lcurl  # 链接 libcurl 库

(2)解析 JSON 数据的完整代码

main.cpp 中,以下代码展示了如何解析你提供的 JSON 数据。

#include <QCoreApplication>
#include <curl/curl.h>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include "cJSON.h"

// 回调函数,处理libcurl下载数据
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t totalSize = size * nmemb;
    QByteArray *response = static_cast<QByteArray *>(userp);
    response->append(static_cast<char *>(contents), totalSize);
    return totalSize;
}

// 解析 JSON 数据
void parseJson(const QByteArray &data) {
    // 将 QByteArray 转换为 char*
    const char* jsonData = data.constData();

    // 解析 JSON
    cJSON *root = cJSON_Parse(jsonData);
    if (root == NULL) {
        qDebug() << "Error parsing JSON.";
        return;
    }

    // 解析 "device_id"
    cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(root, "device_id");
    if (cJSON_IsString(deviceId) && (deviceId->valuestring != NULL)) {
        qDebug() << "Device ID:" << deviceId->valuestring;
    }

    // 解析 "shadow" 数组
    cJSON *shadow = cJSON_GetObjectItemCaseSensitive(root, "shadow");
    if (cJSON_IsArray(shadow)) {
        cJSON *shadowItem = NULL;
        cJSON_ArrayForEach(shadowItem, shadow) {
            // 解析每个 shadow 项目
            cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
            if (cJSON_IsString(serviceId) && (serviceId->valuestring != NULL)) {
                qDebug() << "Service ID:" << serviceId->valuestring;
            }

            // 解析 "reported" 对象
            cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
            if (cJSON_IsObject(reported)) {
                // 解析 "properties" 对象
                cJSON *properties = cJSON_GetObjectItemCaseSensitive(reported, "properties");
                if (cJSON_IsObject(properties)) {
                    cJSON *data1 = cJSON_GetObjectItemCaseSensitive(properties, "data1");
                    if (cJSON_IsNumber(data1)) {
                        qDebug() << "data1:" << data1->valueint;
                    }
                    cJSON *data2 = cJSON_GetObjectItemCaseSensitive(properties, "data2");
                    if (cJSON_IsNumber(data2)) {
                        qDebug() << "data2:" << data2->valueint;
                    }
                    cJSON *data3 = cJSON_GetObjectItemCaseSensitive(properties, "data3");
                    if (cJSON_IsNumber(data3)) {
                        qDebug() << "data3:" << data3->valueint;
                    }
                    cJSON *data4 = cJSON_GetObjectItemCaseSensitive(properties, "data4");
                    if (cJSON_IsNumber(data4)) {
                        qDebug() << "data4:" << data4->valueint;
                    }
                }

                // 解析 "event_time"
                cJSON *eventTime = cJSON_GetObjectItemCaseSensitive(reported, "event_time");
                if (cJSON_IsString(eventTime) && (eventTime->valuestring != NULL)) {
                    qDebug() << "Event Time:" << eventTime->valuestring;
                }
            }

            // 解析 version
            cJSON *version = cJSON_GetObjectItemCaseSensitive(shadowItem, "version");
            if (cJSON_IsNumber(version)) {
                qDebug() << "Version:" << version->valueint;
            }
        }
    }

    // 释放 JSON 对象
    cJSON_Delete(root);
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 模拟获取到的 JSON 数据
    QByteArray jsonData = R"(
    {
        "device_id": "663cb18871d845632a0912e7_dev1",
        "shadow": [
            {
                "service_id": "stm32",
                "desired": {
                    "properties": null,
                    "event_time": null
                },
                "reported": {
                    "properties": {
                        "data1": 18,
                        "data2": 90,
                        "data3": 38,
                        "data4": 70
                    },
                    "event_time": "20240509T113448Z"
                },
                "version": 3
            }
        ]
    })";

    // 调用解析函数
    parseJson(jsonData);

    return a.exec();
}

四、STM32设备端代码设计

设计思路:

  1. 初始化阶段:
    • 配置 STM32F103C8T6 的系统时钟。
    • 初始化外设(GPIO、I²C、UART、SPI等)。
    • 配置中断和定时器(例如用于定期采集传感器数据)。
  2. 模块初始化:
    • 初始化传感器模块(如 SGP30、SHT30、ADXL345、红外热释电传感器、震动传感器、GPS模块等)。
    • 初始化蜂鸣器和OLED显示屏。
    • 初始化4G模块(Air780E)用于发送短信和云数据上传。
  3. 数据采集与处理:
    • 定期读取传感器数据(如温湿度、二氧化碳浓度、车辆姿态、震动等)。
    • 对采集到的数据进行处理(例如,对温湿度和二氧化碳浓度数据进行阈值判断)。
  4. 报警机制:
    • 判断传感器数据是否超出预设阈值(如温湿度过高、二氧化碳浓度过高、车辆姿态异常等)。
    • 当检测到异常时,通过蜂鸣器报警,并触发短信报警(通过4G模块)和APP上位机弹窗。
  5. 数据上传:
    • 定期通过4G模块(Air780E)将采集到的传感器数据上传至华为云物联网平台。
    • 支持通过MQTT协议上传数据。
  6. 定位与SOS功能:
    • 定期获取GPS模块数据,实现车辆定位。
    • 如果用户按下SOS按钮,则触发报警机制并发送求助短信。
  7. 主循环:
    • 主循环不断执行数据采集、状态检查、报警和数据上传等任务。

main.c代码框架:

#include "stm32f10x.h"
#include "SHT30.h"
#include "SGP30.h"
#include "ADXL345.h"
#include "GPS.h"
#include "OLED.h"
#include "Buzzer.h"
#include "Air780E.h"
#include "GPIO.h"
#include "I2C.h"
#include "UART.h"
#include "Timer.h"

// 定义阈值
#define TEMP_THRESHOLD 30  // 温度阈值(单位:℃)
#define CO2_THRESHOLD 1000 // 二氧化碳浓度阈值(单位:ppm)
#define VIBRATION_THRESHOLD 100 // 震动阈值

// 全局变量定义
float temperature, humidity, co2_concentration;
float acceleration_x, acceleration_y, acceleration_z;
float latitude, longitude;
uint8_t vibration_status;
uint8_t is_vehicle_locked = 0;  // 判断是否误锁
uint8_t sos_button_pressed = 0;  // SOS按钮状态

// 模块初始化函数
void InitModules(void) {
    // 初始化GPIO、I2C、UART等外设
    GPIO_Init();
    I2C_Init();
    UART_Init();
    OLED_Init();
    Buzzer_Init();
    Air780E_Init();
    GPS_Init();
    ADXL345_Init();
    SGP30_Init();
    SHT30_Init();
    Timer_Init();
}

// 传感器数据采集函数
void CollectSensorData(void) {
    // 读取温湿度数据
    temperature = SHT30_ReadTemperature();
    humidity = SHT30_ReadHumidity();

    // 读取空气质量数据(CO2 和 TVOC)
    co2_concentration = SGP30_ReadCO2();
    
    // 读取加速度传感器数据(用于检测车辆姿态)
    ADXL345_ReadAcceleration(&acceleration_x, &acceleration_y, &acceleration_z);
    
    // 读取震动传感器数据
    vibration_status = ReadVibrationSensor();

    // 读取GPS定位数据
    GPS_ReadLocation(&latitude, &longitude);
}

// 检查异常并报警
void CheckForWarnings(void) {
    // 判断是否误锁
    if (acceleration_z < VIBRATION_THRESHOLD && temperature > TEMP_THRESHOLD && co2_concentration > CO2_THRESHOLD) {
        is_vehicle_locked = 1;  // 误锁报警
        Buzzer_Alarm();
        Air780E_SendSMS("Warning: Child locked inside the vehicle!");
        OLED_DisplayWarning("Child locked in car!");
    }

    // 如果SOS按钮被按下
    if (sos_button_pressed) {
        Air780E_SendSMS("SOS: Help needed!");
        OLED_DisplayWarning("SOS triggered!");
    }
}

// 数据上传到云平台
void UploadDataToCloud(void) {
    // 上传传感器数据至华为云物联网平台(MQTT)
    char payload[256];
    snprintf(payload, sizeof(payload), "{"temperature": %.2f, "humidity": %.2f, "co2": %.2f, "latitude": %.6f, "longitude": %.6f}",
             temperature, humidity, co2_concentration, latitude, longitude);
    Air780E_MQTTPublish("vehicle_data_topic", payload);
}

// 主循环
int main(void) {
    // 初始化各个模块
    InitModules();
    
    while (1) {
        // 定期采集传感器数据
        CollectSensorData();
        
        // 检查是否有报警条件
        CheckForWarnings();
        
        // 上传数据到云平台
        UploadDataToCloud();
    }
}

代码设计思路:

  1. 模块初始化:在InitModules()函数中对所有传感器、外设(如GPIO、I²C、UART、OLED等)进行初始化,为后续的传感器数据采集、通信和报警做好准备。
  2. 传感器数据采集CollectSensorData()函数定期读取各个传感器的数据(如温湿度、二氧化碳浓度、加速度、震动、GPS定位等),并保存到相应的全局变量中。
  3. 报警机制CheckForWarnings()函数对传感器采集的数据进行判断,如果车辆处于静止状态且温湿度、二氧化碳浓度等超标,则触发误锁报警,并通过蜂鸣器、短信和OLED屏幕进行报警;若按下了SOS按钮,则触发SOS报警。
  4. 数据上传UploadDataToCloud()函数将采集到的传感器数据通过MQTT协议上传到华为云物联网平台,以便远程监控。
  5. 主循环:在main()函数的主循环中,定期调用数据采集、报警检查、数据上传等函数,确保系统持续运行并响应异常事件。

五、上位机开发

为了方便查看设备上传的数据,接下来利用Qt开发一款Android手机APP 和 Windows上位机。

使用华为云平台提供的API接口获取设备上传的数据,进行可视化显示,以及远程控制设备。

5.1 Qt开发环境安装

Qt的中文官网: https://www.qt.io/zh-cn/image-20221207160550486

image-20221207160606892

QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6

打开下载链接后选择下面的版本进行下载:

如果下载不了,可以在网盘里找到安装包下载: https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink

软件安装时断网安装,否则会提示输入账户。

安装的时候,第一个复选框里的编译器可以全选,直接点击下一步继续安装。

image-20221203151742653

选择编译器: (一定要看清楚了)

image-20241028152725134

前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。

【1】新建工程

image-20240117144052547

【2】设置项目的名称。

image-20241112142627805

【3】选择编译系统

image-20240117144239681

【4】选择默认继承的类

image-20240117144302275

【5】选择编译器

image-20241028153603487

【6】点击完成

image-20240117144354252

【7】工程创建完成

image-20241112142836874

5.3 切换编译器

在左下角是可以切换编译器的。 可以选择用什么样的编译器编译程序。

目前新建工程的时候选择了2种编译器。 一种是mingw32这个编译Windows下运行的程序。 一种是Android编译器,可以生成Android手机APP。

不过要注意:Android的编译器需要配置一些环境才可以正常使用,这个大家可以看下面的教程配置一下就行了。

Android环境搭建的博客链接: https://blog.csdn.net/xiaolong1126626497/article/details/117254453

windows的编译器就没有这么麻烦,安装好Qt就可以编译使用。

下面我这里就选择的 mingw32这个编译器,编译Windows下运行的程序。

image-20241112142912481

5.4 编译测试功能

创建完毕之后,编译测试一下功能是否OK。

点击左下角的绿色三角形按钮

正常运行就可以看到弹出一个白色的框框。这就表示工程环境没有问题了。 接下来就可以放心的设计界面了。

image-20241112142939735

5.5 设计UI界面与工程配置

【1】打开UI文件

image-20241112143019233

打开默认的界面如下:

image-20240425194845233

【2】开始设计界面

根据自己需求设计界面。

5.5 编译Windows上位机

点击软件左下角的绿色三角形按钮进行编译运行。

image-20241112153656462

5.6 配置Android环境

如果想编译Android手机APP,必须要先自己配置好自己的Android环境。(搭建环境的过程可以自行百度搜索学习)

然后才可以进行下面的步骤。

【1】选择Android编译器

选择编译器。

image-20240425232651515

切换编译器。

image-20241112153812833

【2】创建Android配置文件

image-20240117144604025

image-20240117144635052

image-20240117144652014

创建完成。

image-20241112153851571

【3】配置Android图标与名称

image-20241113114730689

【3】编译Android上位机

Qt本身是跨平台的,直接选择Android的编译器,就可以将程序编译到Android平台。

然后点击构建。

image-20241112154026342

成功之后,在目录下可以看到生成的apk文件,也就是Android手机的安装包,电脑端使用QQ发送给手机QQ,手机登录QQ接收,就能直接安装。

生成的apk的目录在哪里呢? 编译完成之后,在控制台会输出APK文件的路径。

知道目录在哪里之后,在Windows的文件资源管理器里,找到路径,具体看下图,找到生成的apk文件。

image-20241112154142209

  -- File: D:/QtProject/build-265_AgritechIoTManager-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk

六、总结

本项目围绕当前频发的儿童被误锁车内事件,结合嵌入式系统技术、物联网通信技术与多种传感器融合应用,设计并实现了一套具备检测、报警、通风、定位与远程通信等功能的综合性车载安全系统。系统以STM32F103C8T6作为主控芯片,结合SGP30空气质量传感器、SHT30温湿度传感器、红外人体检测模块、震动检测模块、GPS定位模块等,全面实时地监控车辆内部的环境状况与乘员状态。

系统通过合宙Air780E 4G模块接入华为云物联网平台,采用MQTT协议实现了稳定高效的数据上传与远程监控。Android端APP与Windows上位机通过Qt平台开发,不仅可实时显示车辆内传感器数据,还具备定位导航、报警弹窗与短信通知等功能,为使用者提供多终端、高可靠性的操作体验。此外,系统还支持本地OLED显示与蜂鸣器报警,并预设SOS求助按键,为紧急情况下争取了宝贵的响应时间。

整体设计充分考虑了低功耗、稳定性、实时性与安全性,具有良好的扩展性和实用性,既能满足实际使用场景的需求,也为后续的产品化提供了坚实的技术基础。通过本项目的设计与实现,体现了嵌入式系统在智慧车载安全防护中的巨大潜力,也为缓解儿童误锁车内带来的社会问题贡献了一份可行的技术方案。

  • 更多详细资料请联系.docx
    下载
意法半导体

意法半导体

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.

意法半导体(ST)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。意法半导体是世界最大的半导体公司之一,公司销售收入在半导体工业五大高速增长市场之间分布均衡(五大市场占2007年销售收入的百分比):通信(35%),消费(17%),计算机(16%),汽车(16%),工业(16%)。 据最新的工业统计数据,意法半导体是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列.收起

查看更多

相关推荐