基于FreeRTOS的老人跌倒检测

项目介绍
这是一款基于FreeRTOS的老人跌倒检测系统,集成了姿态检测和心率监测功能。通过MPU6050检测运动状态,MAX30100监测心率,当检测到异常时及时发出警报。
血氧数据采集与处理
数据采集代码
MAXData.c
void MAXData(void *argument)
{
static int i = 0; // 数据采集索引
uint32_t DCRED; // 存储红光数据
update(); // 更新传感器数据
DCRED = -removeRedDcComponent(rawIRValue)*2; // 去除直流分量并放大
Data[i++] = DCRED; // 存储数据到缓冲区
if(i==300) // 采集300个数据点后
{
xSemaphoreGive(MAXStartHandle); // 发送信号量,触发数据处理
i = 0; // 重置索引
}
}
数据处理代码
MAXProcess.c
void smoothFilter(const int *data, int *smoothedData, int size, int windowSize) {
int sum; // 滑动窗口内数据和
int count; // 窗口内有效数据点数
// 检查窗口大小是否有效
if (windowSize <= 0 || windowSize >= size) {
return;
}
// 对每个数据点进行平滑处理
for (int i = 0; i < size; i++) {
sum = 0;
count = 0;
// 计算窗口内的平均值
for (int j = i - windowSize / 2; j <= i + windowSize / 2; j++) {
if (j >= 0 && j < size) {
sum += data[j];
count++;
}
}
smoothedData[i] = sum / count; // 保存平滑后的数据
}
}
void MAXUsing(void *argument)
{
for(;;)
{
// 等待数据采集完成的信号
if (xSemaphoreTake(MAXStartHandle,portMAX_DELAY)) {
xTimerStop(MAXDataHandleHandle,0); // 停止数据采集定时器
smoothFilter(Data,smooth,BuffLenth,3); // 平滑滤波处理
int index; // 波峰间隔
float cot; // 有效周期计数
float sum; // 周期总和
float Heart; // 计算得到的心率
// 寻找有效波峰并计算周期
for(int i = 0;i<300;i++)
{
// 检测波峰起始点
if(smooth[i]>70&&smooth[i]<300)
{
index = i;
// 寻找波谷
while(smooth[i]>0)
{
i++;
if(i==BuffLenth-1) break;
}
// 寻找下一个波峰
while(smooth[i]<70)
{
i++;
if(i==BuffLenth-1) break;
}
index = i-index; // 计算周期长度
// 仅计算有效周期
if(index>23)
{
sum+= index;
cot++;
}
}
}
// 计算心率
Heart = (float)(sum/cot)*0.015; // 转换为时间(秒)
Heart = 60/Heart; // 转换为每分钟心跳次数
HeartFre= Heart;
sum = 0;
cot = 0;
// 检查心率是否异常
if((HeartFre>160&&HeartFre<250)||HeartFre<30)
{
xEventGroupSetBits(TaskStauteHandle,1<<0); // 设置异常标志
}
xSemaphoreGive(OLEDShowSemHandle); // 触发显示更新
xTimerStart(MAXDataHandleHandle,0); // 重启数据采集定时器
}
}
}
- 采样率:15ms/次
- 数据缓存:300点采样
- 滑动窗口平滑滤波
- 心率计算:60/周期时间
- 异常判断:心率>160 || 心率<30
硬件组成
- STM32F103C8T6主控
- MAX30100心率血氧检测模块
- MPU6050姿态检测模块
- 0.96寸OLED显示模块
主要功能
- 实时心率监测
- 运动姿态检测
- 跌倒阈值报警
- OLED实时显示
- 多任务并行处理
FreeRTOS任务设计

- MPU6050数据集任务(高优先级)
- MAX30100数据处理任务
- MPU状态异常处理任务
- OLED刷新任务
系统架构
- 使用硬件I2C通信
- 定时器替代系统滴答定时器
- 信号量管理任务同步
- 事件组标记系统状态
- 全局缓存区管理数据
关键技术
- 15ms采样率的心率数据采集
- 加速度阈值跌倒检测
- 多任务并行处理
- 实时数据显示和警报
开发环境
- STM32CubeMX配置工具
- Keil MDK开发环境
- FreeRTOS实时操作系统