290|1

43

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【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拓展板,或者更换主控。

best.pt

13.73 MB, 下载次数: 1

DigiKey_contest_2024_word.doc

5.58 MB, 下载次数: 8

最新回复

确实是,救治的黄金时间往往都是很多的,快速监测到很重要   详情 回复 发表于 2024-11-1 11:16
点赞 关注
 
 

回复
举报

6168

帖子

6

TA的资源

版主

沙发
 

确实是,救治的黄金时间往往都是很多的,快速监测到很重要

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表