FastBond智能可穿戴之心率检测
利用Arduino 2560,心率传感器模块搭配,简单的进行心率的检测。
标签
智能可穿戴
心率
血氧
卡酷库卡
更新2021-12-13
1237

一、项目介绍(包括设计思路、软硬件介绍等)

本次选择的是fastbond主题一:智能可穿戴。利用美信公司IIC接口MAX30102心率传感器模块来实现心率BPM测量,并通过IIC接口oled12832显示,BPM(beats per minute)正常人通常在65-75。

二、项目用到的板卡、芯片、模块、仪器、设备等介绍

1、心率传感器MAX30102(Maxim)

MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。
MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应用于可穿戴设备进行心率和血氧采集检测,佩戴于手指、耳垂和手腕等处。标准的I2C兼容的通信接口可以将采集到的数值传输给Arduino、KL25Z等单片机进行心率和血氧计算。此外,该芯片还可通过软件关断模块,待机电流接近为零,实现电源始终维持供电状态。正因为其优异的性能,该芯片被大量应用在了三星Galaxy S系列手机。与前代产品MAX30100相比,该芯片集成了玻璃盖可以有效排除处界和内部光干扰,拥有最优可靠的性能。

FgrGirbFLYvJTH_BgJj8oEIVcWtR
优点和特点

· 心率监测器和脉搏血氧计传感器输入LED反射溶液
· 微型5.6毫米x 3.3毫米x 1.55毫米14针光学模块
· 集成的盖玻片提供最佳、坚固的
· 移动设备超低功率运行
· 可编程采样率和LED电流节电
· 低功率心率监测器(<1兆瓦)
· 超低停机电流(0.7μA,典型值)
· 快速数据输出能力
· 采样率高
· 强大的运动伪影复原能力
· 高信噪比
· -40°C至+85°C工作温度范围

2、电源芯片ADP7158(ADI)

ADP7158是一款线性稳压器,采用2.3 V至5.5 V电源供电,最大输出电流为2 A。该器件采用先进的专有架构,提供高电源抑制和超低噪声特性,仅需一个10 μF陶瓷输出电容,便可实现出色的线路与负载瞬态响应性能。

FsgnKogDwDKKpL_0A8jb_Klds2Su

  • 输入电压范围:2.3 V至5.5 V
  • 可提供1.2 V至3.3 V的16路标准电压
  • 最大负载电流:2 A
  • 低噪声
    • 100 Hz到100 kHz总积分噪声:0.9 µV rms
    • 10 Hz到100 kHz总积分噪声:1.6 µV rms
  • 噪声频谱密度:1.7 nV/√Hz(10 kHz到1 MHz)
  • 电源抑制比(PSRR)
    • 70 dB(1 kHz至100 kHz);50 dB (1 MHz),VOUT = 3.3 V,VIN = 4.0 V
  • 电压差:200 mV(典型值,IOUT = 2 A,VOUT = 3.3 V)
  • 初始精度:±0.6%(ILOAD = 10 mA时)
  • 在整个线路、负载与温度范围内的精度:±1.5%
  • 静态电流:IGND = 4.0 mA(空载),9.0 mA (2 A)
  • 低关断电流:0.2 μA
  • 使用10 µF陶瓷输出电容保持稳定
  • 10引脚3 mm x 3 mm LFCSP和8引脚SOIC封装
  • 精密使能
  • ADIsimPower工具支持

3、Arduino 2560

 Arduino Mega 2560是基于ATmega2560的主控开发板。Arduino Mega2560是采用USB接口的核心电路板。具有54路数字输入输出,适合需要大量IO接口的设计。处理器核心是ATmega2560,同时具有54路数字输入/输出口,16路模拟输入,4路UART接口,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header和一个复位按钮。板上有支持一个主控板的所有资源。Arduino Mega2560也能兼容为Arduino NUO设计的扩展板。可以自动选择3中供电方式:外部直流电源通过电源插座供电;电池连接电源连接器的GND和VIN引脚;USB接口直流供电。

FvzOw3lSstgLmqLyGgMNy2P2UJ4y

4、0.96 oled显示屏

 

三、硬件设计

使用Arduino进行开发非常的便捷,他有强大的库支持,根据心率模块和Arduino2560的引脚图进行接线,连接上ADI的电源部分即可。

FjWwF7lRKp8KnT2P3kYTpshqkx7J

整体接线如上图

四、关键性代码说明

具体代码如下:

#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

  
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;

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing...");

  display.begin(SSD1306_SWITCHCAPVCC);
  
  display.clearDisplay();
  display.display();

  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED


}

void loop()
{
  long irValue = particleSensor.getIR();
  if (irValue > 7000)
  { 
  if (checkForBeat(irValue) == true)
  {
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      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;
    }
  }
    display.clearDisplay();

    display.setTextSize(2);                               
    display.setTextColor(WHITE);             
    display.setCursor(50,0);                
    display.println("BPM");   
    display.setCursor(50,18);                
    display.println(beatAvg); //显示BMP平均值
    display.display();

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);
  Serial.println();
  delay(1);
  }
  else
  {
    display.clearDisplay();

    display.setTextSize(1);                               
    display.setTextColor(WHITE);             
    display.setCursor(20,0);                
    display.println("Please Place");  
    display.setCursor(20,20);                
    display.println("your finger ");   
    display.display();
  }
}

五、心得体会

很幸运能发现这一次的活动,作为一个新手,有强大的arduino生态的支持,一切的难题都可以迎刃而解。后期也会在这个板字的基础上进行功能的扩充,增加计步器、时钟、温湿度等模块,逐步完善可穿戴的功能。

附件下载
核心代码.pdf
团队介绍
一个刚开始接触Arduino的小菜鸟,还在努力学习中ヾ(◍°∇°◍)ノ゙
团队成员
卡酷库卡
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号