Arduino之个人健康助理——简易智能药盒系列2

OLED显示

1.所需硬件

脉搏传感器
脉搏传感器
OLDE模块
OLED模块
Arduino主板
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: 代码小白初次尝试,还请大佬们多多包涵,多多指点。

发布了1 篇原创文章 · 获赞 3 · 访问量 60

猜你喜欢

转载自blog.csdn.net/m0_46686583/article/details/105275453