【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统-作品提交
本帖最后由 zygalaxy 于 2024-10-31 23:13 编辑<p> </p>
<p align="center"><span style="font-size:22px;"><b>基于毫米波雷达的生命体征检测及健康监护系统</b></span></p>
<p align="center"> </p>
<p align="right">作者:zygalaxy</p>
<p><span style="font-size:22px;">一、作品简介</span></p>
<p><b>作品照片:</b></p>
<div style="text-align: center;"></div>
<p> </p>
<p><b>作品功能介绍:</b></p>
<p>本系统融合毫米波雷达与多传感器技术,提供心率、呼吸频率监测及睡眠质量分析,实时数据可通过LCD屏和手机APP查看;摔倒检测功能在确认后自动报警并通知相关联系人;环境监测温湿度,异常时自动提醒用户采取措施。系统设计全面监控健康与环境,提升生活安全与舒适度。</p>
<p><b>物料清单及简介:</b></p>
<p>1、毫米波雷达传感器(MR60BHA1和MR60ADF)</p>
<p>用于非接触式检测老年人的心率、呼吸频率和摔倒情况。这些传感器利用毫米波雷达技术实现高精度的生命体征检测。</p>
<p>2、ESP32-S3开发板</p>
<p>作为系统的主控制器,执行数据处理、分析与设备控制功能。</p>
<p><b>3、ESP32-S3-LCD-BOARD</b></p>
<p>实时显示采集到的数据进行展示。</p>
<p>4、温湿度传感器</p>
<p>监测室内环境的温度和湿度变化,帮助维持适宜的生活环境。</p>
<p> </p>
<p><span style="font-size:22px;"><b>二、系统框图</b></span></p>
<p><b>设计思路:</b></p>
<p>通过集成毫米波雷达技术和多种传感器,实现对用户心率、呼吸频率、睡眠质量等健康指标的实时监测,并能在检测到摔倒等紧急情况时自动报警,同时还能监控室内空气质量,提醒用户改善居住环境,以此来提升生活质量和安全性。</p>
<div style="text-align: center;"></div>
<p><b>系统软硬件介绍:</b></p>
<p>硬件部分</p>
<p>1、毫米波雷达传感器(MR60BHA1和MR60ADF):非接触式检测心率、呼吸频率及摔倒情况。</p>
<p>2、温湿度传感器:监测室内温度和湿度。</p>
<p>3、ESP32-S3开发板:作为主控制器,负责数据处理、分析和设备控制。</p>
<p>软件部分</p>
<p>1、ESP-IDF开发框架:基于C/C++,用于开发和调试系统应用。</p>
<p>2、手机应用:实时查看健康数据,接收报警通知。</p>
<p>3、网页应用:查看健康数据。</p>
<p>4、数据分析和可视化:对健康数据进行处理,提供可视化报表。</p>
<div style="text-align: center;"></div>
<p><b>实现框图:</b></p>
<p> </p>
<div style="text-align: center;"></div>
<p><span style="font-size:22px;"><b>三、各部分功能说明</b></span></p>
<p>(1)健康监护模块</p>
<p>1、心率监测:通过MR60BHA1毫米波雷达实时监测心率,数据通过ESP32模块传输至LCD触摸屏显示器和用户手- 完成了心率监测功能,通过MR60BHA1毫米波雷达实现了非接触式的心率监测,并成功将数据传输到显示终端和手机APP。</p>
<p>2、呼吸频率监测已经可以准确捕捉呼吸频率的变化,并且在异常情况下能够及时报警。</p>
<p>3、睡眠质量监测已能提供详细的睡眠质量报告,帮助用户改善睡眠。</p>
<p> </p>
<p>实现思路:</p>
<p>通过UART esp32 与毫米波雷达传感进行通信,esp32 解析串口发送的相关数据并解析为呼吸、睡眠、心率等信息进行传递。非接触式的采集信息能够大幅度避免人体的不适。</p>
<div style="text-align: center;"></div>
<p> </p>
<p>相关部分代码:</p>
<p> </p>
<pre>
<code class="language-cpp">void app_main(void)
{
ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__);
// Initialize NVS
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
// Initialize display and LVGL
bsp_display_start();
ESP_LOGI(TAG, "Display LVGL demo");
// Lock the display to prevent interference during initialization
bsp_display_lock(0);
// Pre-initialize styles (if needed)
lv_style_pre_init();
// 创建一个屏幕
lv_obj_t *scr = lv_disp_get_scr_act(NULL);
// 创建一个容器并设置为网格布局
lv_obj_t *cont = lv_obj_create(scr);
lv_obj_set_size(cont, 480, 480); // 假设屏幕分辨率为240x135,你可以根据实际情况调整
lv_obj_center(cont);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
// 创建并配置心率标签
lv_obj_t *label_hr = lv_label_create(cont);
lv_label_set_text(label_hr, "Heart Rate: --");
lv_obj_set_style_text_font(label_hr, &lv_font_montserrat_26, 0); // 使用较大的字体
lv_obj_set_style_text_align(label_hr, LV_TEXT_ALIGN_CENTER, 0); // 文本居中
// 创建并配置呼吸率标签
lv_obj_t *label_br = lv_label_create(cont);
lv_label_set_text(label_br, "Breathing Rate: --");
lv_obj_set_style_text_font(label_br, &lv_font_montserrat_26, 0);
lv_obj_set_style_text_align(label_br, LV_TEXT_ALIGN_CENTER, 0);
// 创建并配置温度标签
lv_obj_t *label_temp = lv_label_create(cont);
lv_label_set_text(label_temp, "Temperature: --");
lv_obj_set_style_text_font(label_temp, &lv_font_montserrat_26, 0);
lv_obj_set_style_text_align(label_temp, LV_TEXT_ALIGN_CENTER, 0);
// 创建并配置湿度标签
lv_obj_t *label_humid = lv_label_create(cont);
lv_label_set_text(label_humid, "Humidity: --");
lv_obj_set_style_text_font(label_humid, &lv_font_montserrat_26, 0);
lv_obj_set_style_text_align(label_humid, LV_TEXT_ALIGN_CENTER, 0);
// 保存标签指针
hr_label = label_hr;
br_label = label_br;
temp_label = label_temp;
humid_label = label_humid;
// 设置网格布局
lv_obj_set_layout(cont, LV_LAYOUT_FLEX);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW_WRAP);
lv_obj_set_flex_align(cont, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
// Unlock the display after initialization
bsp_display_unlock();
// Initialize Wi-Fi
wifi_init();
// Main loop to handle LVGL tasks
while (1)
{
lv_task_handler(); // Process LVGL tasks
vTaskDelay(pdMS_TO_TICKS(5)); // Short delay
}
}</code></pre>
<p>(2)摔倒检测:</p>
<p>1、通过MR60ADF毫米波雷达传感器检测人体摔倒事件,确认摔倒后,系统将自动触发报警并通知相关人员。</p>
<p>2、数据记录:记录摔倒事件的时间、地点等信息,供事后分析和改善。</p>
<p> </p>
<p>实现思路:</p>
<p>通过 esp32检测雷达传感器的输出引脚,当检测到跌倒的时候会检测指定引脚的电平信号来判断是否摔倒,同时像服务器发送相关跌倒的信息进行报警。</p>
<div style="text-align: center;"></div>
<p> </p>
<p>相关部分代码:</p>
<pre>
<code class="language-cpp">// #include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#define FALL_DETECT_PIN 3 // 新增:定义摔倒检测引脚
// WiFi network credentials
const char *ssid = "ExclusiveForQuZhihang";
const char *password = "quzhihang1314!";
// MQTT broker settings
const char *mqtt_server = "192.168.2.105";
const int mqtt_port = 1883;
const char *clientId = "fall_1";
const char *mqtt_user = "zygalaxy";
// 摔倒检测主题
const char *fall_topic = "t/fall_detection"; // 新增:定义摔倒检测的主题
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload);
}
Serial.println();
}
void reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect(clientId))
{
Serial.println(" connected");
}
else
{
Serial.print(" failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
while (!Serial)
;
Serial.println("Ready");
pinMode(FALL_DETECT_PIN, INPUT_PULLUP); // 新增:设置摔倒检测引脚为输入模式,并启用内部上拉电阻
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to the WiFi network");
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
// 检测摔倒
if (digitalRead(FALL_DETECT_PIN) == LOW) // 新增:如果摔倒检测引脚为低电平
{
Serial.println("Fall detected!");
// 发送摔倒信息
client.publish(fall_topic, "Fall Detected"); // 新增:发布摔倒信息
// 可以添加延迟或其他逻辑来避免重复发送
delay(3000); // 等待一段时间,防止连续触发
}
delay(200);
}</code></pre>
<p> </p>
<p>(3)环境监测模块</p>
<p>1、空气质量监测:集成空气温湿度传感器,实时监测室内空气温湿度。</p>
<p>2、环境信息展示:在LCD触摸屏和手机APP上实时展示空气温湿度等环境信息。</p>
<p>3、报警系统:当空气质量参数超出正常范围时,系统会自动报警。</p>
<p> </p>
<p>实现思路:</p>
<p>通过 esp32 驱动 dht11 温湿度传感器,读取温湿度信息,通过 mqtt 协议把数据发送到服务端进行储存,以便于监护者能够准确获取室内舒适度信息。</p>
<div style="text-align: center;"></div>
<p> </p>
<p>相关部分代码:</p>
<pre>
<code class="language-cpp">// #include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// WiFi network credentials
const char *ssid = "ExclusiveForQuZhihang";
const char *password = "quzhihang1314!";
// MQTT broker settings
const char *mqtt_server = "192.168.2.105";
const int mqtt_port = 1883;
const char *clientId = "humidity_1";
const char *mqtt_user = "zygalaxy";
// 温湿度主题
const char *humidity_topic = "t/humidity";
// 'payload': '{"humidity": 57, "temperature": 25}'
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload);
}
Serial.println();
}
void reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect(clientId))
{
Serial.println(" connected");
}
else
{
Serial.print(" failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup()
{
Serial.begin(115200);
while (!Serial)
;
Serial.println("Ready");
Serial.println(F("DHTxx test!"));
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to the WiFi network");
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
int a = 0;
void loop()
{
if (!client.connected())
{
reconnect();
}
// 读取温湿度
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f))
{
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
client.loop();
// 定义发送的数据
String payload = "{\"humidity\":" + String(h) + ",\"temperature\":" + String(t) + "}";
client.publish(humidity_topic, payload.c_str());
delay(200);
}</code></pre>
<p> </p>
<p><span style="font-size:22px;"><b>四、作品源码</b></span></p>
<p><b>作品源码:</b><a href="https://download.eeworld.com.cn/detail/zygalaxy/634864"><b><u>https://download.eeworld.com.cn/detail/zygalaxy/634864</u></b></a></p>
<p><b>(</b><b>注意</b><b>:</b><b>运行项目需要确保安装环境搭建文档全部搭建好环境</b><b>)</b></p>
<p><span style="font-size:22px;"><b>五、</b><b>作品功能演示视频</b></span></p>
<p> </p>
<p><iframe allowfullscreen="true" frameborder="0" height="450" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&lessonid=41499" style="background:#eee;margin-bottom:10px;" width="700"></iframe></p>
<p> </p>
<p><span style="font-size:22px;"><b>六、项目总结</b></span></p>
<p><b>项目总结:</b></p>
<p>通过项目整合与调试,我成功地将基于毫米波雷达的生命体征检测及健康监护系统各个模块整合在一起,实现了健康监护和环境监测的功能。在调试过程中,我解决了各种问题,确保了系统的稳定性和可靠性。未来,我将继续优化系统的功能和性能,为用户提供更加智能化、便捷化的健康监护与环境监测服务。</p>
<p><b>帖子分享链接汇总:</b></p>
<ol>
<li><a href="https://bbs.eeworld.com.cn/thread-1297669-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297669-1-1.html</u></b></a></li>
<li align="justify"><b>https://bbs.eeworld.com.cn/thread-1297670-1-1.html</b></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297673-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297673-1-1.html</u></b></a></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297671-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297671-1-1.html</u></b></a></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297674-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297674-1-1.html</u></b></a></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297704-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297704-1-1.html</u></b></a></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297705-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297705-1-1.html</u></b></a></li>
<li align="justify"><a href="https://bbs.eeworld.com.cn/thread-1297763-1-1.html"><b><u>https://bbs.eeworld.com.cn/thread-1297763-1-1.html</u></b></a></li>
<li align="justify"><b><a href="https://bbs.eeworld.com.cn/thread-1297752-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1297752-1-1.html</a></b></li>
</ol>
<p><strong><span style="font-size:22px;">七、其他</span></strong></p>
<p><b>心得体会:</b></p>
<p>通过参加本次的【2024 DigiKey创意大赛】让我收获良多,学习了许多没有接触到的新知识,比如 ESP-IDF环境的开发,以及数据传输等多种方式,再次感谢本次大赛给我提供这么好的平台,祝大赛越办越好!</p>
<p> </p>
页:
[1]