Arduino之个人健康助理——简易智能药盒系列2
作者:互联网
OLED显示
1.所需硬件
脉搏传感器
OLED模块
Arduino主板
2.连接方式
脉搏传感器与主板连接
s — A0
+— 5V
-— GND
OLED模块与主板连接
GND—GND
VCC—3.3V或5V
SCL—A5
SDA—A4
3.基本思路
脉搏传感器原理
首先,需要简要了解一下脉搏传感器大致原理。
脉搏传感器能把脉搏跳动压力转化为电信号输出(以电压形式)。基于这种原理,就可以利用电压值的变化计算脉搏跳动数。
计算脉搏数的思路
如图,跳离直线y=v0的点A1,A2,A3可表示为脉搏跳动的点(脉搏跳动,输出电压增大),而直线y=v0上的其余点则为脉搏平静时的点。如果可以获得每次跳动时的时刻点t1,t2,t3,从而求得Δt,就可利用 跳动次数=总时间/时间间隔 的公式求得每段Δt上的平均脉搏数。
绘制心率图的思路
因为脉搏的跳动导致电压的变化,于是就可以利用电压的变化来绘制折线图(先绘点,再连线)。将某一点的电压值以一定比例缩放为合适的值,作为该点的纵坐标,对应该点的横坐标(横坐标对应时刻点)。随着时间变化,点的横坐标向前推移,纵坐标随之变化。此时再将点与点之间连上直线,即可绘制出心率折线图。
4.代码
声明
#include <Adafruit_SSD1306.h> //调用一个库文件
#define OLED_Address 0x3C //用OLED_Address取代0x3C
//0x3C——16进制数(通讯地址)
#define UpperThreshold 550 //用UpperThreshold取代550
#define LowerThreshold 500 //用LowerThreshold取代500
//UpperThreshold,LowerThreshold为引脚输出模拟电压值的阈值
Adafruit_SSD1306 oled; //定义变量名为oled
定义变量
//定义变量
int x=0; //当前点的横坐标
int lastx=0; //上一个点的横坐标
int lasty=0; //上一个点的纵坐标
int LastTime=0; //上一次测量的毫秒数
bool BPMTiming=false; //LastTime是否为正确的脉搏起始计时点
bool BeatComplete=false; //一次跳动是否完成=是否可以开始计算下一次跳动(取决于起始计时点是否正确和是否为跳动间隔期)
int BPM=0; //脉搏跳动数
setup函数
void setup() {
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address); //初始化oled屏幕的通讯地址为OLED_Address(也就是0x3C)
oled.clearDisplay(); //oled清空显示
oled.setTextSize(2); //设置oled显示字体为2号字体
}
loop函数
void loop()
{
if(x>127) //若屏幕显示已满,清空再来
{
oled.clearDisplay(); //oled清空显示
x=0; //当前点横坐标赋值为0
lastx=x; //上一个点横坐标也为赋值为0
}
int value=analogRead(0); //analogRead函数用于读取引脚的模拟电压值,参数0表示所有获取电压值的引脚为A0,返回值为引脚的模拟量电压值
oled.setTextColor(WHITE); //oled显示字体为白色
int y=20-(value/45); //当前点的纵坐标(取决于引脚获取的电压值)
oled.writeLine(lastx,lasty,x,y,WHITE); //从上一个点到当前点画线
lasty=y; //将当前点坐标赋给上一个点,当前点变成上一个点
lastx=x;
//计算BMP
if(value>UpperThreshold) //如果跳动
{
if(BeatComplete) //如果上一次跳动完成,可以开始计算下一次跳动
{
BPM=millis()-LastTime; //millis函数返回的Arduino板开始运行当前程序时的毫秒数,两次测量中间间隔的毫秒数
BPM=int(60/(float(BPM)/1000)); //计算BPM(跳动数=总时间/跳动时间间隔)
BPMTiming=false; //该次跳动的BPM值已经计算,要进入下一次BPM计算,而起始计时点还为原来的起始计时点
BeatComplete=false; //起始计时点错误,跳动未完成
}
if(BPMTiming==false) //将起始计时点变为正确起始计时点
{
LastTime=millis(); //将现在的毫秒数赋变为上一次的毫秒数
BPMTiming=true;
}
}
if((value<LowerThreshold)&(BPMTiming)) //如果起始计时点正确且进入跳动间隔期
BeatComplete=true; //一次跳动完成
//显示BMP值
oled.writeFillRect(0,19,128,20,BLACK); //画一个填充矩形
oled.setCursor(0,19); //设置oled内容显示的位置
oled.print(BPM); //设置oled显示的内容
oled.print(" BPM");
oled.display(); //设置完成,更新显示内容
x++; //横坐标+1,进入下一个循环
}
5.最终效果
最终OLED模块上显示出心率折线图和脉搏数(BPM)。
PS: 代码小白初次尝试,还请大佬们多多包涵,多多指点。
标签:Arduino,int,BPM,OLED,简易,oled,跳动,脉搏,药盒 来源: https://blog.csdn.net/m0_46686583/article/details/105275453