文章目录
1 简介
Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目
大家可用于 课程设计 或 毕业设计
🧿 毕设项目分享:见文末!
2 绪论
2.1 课题背景与目的
现代科学的发展, 导致越来越多人开始重视自己的身体健康, 他们往往会想在能力之余使用健身运动等方式来锻炼自身。 你会发现, 在健身房, 健身达人或者是教练都会叮嘱新手去关注自己的心率节奏。 一般来说, 人的激烈的锻炼会造成心脏血压的上升,心率变化从而加剧。 而心率恰恰就作为人们运动的警戒和灯塔, 运动状态下, 心率的平稳状态、 是否处于正常范围内都是健身人士应该注意的地方, 不管你健身的目的是为了什么, 而这更多的是与自身体重、 体制等的相关。 与此同时, 心率的表现也能让人们能及时发现身体的异样。 心率不定往往会造成。 心脏、 心血管等疾病。 但往往是如此致命的病, 检测其的方式就很简单。 而心率检测的作用, 就是作为一个实时监控并且在危急时刻能警报你的装置, 由此可得出心率检测仪对人们的作用十分重要。
在越来越智能化的现代社会中, 智能医疗已经开始慢慢步入寻常人家。 对于人们来说, 在越来越追求生活品质的现在, 身体健康的需求同样是他们的刚需。 在致力于解决现代医学看病容易预约难的情况下, 便携式的只能家用健康医疗设备就体现出了它存在的意义——足不出户就能轻松做到健康检测和疾病预防。
3 系统设计
3.1 系统架构
学长设计的这个在基于 STM32 控制板外, 另一个主要的板块就是做到如何去采集到心率数据的样本。
关于 MAX30100, 其在简易心率检测仪中使用量非常的大, 是一个优质的心率监测器传感器。 MAX30100 利用其本身含有的 LED 和光电检测端来检测信号的接收,以显示心率数据。
另外, 在该系统中 STM32 是主要微控制器和数据处理器; 利用 OLED 屏实现动态心率的实时监控, 即数据显示; 利用蓝牙串口可以将数据输出显示。 电源将设置一个 3. 5V-8V 的电源, 在选择合适电源电压供给的情况下输出电源给各模块进行使用。
3.2 关键硬件部分
3.2.1 MAX301 00 心率血氧模块
MAX30100 是一个经过多重优化的优秀传感器, 能测量心率等多样信息。在结构上,MAX30100 包含了检测模块和数据处理模块, 检测模块下拥有 LED、 数据接收器等部分,数据处理部分主要包含了寄存器、 数据传输等。 在该系统中, 便利用了 MAX30100 对样本进行心率检测并进行数据处理。
实物图:
电路图:
使用这个传感器的方式很简单, 手指接触传感器表面的玻璃层, 不能被吸收的红外线部分光会传达到接受处, 从而对样本的心率数据进行计算。 心率的信息在这个过程中从电信号转换为光信号, 又经过 MAX30100 转换成电信号, 从而将数据信息做成已采集样本储存起来。
3.3 关键软件部分
3.3.1 数据读取流程
数据读取基本是靠中断引脚触发主控芯片中断, 触发中断后由主控芯片进行读取MAX30100 的中断寄存器, 从而判断是由哪个触发。 例如温度中断就读取温度值, 过一段时间再发送采集温度指令然后过一段时间产生中断, 这样重复进行。 血氧不用发送指令, 当 FIFO 数据快满了后就会发出中断提醒单片机读取, 进入待机和省电模式将会关闭这些功能。
设法将 MAX30100 设置为 HR 模式并读取原始 IR 数据后, 绘制完成后, 其外观应如图
3.4 实现效果
3.5 部分相关代码
/************************************************
************************************************/
// 心率计算
struct fifo_t {
uint16_t rawIR;
uint16_t rawRed;
};
dcFilter_t MAX30100::dcRemoval(float x, float prev_w, float alpha)
{
dcFilter_t filtered;
filtered.w = x + alpha * prev_w;
filtered.result = filtered.w - prev_w;
return filtered;
}
// 传感器数据滤波
struct meanDiffFilter_t
{
float values[MEAN_FILTER_SIZE];
byte index;
float sum;
byte count;
};
float MAX30100::meanDiff(float M, meanDiffFilter_t* filterValues)
{
float avg = 0;
filterValues->sum -= filterValues->values[filterValues->index];
filterValues->values[filterValues->index] = M;
filterValues->sum += filterValues->values[filterValues->index];
filterValues->index++;
filterValues->index = filterValues->index % MEAN_FILTER_SIZE;
if(filterValues->count < MEAN_FILTER_SIZE)
filterValues->count++;
avg = filterValues->sum / filterValues->count;
return avg - M;
}
struct butterworthFilter_t
{
float v[2];
float result;
};
void MAX30100::lowPassButterworthFilter( float x, butterworthFilter_t * filterResult )
{
filterResult->v[0] = filterResult->v[1];
//Fs = 100Hz and Fc = 10Hz
filterResult->v[1] = (2.452372752527856026e-1 * x) + (0.50952544949442879485 *
filterResult->v[0]);
filterResult->result = filterResult->v[0] + filterResult->v[1];
}
/*******************************************************************
篇幅有限,只展示部分代码
********************************************************************/
🧿 毕设项目分享:见文末!
4 最后
**项目分享: ** https://blog.csdn.net/m0_984093