← 返回

基于FreeRTOS的老人跌倒检测

基于FreeRTOS的老人跌倒检测

开发时间:2024年6月

使用技术:STM32, FreeRTOS, MPU6050, MAX30100

项目介绍

这是一款基于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实时操作系统