一、项目思路
老年人身体机能逐渐下降,当老年人独自在家时,如若发生跌倒等意外,不能及时发现,则可能引起生命生命危险。安装摄像头又有隐私方面的顾虑。本项目使用毫米波雷达传感器,用来监控室内老人的活动,当发生老人跌倒的情况时,通过物联网发出警报,让老人及时得到救助。
二、硬件介绍
传感器:C1001 毫米波人体检测传感器是一款高精度 60GHz 毫米波雷达传感器,专为精准人体检测而设计。与仅能检测存在、速度和距离的标准 24GHz 毫米波传感器不同,C1001 传感器具备增强的检测功能,包括跌倒检测和睡眠检测。它能够使用点云成像算法识别人体姿势,可以检测某人是否躺下,并精确监测生命迹象。该传感器不仅可以检测运动,甚至还可以在人保持静止时进行检测,这使得 C1001 传感器在不需要移动的情况下也能检测存在,优于 PIR 等传统传感器。C1001 传感器的综合检测功能可准确、详细地了解人类活动,从而改善安全和健康监测,同时增强整体用户体验。 该传感器兼容 ESP32、micro:bit 和 Arduino UNO 开发板,可以轻松配置并与 Arduino IDE 一起使用。
- 工作电压:5V
- 工作电流:≤100mA
- 工作频率:61~61.5GHz
- 发射功率:6dBm
- 最远探测距离:11m
- 雷达探测角度:100×100度
- 工作温度:-20~60℃
- 睡眠探测距离(胸腔):0.4-2.5m
- 呼吸心跳探测距离(胸腔):0.4-1.5m
- 呼吸测量精度:90%
- 呼吸测量范围:10-25次/分钟
- 心跳测量精度:80%
- 心跳测量范围:60-100次/分钟
主控:主控我选择了M5CoreS3。CoreS3是M5Stack开发套件系列的第三代主机,其核心主控采用ESP32-S3方案,双核Xtensa LX7处理器,主频240MHz,自带WiFi功能,板载16MFLASH和8M-PSRAM,可通过TYPE-C接口下载程序,支持OTG和CDC功能,方便外接usb设备和烧录固件,正面搭载一块2.0寸电容触摸IPS屏,面板采用高强度玻璃材质,屏幕下方内置一个30万像素的摄像头GC0308,整体采用低功耗设计,并且外壳附带DinBase底座,方便实现Din导轨、挂墙以及螺丝固定,可外部DC 12V(支持9~24V)或内部500mAh锂电池供电,很方便安装接电。
三、系统设计
C1001毫米波人体检测传感器可以通过点云成像算法实现人体姿态识别,对平躺状态有准确探知;并进行精准生命探测,对跌倒状态、停留时间,身体静止驻留状态都有准确上报。传感器提供串口通讯,CoreS3使用串口与传感器相连接,获取数据。
系统分为两个部分:下位机部分,通过传感器加单片机,用来实时监控感知指定范围内人员跌倒情况,通过mqtt上传告警信息。上位机部分,通过mqtt获取信息,当获取到有人跌倒的信息时,发出警告声音,并发送短信或拨打电话(尚未实现)。
物联网mqtt这里使用的是百度iot提供的免费物联网。
四、硬件设计
C1001毫米波人体检测传感器,在跌倒模式对安装有要求。参考官方提供的文档使用顶装模式。雷达模块波束覆盖范围如下图所示。雷达覆盖范围为水平100°、俯仰100°的立体扇形区域。
确保雷达探测准确性,请置顶安装!如下图所示。
注意:需要避开房间内排风扇/金属百叶窗/遮光涂层窗帘等容易晃动的物体
C1001毫米波人体检测传感器使用四芯线缆与主控CoreS3连接,由主控负责供电,连接到CoreS3的蓝色串口上(G18/G17)。为便于安装调试,使用铰链将传感器与CoreS3固定在一起,方便传感器在一定角度内旋转。
五、软件设计
软件使用arduino编程。编程工具Vscode+platformio。DFRobot官方提供了C1001毫米波人体检测传感器读取的库文件和例子,所以直接拿来库文件就可以使用了。
下位机系统启动后,首先是初始化。需要初始化WIFI和物联网,这里需要使用互联网校时和使用物联网。初始化屏幕,使用屏幕展示当前机器状态。初始化串口,使用串口与雷达通讯,最后将雷达设置为检测跌倒模式。
void setup()
{
M5.begin(); // Init M5CoreS3. 初始化 M5CoreS3
Serial1.begin(115200, SERIAL_8N1, 18, 17); // RX TX
canvas.setColorDepth(1); // mono color
canvas.createSprite(M5.Lcd.width(), M5.Lcd.height());
canvas.setTextSize((float)canvas.width() / 160);
canvas.setTextScroll(true);
delay(1000);
init_wifi_ntp(); //初始化wifi
mqttClient.setServer(MQTT_SERVER, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
mqttClient.setCallback(callback); //设定回调方式,当收到订阅消息时会调用此方法
init_radar(); //初始化雷达
}
使用轮询的方式查询雷达状态,查看当前是否有人存在,如果有人存在,是否存在跌倒情况。当查询到有人活动时,就将活动信息上送给mqtt。
void loop()
{
uint8_t isfall = 0;
char timestr[30];
if (!mqttClient.connected())
{
reconnect();
}
mqttClient.loop();
getTimeSystem(0,timestr);
switch (hu.smHumanData(hu.eHumanPresence)) //检查是否有人出现
{
case 0:
// Serial.println("No one is present");
break;
case 1: //有人存在
Serial.print(timestr);
Serial.print(" Someone is present.");
canvas.printf("%s: %s", timestr, "Someone is present.");
isfall = hu.getFallData(hu.eFallState);
getTimeSystem(1,timestr);
snprintf(msg, 80, "{\"date\":\"%s\",\"human\":%d,\"fallen\":%d}", timestr,1,isfall);
mqttClient.publish(TOPIC, msg); //发送该主题消息
if (isfall == 0) //没有摔倒
{
Serial.println("Not fallen.");
canvas.printf("%s\r\n", "Not fallen.");
}
if (isfall == 1) //有人摔倒
{
Serial.println("fallen!");
canvas.printf("%s\r\n", "fallen!");
}
canvas.pushSprite(0, 0);
break;
default:
Serial.println("Read error");
}
delay(5000);
}
上位机使用python编程,界面部分使用pyqt设计。告警提示部分由上位机实现,目前是由电脑音箱发出警告声。电脑端比较容易扩展,一会可以扩展到短信、电话通知指定用户。
六、效果展示
放到高出,将雷达旋转对准地面。
七、心得体会:
感谢FastBond活动。对微波雷达充满了好奇。微波雷达使用较短波长的电磁波来感知世界,我总是在想象微波雷达看见的世界是怎样的。这款60GHz工作频率的毫米波雷达能够感知人的呼吸、心跳、跌倒,非常神奇,感谢电子森林,让我有机会接触、学习到这神奇的雷达。