0°

心率测试仪

简介

当前智能手表越做越火,集成的功能也越来越多,有没有注意到他们都有一个在运动过程中检测心跳频率的功能呢?下面让我们来动手学习一下这个功能,也许在以后开发的创意中就会用到。

步骤一 材料准备

硬件准备:

Arduino UNO;Genuino UNO

OLED 128×32

蜂鸣器

MAX30102高灵敏度脉搏血氧仪和心率传感器

软件准备:

arduino IDE

步骤二 原理说明

BPM是“每分钟节拍”,它们在正常人休息时约为65-75,体育运动可能低于此值,SpO2是氧饱和度水平,而正常人则高于95%。我们以Sparkfun_MAX3010x库中的示例为基础进行二次开发,只需要你伸出手指放到传感器上面,保持一段时间稳定,直到你开始听到蜂鸣器的“Beeps”与你的心跳同步或OLED动画与它同步,这个时候你就可以阅读正确的BPM。

我们需要制作OLED的位图

您看到的心脏(小)是位图图片,每当传感器检测到心跳时,我们会切换到另一个心脏(大)位图图片一段时间,它会给人一种心跳的印象,并伴有来自蜂鸣器的蜂鸣声。

下面是我们稍后在代码中调用的代码中的两个位图

心率测试仪

要制作这些,请在屏幕上查看要查看的图片(黑色和白色背景),不要忘记尺寸,我使用的是128×32像素,图片小于(32×32) px)和(24×21 px)

下载LCD Assistant并将其打开(下面几步)

心率测试仪
心率测试仪
心率测试仪
心率测试仪
心率测试仪

这是你的“数字”

心率测试仪

这就是我在代码中调用它的方式

display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
 display.drawBitmap(Starting x pos, Starting y pos, Bitmap name, Width, Height, Color);

正如您在代码中看到的那样,当检测到手指时调用一个,而如果检测到心跳则调用另一个。

在这里,你去做你想要的。

步骤三 电路搭建

心率测试仪

步骤四 编写程序

/* This code works with MAX30102 + 128x32 OLED i2c + Buzzer and Arduino UNO

 * It's displays the Average BPM on the screen, with an animation and a buzzer sound

 * everytime a heart pulse is detected

 * It's a modified version of the HeartRate library example

 * Refer to www.surtrtech.com for more details or SurtrTech YouTube channel

 */



#include <Adafruit_GFX.h>        //OLED libraries

#include <Adafruit_SSD1306.h>

#include <Wire.h>

#include "MAX30105.h"           //MAX3010x library

#include "heartRate.h"          //Heart rate calculating algorithm



MAX30105 particleSensor;



const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.

byte rates[RATE_SIZE]; //Array of heart rates

byte rateSpot = 0;

long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;

int beatAvg;



#define SCREEN_WIDTH 128 // OLED display width, in pixels

#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)



Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display)



static const unsigned char PROGMEM logo2_bmp[] =

{ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02, 0x10, 0x0C, 0x03, 0x10,              //Logo2 and Logo3 are two bmp pictures that display on the OLED if called

0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x10, 0xC0, 0x03, 0x08, 0x88,

0x02, 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,

0x00, 0x60, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x00,  };



static const unsigned char PROGMEM logo3_bmp[] =

{ 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08,

0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03,

0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00,

0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00,

0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,

0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0,

0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00,

0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00  };





void setup() {  

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display

  display.display();

  delay(3000);

  // Initialize sensor

  particleSensor.begin(Wire, I2C_SPEED_FAST); //Use default I2C port, 400kHz speed

  particleSensor.setup(); //Configure sensor with default settings

  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running



}



void loop() {

 long irValue = particleSensor.getIR();    //Reading the IR value it will permit us to know if there's a finger on the sensor or not

                                           //Also detecting a heartbeat

if(irValue > 7000){                                           //If a finger is detected

    display.clearDisplay();                                   //Clear the display

    display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);       //Draw the first bmp picture (little heart)

    display.setTextSize(2);                                   //Near it display the average BPM you can display the BPM if you want

    display.setTextColor(WHITE); 

    display.setCursor(50,0);                

    display.println("BPM");             

    display.setCursor(50,18);                

    display.println(beatAvg); 

    display.display();

    

  if (checkForBeat(irValue) == true)                        //If a heart beat is detected

  {

    display.clearDisplay();                                //Clear the display

    display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);    //Draw the second picture (bigger heart)

    display.setTextSize(2);                                //And still displays the average BPM

    display.setTextColor(WHITE);             

    display.setCursor(50,0);                

    display.println("BPM");             

    display.setCursor(50,18);                

    display.println(beatAvg); 

    display.display();

    tone(3,1000);                                        //And tone the buzzer for a 100ms you can reduce it it will be better

    delay(100);

    noTone(3);                                          //Deactivate the buzzer to have the effect of a "bip"

    //We sensed a beat!

    long delta = millis() - lastBeat;                   //Measure duration between two beats

    lastBeat = millis();



    beatsPerMinute = 60 / (delta / 1000.0);           //Calculating the BPM



    if (beatsPerMinute < 255 && beatsPerMinute > 20)               //To calculate the average we strore some values (4) then do some math to calculate the average

    {

      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array

      rateSpot %= RATE_SIZE; //Wrap variable



      //Take average of readings

      beatAvg = 0;

      for (byte x = 0 ; x < RATE_SIZE ; x++)

        beatAvg += rates[x];

      beatAvg /= RATE_SIZE;

    }

  }



}

  if (irValue < 7000){       //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure

     beatAvg=0;

     display.clearDisplay();

     display.setTextSize(1);                    

     display.setTextColor(WHITE);             

     display.setCursor(30,5);                

     display.println("Please Place "); 

     display.setCursor(30,15);

     display.println("your finger ");  

     display.display();

     noTone(3);

     }



}

步骤五 验证结果

接下来看到“跳动的心”就成功喽

提取码:无,解压码:

下载
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论