前言
比较简单的一个项目,为了检测到人体的一些健康指标,同时模拟心肺复苏,略微记录一下供大家参考,都是模块化的东西,开发板用的是Arduino UNO,用到的模块有RFP602压力传感器、max30102心率血氧传感器、ASR-PRO智能语音模块、IIC的0.96寸OLED、MPU6050、蜂鸣器、热敏电阻温度传感器、面包板。
模块介绍
RFP压力传感器
本项目用的是四针脚,VCC、GND、D0、A0,支持输出数字量和模拟量,该模块在本项目中负责模拟胸部按压,计算出胸部按压频率,显示在OLED上。
实现
代码略长,这就不粘给大家了😃,讲一下大致思路吧。
压力传感器我用的是数字引脚,即指判断高电平还是低电平,大家在 实现的时候也可以使用模拟引脚,通过判断引脚输出的模拟量去判断是否按下,这样会更精确一点。Loop()中扫描按键是否按下(但是个人觉得使用中断会好一点,当时就图了个简单),没按下的话执行其余模块代码(后续会讲到)。按键按下后,开始记录当前按压次数,并且蜂鸣器开始以每分钟100次的频率响,当第一次检测到压力传感器按下后开始计数,简单起见可以不使用定时器,直接使用millis()函数记录压力传感器第一次按下后程序运行的时间,以后每次按下后记录下当前时间并和第一次的时间做差,除以按压计数值,得到按压频率,通过串口输出至下位机。
MAX30102心率传感器
实现
这个模块使用起来就比较 简单了,测心率还是通过算法去实现,如果想做到精确测量,在模块与皮肤的接触上个人认为可能需要下点功夫,因为这个模块根据接受的压力不同,最终检测到的心率也不同,用的是IIC的协议,买到模块后直接找客服要代码链接,github上也有,只需要 把库加进自己arduino的lib,不会调用的话可以看example里的代码,英语翻译一下就明白了,注意看一下原理图,别到时候硬件连接错误。
ASR-PRO语音模块
实现
顾名思义,就是当某个状态出现异常后通过语音播报出来。说它是一个模块,倒不如说是一块开发板,我用的是ASR-PRO核心板,开发环境用的是天问Block,图形化编程,非常简单,实在不会的话官方也提供了很多例程,修改一下就是自己的。
本项目中通过检测相应IO口电平输出对应语音,本项目需要播报四种异常,二进制三个IO口就够用了,初始状态(正常状态)下也需要占用一种,即五种。
MPU6050
实现
用于检测颈部角度,使用IIC协议,当颈部在X方向或Y方向偏离过大时,三个IO口输出对应高低电平,ASR-PRO播放“颈部异常”,同时串口输出XY方向角度,下位机通过OLED显示。
热敏传感器*2
实现
一个用于检测鼻腔温度,一个用于检测口腔温度,调节旋钮,当温度大于一定值时,传感器引脚输出高电平,arduino上的三个IO口输出对应高低电平,大家可以采用四针脚传感器,输出模拟量,更精确一点。
下位机
项目本来只打算使用一个 Arduino uno开发板,总共用到3个设备都是基于IIC协议,初始化过程中OLED一直初始化失败,但是任意两个IIC模块初始化都是无误,本来以为是因为模块 太多,需要调整Arduino开发板内部上拉电阻阻值,但是使用SPI协议的OLED仍然初始化失败,做项目时时间紧任务重,这个问题也就搁置了,因此就使用了两个Arduino UNO开发板,将OLED从一块开发板中分割出去,一个负责计算心率、角度、温度等,两块开发板使用串口连接,另一个只负责将串口接收到数据进行分割后显示至OLED,显示的开发板在本项目中用作下位机,两块开发板同时检测按键是否按下(即是否开始模拟胸部按压),当下位机检测到按键按下后,OLED只显示按压频率,不显示其他信息;上位机检测到按键按下后,只负责计算当前胸部按压频率,不做其他数据的采集。
问题与总结
因为是负责别人的项目,已经写好策划书,并且时间比较着急,无奈只能使用Arduino开发板,总结下来不管是在硬件的选型上和代码的设计上,还是存在很多地方可以优化。
硬件选型 :个人认为针对这种模块较多的项目,还是使用STM32或GD32算力更强一点的开发板运行起来会更稳定一点,另外,Arduino UNO的外设确实有点少。其次本项目使用面包板搭建的电路,硬件连接极不稳定,有条件的话大家可以用洞洞板或者画一下PCB。
代码优化:
1.按键部分使用中断触发。
2.Arduino UNO开发板也支持FreeRTOS操作系统,个人认为可以加入其中,不管是代码可读性和执行效率上。
问题 :
1.第一点就是上面提到的OLED初始化失败问题,个人推测是模块过多,需要修改开发板内的上拉电阻,大家在有条件的情况下可以使用示波器测一下。
2.下位机的OLED在显示上会出现刷新频率过低 问题,导致肉眼看到的OLED一直在闪,按道理来说Arduino的时钟频率在16MHz,应该不会出现这种问题,个人推测是由于串口波特率设置的太低,在代码逻辑上可以加上对串口分割的数据上加上判断,只有与上一次的数据不同时才更新显示OLED。