【2024 DigiKey 创意大赛】基于树莓派的空巢老人监护系统
[复制链接]
本帖最后由 空耳- 于 2024-11-1 04:33 编辑
一、项目简介
1、设计名称
基于树莓派的空巢老人监护系统
2、项目照片
环境监测部分:
跌倒监测部分:
3、项目用到的板卡
(1)Raspberry Pi 5
处理器:2.4GHz 4核 64位Cortex-A76
内存:4GB LPDDR4X-4267
通讯接口:Wi-Fi 6(802.11ac) 支持2.4GHz和5GHz频段
Bluetooth 5.2 支持低功耗蓝牙连接
1个2.5Gbps 1000M Ethernet
2个USB3.0
2个USB2.0
GPIO:标准40Pin GPIO插头
音视频接口:双micro HDMI接口,支持双4K@60fps视频输出
2-lane MIPI DSI
2-lane MIPI CSI
MicroSD卡槽:支持更高速的MicroSD卡
PCIe接口: PCIe 2.0 x1接口,支持高速外设连接
(2)esp32
(3)其他传感器,mq-2,mq-5,dht11,GSM模块
4、项目功能
背景:随着我国社会老龄化的加剧, 特别是空巢老年人群体的扩大, 已经引起了广泛关注。 根据最新的统计数据, 我国 60 岁及以上的老年人口比例已经达到 18.7%, 而 65岁及以上的老年人口比例则为 13.5%, 与上一次人口普查相比, 这两个年龄段的人口比例分别上升了 5.44%和 4.63%。 同时, 《中国空巢老人现状报告 2017》 预测, 到2030 年, 我国的老龄人口将接近 3 亿, 其中 90%将是空巢老人家庭。 随着城市化进程的快速推进, 越来越多的年轻人涌向城市, 导致农村空巢老人的数量日益增加。
随着社会老龄化的加剧, 空巢老人的生活安全问题越来越受到重视。 本项目旨在开发一种基于树莓派的空巢老人守护系统, 该系统通过实时监控老人的姿态和环境信息, 能够迅速识别天然气泄漏, 家中失火, 老人跌倒等危险情况, 并立即向子女发送警告通知, 从而提升空巢老人的安全保障和生活品质。 本项目将综合运用嵌入式技术、 深度学习算法和物联网技术, 探讨如何构建一个高效且可靠的监测系统,为空巢老人的家庭护理提供技术支持与保障。
二、系统框图
系统设计方案:
为满足特定研究主题的需求, 本系统需要一个全面的设计方案。 系统的主要作用是监测老年人居家环境以及是否出现跌倒情况。 基于这一目标, 系统主要包含两个部分: 一部分是通过物联网技术实施环境监控, 另一部分则是专门用于检测跌倒这一危险行为。 系统总体框图如下:
物联网环境监测系统设计框图
在系统中,传感器数据监测部分负责监测空巢老人的室内环境参数,并通过云平台将信息发送给手机应用程序。在危险环境下,系统会通过GSM进行报警。系统包括数据采集模块,主控模块,通信模块等部分。
硬件框图:
软件框图:物联网环境监测系统使用Arduino IDE进行程序设计,设计了ESP-32主程序,DHT11温湿度传感器检测程序、MQ-2和MQ-5气体传感器检测程序,以及GSM报警通知程序。通过点灯Blinker APP软件,可以实时显示采集到的环境数据,并在发现危险情况时进行报警。
跌倒行为监测系统系统设计框图:
本文选择的ARM硬件平台为:Raspberry Pi 5处理器:2.4GHz 4核 64位Cortex-A76内存:4GB LPDDR4X-4267通讯接口:Wi-Fi 6(802.11ac) 支持2.4GHz和5GHz频段 Bluetooth 5.2 支持低功耗蓝牙连接1个2.5Gbps 1000M Ethernet。主要使用到了一下外部接口。
三、各部分功能说明
应用软件分为2大块:
跌倒行为监测:通过树莓派实施对跌倒行为的监控,主要聚焦于目标检测算法的研究,并采用YOLOv5算法来实现对老人跌倒的检测。对数据集进行多次训练,直到模型的准确度达到预定的目标。然后,将这个模型部署到目标设备上,对老人的行为进行视频监测,判断是否跌倒。最后通过GSM模块的短信功能进行报警。
物联网环境监测:通过采用DHT11传感器来监测老人居家环境的温湿度,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的温湿度情况。通过采用MQ-5传感器来监测可燃气体是否泄露,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的危险因素,提醒老人或者家属做出相应措施。通过采用MQ-2烟雾传感器来监测家中是否失火,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的危险因素,提醒老人或者家属做出相应措施。
四、作品源码
环境监测部分:
#define WAIBU1 35 //定义蜂鸣器引脚
#define WAIBU2 34 //定义蜂鸣器引脚
#define beep 25 //定义蜂鸣器引脚
#define MQ2_pin 33 //定义MQ-5传感器AO采样
#define MQ5_pin 32 //定义MQ-5传感器AO采样
//温湿度部分
#define DHTPIN 26 //定义DHT11模块连接stm32的管脚PB8
#define DHTTYPE DHT11 // 使用温度湿度模块的类型为DHT11
DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型
BlinkerNumber HUMI("humi"); //定义湿度数据键名
BlinkerNumber TEMP("temp"); //定义温度数据键名
BlinkerNumber MQ5("mq5"); //定义温度数据键名
BlinkerNumber MQ2("mq2"); //定义温度数据键名
BlinkerSlider Slider0("T"); //位置0-3 滑块 数据键名
BlinkerSlider Slider1("H"); //位置0-3 滑块 数据键名
BlinkerSlider Slider2("M"); //位置0-3 滑块 数据键名
BlinkerSlider Slider3("N"); //位置0-3 滑块 数据键名
//定义浮点型全局变量 储存传感器读取的数据
int humi_read = 0, temp_read = 0;
int ADC_MQ5=0;
int ADC_MQ2=0;
int temp_read_threshold=30; //默认值后面要用到
int humi_read_threshold=90; //默认值后面要用到
int ADC_MQ5_read_threshold=500; //默认值后面要用到
int ADC_MQ2_read_threshold=2200; //默认值后面要用到
//**********定义连接WiFi***********************************//
char auth[] = "************"; //设备Blinker注册码
char ssid[] = "6"; //家里路由器名称
char pswd[] = "12345678"; //家里路由器密码
//定义浮点型全局变量 储存定时时间的数据
uint32_t read_time = 0;
void sensor_work()
{
//每隔两秒钟进入判断获取温湿度和危险气体浓度数值
if (read_time == 0 || (millis() - read_time) >= 2000)
{
read_time = millis();
//温湿度检测
float h = dht.readHumidity();
float t = dht.readTemperature();
humi_read = h;
temp_read = t;
//串口打印数值
Serial.print("湿度:");
Serial.print(humi_read);
Serial.print(" 温度:");
Serial.print(temp_read);
//危险气体mq-5检测
ADC_MQ5=analogRead(MQ5_pin);
//串口打印数值
Serial.print(" 危险气体:");
Serial.println(ADC_MQ5);
//mq-2检测
ADC_MQ2=analogRead(MQ2_pin);
//串口打印数值
Serial.print(" 烟雾浓度:");
Serial.println(ADC_MQ2);
}
if(humi_read > humi_read_threshold )
{
Blinker.notify("当前湿度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if( temp_read > temp_read_threshold )
{
Blinker.notify("当前温度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(ADC_MQ5 >ADC_MQ5_read_threshold)
{
Blinker.notify("当前危险气体浓度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(ADC_MQ2 >ADC_MQ2_read_threshold)
{
Blinker.notify("当前烟雾浓度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(digitalRead(WAIBU1) ==HIGH)
{
Blinker.notify("检测到老人摔倒!!");
digitalWrite(beep,LOW);
sim800c2();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(digitalRead(WAIBU2) ==HIGH)
{
Blinker.notify("检测到老人摔倒!!");
digitalWrite(beep,LOW);
sim800c2();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
}
String data="";
String num="15181147909";
void sim800c1()
{
Serial2.println("AT"); //Once the handshake test is successful, it will back to OK
delay(500);
Serial2.println("AT+CMGF=1"); // Configuring TEXT mode
delay(500);
data="";data+="AT+CMGS=";data+="\"";data+=num;data+="\"";
Serial2.println(data);
delay(500);
Serial2.print("danger"); //text content
delay(500);
Serial2.write(26);
}
String data2="";
void sim800c2()
{
Serial2.println("AT"); //Once the handshake test is successful, it will back to OK
delay(500);
Serial2.println("AT+CMGF=1"); // Configuring TEXT mode
delay(500);
data2="";data2+="AT+CMGS=";data2+="\"";data2+=num;data2+="\"";
Serial2.println(data2);
delay(500);
Serial2.print("fall"); //text content
delay(500);
// Serial2.write(26);
Serial2.write(0x1a);
}
//回传数据
void heartbeat()
{
if(humi_read>0)
{
HUMI.print(humi_read); //给blinkerapp回传湿度数据
}
if(temp_read>0)
{
TEMP.print(temp_read); //给blinkerapp回传温度数据
}
if(ADC_MQ5>0)
{
MQ5.print(ADC_MQ5); //给blinkerapp回传湿度数据
}
if(ADC_MQ2>0)
{
MQ2.print(ADC_MQ2); //给blinkerapp回传湿度数据
}
}
//图表
void dataStorage()//云存储温湿度数据函数
{
Blinker.dataStorage("tubiao", humi_read);//存储酒精度数
Blinker.dataStorage("tubiao1", temp_read);//存储酒精度数
Blinker.dataStorage("tubiao2", ADC_MQ5);//存储酒精度数
Blinker.dataStorage("tubiao3", ADC_MQ2);//存储酒精度数
}
//滑块任务0函数
void slider0_callback(int32_t value) //滑块0
{
//Slider0.color("#00FF00");
temp_read_threshold=value;
}
//滑块任务1函数
void slider1_callback(int32_t value) //滑块0
{
//Slider1.color("#00FF00");
humi_read_threshold=value;
}
//滑块任务2函数
void slider2_callback(int32_t value) //滑块0
{
//Slider2.color("#00FF00");
ADC_MQ5_read_threshold=value;
}
//滑块任务3函数
void slider3_callback(int32_t value) //滑块0
{
//Slider2.color("#00FF00");
ADC_MQ2_read_threshold=value;
}
void setup()
{
Serial.begin(115200);//初始化串口
Serial2.begin(115200);
BLINKER_DEBUG.debugAll(); //调试窗口
Blinker.begin(auth, ssid, pswd); //初始化ESP32设备连接网络
Blinker.attachHeartbeat(heartbeat);//注册回调函数
Blinker.attachDataStorage(dataStorage); //图表
Slider0.attach(slider0_callback);//关联滑动开关
Slider1.attach(slider1_callback);//关联滑动开关
Slider2.attach(slider2_callback);//关联滑动开关
Slider3.attach(slider3_callback);//关联滑动开关
//初始化DHT传感器IO工作
dht.begin();
//初始化MQ-5传感器
pinMode(MQ5_pin, INPUT);
//初始化MQ-2传感器
pinMode(MQ2_pin, INPUT);
//初始化蜂鸣器
pinMode(beep, OUTPUT);
digitalWrite(beep,HIGH);
//初始外部引脚1
pinMode(WAIBU1, INPUT);
digitalWrite(WAIBU1,LOW);
//初始化外部引脚2
pinMode(WAIBU2, INPUT);
digitalWrite(WAIBU2,LOW);
}
void loop() {
Blinker.run();
sensor_work();
}
跌倒监测部分:其实这一部分代码量没有多少,只有是数据集的标注,和环境的搭建,模型的训练比较复杂。
模型介绍:
YOLO系列算法自2015年推出以来,以其高精度、高效率和高实用性获得广泛应用。YOLOv1将整张图片输入网络,直接回归框的位置和类别,但存在对小物体检测效果不佳、长宽比不一致导致的识别问题以及定位误差。YOLOv2提高了定位准确度并增加了识别种类,但未完全解决YOLOv1的问题。YOLOv3在模型复杂度上提升,检测精度显著提高,但速度略有下降。YOLOv3使用单一网络评估,性能卓越,但小型物体检测能力有限,精度和召回率都低。YOLOv4适用于实际工作环境,检测速度达到实时级别,降低了训练门槛,实现了速度与精度的平衡。本文所选用的目标检测算法是 YOLOv5。
YOLOv5算法包含五个不同版本:YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l以及YOLOv5x。通常情况下,目标检测算法主要由四个部分构成:输入端、基准网络、Neck网络以及Head输出端。
输入端:接收尺寸为608*608的图片,并进行图像预处理。
基准网络:负责提取图像的通用特征,通常由一些高性能的分类器网络构成。
Neck网络:增强特征的多样性和鲁棒性。
Head输出端:输出目标检测的结果。
观察图像后,可以看到,在五个不同版本中。YOLOv5x的检测准确度最高,但检测速度最慢;而YOLOv5n的检测速度最快,但检测准确度最差。考虑到树莓派5的推理能力,这里选择了yolov5s模型。
数据据制作:在众多图片数据集标注工具中,本文选择LabelImg工具进行数据集标注。
在图片标注任务完成后,LabelImg会创建一个文件来记录标注后的图片详细信息。这个文件格式可以选择的,但是YOLO只支持txt文件格式的数据,
上图中,从左至右的信息分别为标注内容的类别,归一化[16]后的中心点x坐标,y坐标以及归一化后的目标识别框的宽度和高度。在正常情况下,txt文件中,目标类别的数量与文件中的信息行数是一致的。
模型训练:首先在data目录下创建一个fall_data.yaml的数据集配置文件,如下图所示:
接下来在models下建立一个fall_yolov5s.yaml 的模型配置文件,内容如下:
最后,需要对train.py文件进行调整,设置所需的迭代次数,并选择合适的模型及其权重。完成这些设置后,就可以开始训练数据集了。训练过程中的所有输出和最终结果都将保存在runs文件夹中。
最终训练出来的结果精度还行,80%以上,勉强可以使用。
PR曲线如下:
跌倒监测数据集:
训练好的权重文件: best.pt
标注好的数据集:由于数据集压缩包大于300mb,有需要的朋友可以留下邮箱,我发你。
五、作品功能演示视频
VID_20241204_040126
点灯blinker APP,登入自己的账号进入软件监控界面,环境信息采集结果如图
GSM报警通知内容如下
跌倒测试:
稍后上传
六、项目总结
本次项目主要是用于守护空巢老人。系统由两部分组成:物联网环境监测部分和跌倒行为监测部分。环境监测部分采用ESP32系列微控制器作为核心,利用传感器来监测居住空间的温度、湿度和可燃气体浓度及烟雾浓度,并通过点灯blinker应用程序提供反馈。跌倒行为识别部分则采用YOLOv5目标检测算法,来识别老人是否跌倒,并在检测到跌倒时发出警报。
七,存在的问题及展望
1、由于时间关系,项目只是实现了部分功能,严格来讲原理样机的要求还达不到,后续还需要花时间进一步完善。
2、现有系统设计无法预测跌倒行为。为了提升系统的预警能力,我希望在未来的学习中整合人体姿态估计算法,并将其部署到嵌入式系统中,以便能够对老人的跌倒行为进行早期预测和及时干预。通过这些改进,系统可以更加有效地保障空巢老人的安全,减少潜在的安全风险。
3、树莓派的推理性能确实有点弱,只有10fps不到的样子,后续会考虑加装AI拓展板,或者更换主控。
|