FastBond智能可穿戴之心率检测
使用美信MAX30102 测量心率,oled12832显示心率BMP读数,ADP150实现锂电池3.7V转3.3V给系统供电。
标签
嵌入式系统
eelover
更新2021-11-24
1317

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

这是fastbond活动项目,主题是智能可穿戴。使用美信公司IIC接口MAX30102心率传感器芯片实现心率BPM测量并通过IIC接口oled12832显示,BPM(beats per minute)正常人通常在65-75。

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

1.美信公司心率传感器MAX30102

Fu-EOrzjviONMCr4DjB6t4Z4HWQQ

MAX30102是MAX30100的升级版本,MAX30102在其封装上加了玻璃盖,增强了芯片的抗干扰能力,使其测量效果可以达到更优,该传感器在功耗方面也具有极大的优势,一方面开发者还可通过软件来实现关断从而进行功耗管理,另外该芯片的待机功耗几乎可以忽略,正因为这些原因,目前一些手机及可穿戴智能硬件产品大量采用该方案。

MAX30102是用于可穿戴健康设备的高灵敏度脉搏血氧仪和心率传感器,用于健身和卫生保健领域,它是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了多个LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。MAX30102提供完备的系统方案,使移动及可穿戴设备的设计过程变得轻松。MAX30102采用一个1.8V电源和一个独立的3.3V用于内部LED的电源,标准的I2C兼容的通信接口。可通过软件关断模块,待机电流为零,实现电源始终维持供电状态。

主要特征

  • LED反射方案中提供心率监测仪和脉搏血氧仪生物传感器
  • 微小、5.6mm x 3.3mm x 1.55mm、14引脚光模块
    • 集成玻璃盖,实现最优、可靠的性能
  • 使移动设备以极低功耗工作
    • 可编程采样率和LED电流,节省功耗
    • 低功耗心率监测仪(< 1mW)
    • 超低关断电流(0.7µA,典型值)
  • 快速数据输出
    • 高采样率
  • 可靠的运动伪影抑制
    • 高SNR
  • -40°C至+85°C工作温度范围
  • 辅助健身设备
  • 智能电话
  • 平板电脑
  • 可穿戴设备

官网:

https://www.maximintegrated.com/en/products/interface/sensor-interface/MAX30102.html

https://www.maximintegrated.com/cn/products/interface/sensor-interface/MAX30102.html

2.ADI公司3.3V LDO ADP150

ADP150是一款超低噪声(9 μV)、低压差线性调节器,采用2.2 V至5.5 V电源供电,最大输出电流为150 mA。驱动150 mA负载时压差仅为105 mV,这种低压差特性不仅可提高效率,而且能使器件在很宽的输入电压范围内工作。

ADP150采用新颖的电路拓扑结构,实现了超低噪声性能,而无需额外的噪声旁路电容,非常适合对噪声敏感的模拟和RF应用。ADP150在提供超低噪声性能的同时,并不影响其电源抑制(PSRR)或线路与负载瞬态响应性能。它实现了超低噪声与低静态功耗的较佳组合,使便携式应用的电池使用时间可达到较长。ADP150经过专门设计,利用1 μF ± 30%小陶瓷输入和输出电容便可稳定工作,适合高性能、空间受限应用的要求。

它可提供1.8 V至3.3 V范围内的14种固定输出电压选项。短路和热过载保护电路可以防止器件在不利条件下受损。ADP150提供5引脚TSOT和4引脚、0.4 mm间距WLCSP两种小型封装,是适合各种便携式供电应用的较小尺寸解决方案。

官网:

https://www.analog.com/cn/products/adp150.html

应用

  • 移动电话
  • 数码相机和音频设备
  • 便携式和电池供电设备
  • 后置DC-DC调节
  • 便携式医疗设备
  • RF,PLL,VCO 和时钟电源

3.Seeeduino XIAO板卡

