一、项目概述
随着汽车普及率的增加,车内安全问题日益受到关注。近年来,婴儿甚至成人被锁在车内而导致中暑或晕倒的事件频频发生,严重威胁到人们的生命安全。因此,开发一个有效的车内温度预警系统显得尤为重要。本项目旨在设计一个基于OpenMV和STM32的车内温度监测与预警系统,能够实时监测车内温度,并在检测到异常情况时及时发出警报,以保护被锁人员的安全。
技术栈关键词
-
硬件:OpenMV,STM32,NB-IOT BC26模块,SIM900A模块,舵机
-
软件:Haar特征,LBP特征,温度传感器,短信预警,蜂鸣器,风扇控制
-
通信协议:NB-IOT,串口通信
二、系统架构
设计系统架构
本项目的系统架构设计如下:
-
OpenMV:负责摄像头的图像采集和人脸识别。
-
STM32:作为主控单元,负责数据处理、温度监测和各模块的协调。
-
舵机:实现360°全方位无死角的人脸追踪。
-
温度传感器:实时监测车内温度。
-
NB-IOT BC26模块和SIM900A模块:用于数据上传和短信预警。
-
蜂鸣器和风扇:用于物理降温和声音警报。
系统架构图
三、环境搭建和注意事项
环境搭建
-
硬件连接:
-
将OpenMV与STM32通过串口连接。
-
温度传感器连接到STM32的ADC引脚。
-
NB-IOT模块和SIM900A模块通过串口与STM32连接。
-
舵机连接到STM32的PWM引脚。
-
蜂鸣器和风扇连接到STM32的GPIO。
-
-
软件准备:
-
安装OpenMV IDE。
-
安装STM32开发环境(如Keil、STM32CubeIDE)。
-
配置NB-IOT模块和SIM900A模块的AT指令集。
-
注意事项
-
确保硬件连接稳固,避免短路。
-
温度传感器的校准,确保其准确性。
-
进行充分的测试,确保系统在各种环境下正常工作。
四、代码实现过程
在本节中,我们将详细介绍基于OpenMV和STM32的车内温度预警系统的代码实现过程。我们将分模块介绍每个功能的实现,包括人脸识别、温度监测和预警机制。每个模块将配有代码示例和详细说明,最后附上时序图以说明系统的运行时序。
1.OpenMV人脸识别模块
代码示例
import sensor
import image
import time
from pyb import Servo
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 初始化舵机
s = Servo(1)
while True:
img = sensor.snapshot() # 捕获图像
faces = img.find_faces(0) # 查找人脸
if faces:
for face in faces:
# 计算舵机转动角度
x = face.x() + face.w() / 2 # 获取人脸中心x坐标
angle = (x / 320) * 180 # 将x坐标映射到舵机角度(0到180度)
s.angle(angle) # 控制舵机转动到指定角度
time.sleep(100) # 每100毫秒检查一次
代码说明
-
初始化摄像头:通过
sensor.reset()
重置摄像头,设置图像格式和分辨率。 -
舵机控制:使用
Servo
类初始化舵机,并在循环中根据检测到的人脸位置调整舵机角度,实现360°全方位追踪。 -
人脸识别:调用
img.find_faces(0)
方法查找图像中的人脸。如果识别到人脸,则计算其中心位置,并将其转换为舵机的控制角度。 -
循环延时:通过
time.sleep(100)
设置每100毫秒检查一次人脸,避免频繁检测导致系统负担过重。
2.STM32温度监测和预警模块
代码示例
#include "stm32f4xx.h"
#include "usart.h"
#include "temp_sensor.h"
#include "nb_iot.h"
#include "sim900a.h"
#define TEMP_THRESHOLD 40 // 设置温度阈值
void setup() {
USART_Init(); // 初始化串口
TempSensor_Init(); // 初始化温度传感器
NB_IOT_Init(); // 初始化NB-IOT模块
SIM900A_Init(); // 初始化SIM900A模块
}
void loop() {
float temperature = TempSensor_Read(); // 读取温度
if (temperature > TEMP_THRESHOLD) {
// 判断温度是否超过阈值
SendAlert(temperature); // 发送预警信息
ActivateBuzzer(); // 激活蜂鸣器
ActivateFan(); // 启动风扇进行降温
}
Delay(1000); // 每隔一秒检查一次温度
}
void SendAlert(float temp) {
char message[50];
sprintf(message, "Warning: Temperature exceeds threshold! Current: %.2f°C", temp);
SIM900A_SendSMS("+1234567890", message); // 发送短信报警
}
void ActivateBuzzer() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 启动蜂鸣器
Delay(500); // 蜂鸣500ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 关闭蜂鸣器
}
void ActivateFan() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 启动风扇
}
代码说明
-
初始化函数:
-
USART_Init()
:初始化串口通信,用于调试和与其他模块通信。 -
TempSensor_Init()
:初始化温度传感器,配置其工作参数。 -
NB_IOT_Init()
和SIM900A_Init()
:初始化NB-IOT和SIM900A模块,准备好进行数据传输和短信发送。
-
-
主循环:
-
如果超过阈值,调用
SendAlert()
函数发送预警信息,并激活蜂鸣器和风扇。 -
TempSensor_Read()
:读取温度传感器的当前温度。 -
判断温度是否超过设定的阈值(40°C)。
-
Delay(1000)
:每隔一秒检查一次温度,确保系统能及时响应温度变化。
-
-
发送预警信息:
-
使用
sprintf
函数格式化消息,包含当前温度。 -
调用
SIM900A_SendSMS()
函数发送短信,目标号码需要根据实际情况进行配置。 -
SendAlert(float temp)
:构建并发送短信预警信息。
-
-
激活蜂鸣器:
-
使用
HAL_GPIO_WritePin()
函数控制蜂鸣器引脚状态。 -
蜂鸣器发出500ms的警报音,之后关闭。
-
ActivateBuzzer()
:通过控制GPIO引脚来启动和停止蜂鸣器。
-
-
激活风扇:
ActivateFan()
:控制GPIO引脚来启动风扇,确保在高温情况下能进行物理降温。
3.代码时序图
以下时序图展示了系统各模块之间的交互过程,帮助理解系统的运行时序。
时序图说明
-
OpenMV模块:在循环中不断捕获图像并进行人脸检测。
-
STM32模块:接收到OpenMV的图像数据后,获取当前温度并判断是否超过设定的阈值。
-
温度传感器:STM32请求温度数据,返回当前温度值。
-
NB-IOT和SIM900A模块:在温度超过阈值时,STM32通过NB-IOT上传数据,并通过SIM900A发送短信警报。
-
蜂鸣器和风扇:在接收到过高温度警报时,STM32控制蜂鸣器发出警报声并启动风扇进行降温。
五、项目总结
项目主要功能
本项目成功实现了一个基于OpenMV和STM32的车内温度预警系统,主要功能包括:
-
人脸识别和追踪:通过OpenMV实现360°全方位的人脸追踪,确保实时监测车内情况。
-
温度监测:利用温度传感器实时监测车内温度,确保及时发现异常情况。
-
预警机制:一旦温度超过设定阈值,系统会自动发送短信预警、激活蜂鸣器和风扇进行降温,保障被锁人员的安全。
实现过程总结
-
在硬件方面,成功集成了OpenMV、STM32、温度传感器、NB-IOT模块和SIM900A模块。
-
在软件方面,使用了C语言和Python实现了各个模块的功能,确保了系统的实时性和可靠性。
-
通过时序图清晰地展示了系统的工作流程,便于后续的维护和扩展。