Seeeduino XIAO是Seeeduino家族中的最小成员。它使用了功能强大却低功耗的微控制器——ATSAMD21G18A-MU,在处理方面具有良好的性能,且低功耗。设计尺寸很小,可以被灵活运用于多种场景,特别是可穿戴设备和小型项目。Seeeduino XIAO具有14个通用输入输出接口(GPIO),可用作11个数字接口,11个模拟接口,10个PWM接口(d1-d10),1个DAC输出引脚D0、1个SWD焊盘接口,1个I2C接口,1个SPI接口,1个UART 接口,串行通信指示灯(T/R),闪烁指示灯(L)。LED的颜色为绿色、黄色、蓝色和蓝色分别对应电源、L、RX和TX。此外,Seeeduino XIAO具有Type-C接口,用于提供电源和数据传输。

官网:

https://wiki.seeedstudio.com/cn/Seeeduino-XIAO/

4.oled12832模块

0.91英寸的oled12832模块采用SSD1306驱动,单色128x32像素。用户可以通过IIC通信编程来显示各种类型的图形。

 

三、关键性代码及说明

项目使用arduino软件开发,十分简单,需要安装三个模块库(以及Seeeduino XIAO板卡支持):

SparkFun MAX3010x Pulse and Proximity Sensor Library、Adafruit SSD1306、Adafruit GFX library

FuDEg-rv2L1PGa8d2x6rn8KI0vGe

 

FlFjbS2KJtz4GS9e6qv0kD5b9F3d

FqcvFqPt2E1B9HWs_Djs0Q_TmWM5

将max30102模块和oled12832模块都连接到板卡的IIC 接口接口。

arduino代码如下:

#include <Adafruit_GFX.h>        //oled12832 图形库
#include <Adafruit_SSD1306.h> //oled12832 驱动
#include <Wire.h>
#include "MAX30105.h"           //MAX3010x 驱动
#include "heartRate.h"          //心率算法

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //测量平均次数
byte rates[RATE_SIZE]; //数组保存心率测量结果
byte rateSpot = 0;
long lastBeat = 0; //最后心率测量时间
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); //定义oled显示 

//小点的心率图标
static const unsigned char PROGMEM logo2_bmp[] =
{ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02, 0x10, 0x0C, 0x03, 0x10,              
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); 
  display.display();
  delay(3000);
  // 初始化传感器
  particleSensor.begin(Wire, I2C_SPEED_FAST); //IIC, 速度400kHz
  particleSensor.setup(); //使用默认设置
  particleSensor.setPulseAmplitudeRed(0x0A); //开启红色led

}

void loop() {
 long irValue = particleSensor.getIR();    //读取IR值,用于判断是否有手指接触
if(irValue > 7000){                                           //检测到手指
    display.clearDisplay();                                   //清屏
    display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);       //显示小点的心率图标
    display.setTextSize(2);                                   
    display.setTextColor(WHITE); 
    display.setCursor(50,0);                
    display.println("BPM");             
    display.setCursor(50,18);                
    display.println(beatAvg); //显示BMP平均值
    display.display();
    
  if (checkForBeat(irValue) == true)                        //检测到一个心率
  {
    display.clearDisplay();                                //清屏
    display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);    //显示大点的心率图标
    display.setTextSize(2);                               
    display.setTextColor(WHITE);             
    display.setCursor(50,0);                
    display.println("BPM");             
    display.setCursor(50,18);                
    display.println(beatAvg); //显示BMP平均值
    display.display();
    
    long delta = millis() - lastBeat;                   //两个心率的时间间隔
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);           //计算BPM

    if (beatsPerMinute < 255 && beatsPerMinute > 20) 
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //保存到数组
      rateSpot %= RATE_SIZE; //Wrap variable

      //计算平均值
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

}
  if (irValue < 7000){       //没有手指接触
     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);
     }

}

 

四、功能演示结果及说明(可添加演示图片进行解释说明)

 

Fkp6pzdrAN4eYzjygVuTPBxg99ls

 

五、对本活动的心得体会(包括意见或建议)

1.本次活动主题很丰富,几乎是没限制条件,自由发挥,希望后面多多举办类似活动。

2.网站资源很丰富,尤其是百科,简直就是电子爱好者的百宝箱。

附件下载
sketch_oct23a.rar
arduino代码
团队介绍
团队成员
eelover
单片机爱好者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号