使用 MAX30102 测量心率和 SpO2
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
介绍
嗨,在本教程中,我们将连接 MAX30102:脉搏血氧仪和心率监测模块与 Arduino UNO 板,然后使用该模块 + OLED 显示屏和蜂鸣器制作测量 BPM 的项目。
BPM是“每分钟节拍数”,正常人休息时在65-75左右,田径运动可能比这个低,SpO2是氧饱和度,正常人在95%以上。>
MAX30102可以在不同的模块中找到,我有一个WAVGAT版本,只要IC是MAX30102就没有问题。
组件
这是我要使用的东西
图> 图> 图>
测试:
我在教程中使用的代码非常清晰,它们只是来自 Sparkfun_MAX3010x 库的示例。
对于我为 OLED 和蜂鸣器制作的代码,它是“HeartRate”示例的修改版本,它要求您将手指放在传感器上。
放好手指后,保持冷静一段时间,直到您开始听到蜂鸣器的“哔”声与您的心跳同步或 OLED 动画与之同步,然后您才能读取正确的 BPM。
注意:在代码中,我实际上打印了平均 BPM,因为它是 4 个 BPM 的平均值,所以只要给它一些时间就更准确了。
为 OLED 制作位图
您看到的心脏(小)是位图图片,每次传感器检测到心跳时,我们会切换到另一张心脏(大)位图图片一段时间,它给人的印象是心跳和蜂鸣器发出哔哔声。
下面是代码中我们后面调用的两个位图
为了制作这些,在屏幕上寻找一张你想在屏幕上看到的图片(黑色和白色背景),不要忘记尺寸,我使用的是 128x32 像素,图片比那个小(32x32 px) 和 (24x21 px)
下载 LCD 助手并打开它(以下几步)
图> 图> 图> 图>这是你的“数字”
这是我在代码中的调用方式
display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
这意味着
display.drawBitmap(Starting x pos,Starting y pos, Bitmap name, Width, Height, Color);
正如您在代码中看到的那样,当检测到手指时调用一个,如果检测到心跳则调用另一个。
在这里,您可以随心所欲。
代码
- MAX_BPM_OLED_Buzzer.ino
MAX_BPM_OLED_Buzzer.inoArduino
从 SparkFun MAX3010x 库修改/* 此代码适用于 MAX30102 + 128x32 OLED i2c + 蜂鸣器和 Arduino UNO * 它在屏幕上显示平均 BPM,带有动画和蜂鸣器声音 * 每次检测到心脏脉搏时 *这是 HeartRate 库示例的修改版本 * 有关更多详细信息,请参阅 www.surtrtech.com 或 SurtrTech YouTube 频道 */#include//OLED 库#include #include #include "MAX30105.h" //MAX3010x library#include "heartRate.h" //心率计算算法MAX30105particleSensor;const byte RATE_SIZE =4; //增加这个以获得更多的平均。 4 是好的。字节率[RATE_SIZE]; //心率数组byte rateSpot =0;long lastBeat =0; //最后一个节拍发生的时间float beatsPerMinute;int beatAvg;#define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位#define SCREEN_HEIGHT 32 // OLED 显示高度,以像素为单位#define OLED_RESET -1 // 复位引脚#(或-1 如果共享 Arduino 复位引脚)Adafruit_SSD1306 显示(SCREEN_WIDTH、SCREEN_HEIGHT、&Wire、OLED_RESET); //声明显示名(display)static const unsigned char PROGMEM logo2_bmp[] ={ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x,0x0100 , //Logo2和Logo3是OLED上显示的两张bmp图片,如果调用0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x10, 0x,0x030,0x80 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,0x00,0xB,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x6,0x6 0x0E, 0x00, 0x00, 0x04, 0x00, };static const unsigned char PROGMEM logo3_bmp[] ={ 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x,100,0x,100,0x,0x,100, 0x80, 0x08,0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x80,0x,0,0x,0,0,0x,0,0,0x,0,0,0x,0,0x,0,0x,0,0x,0,0x,0 0×01,0x80的,0×00,为0x1C,0×01,0x80的,0x00时,0×14,0x00,0x80,0x00时,0×14,0×00,0x80的,0x00时,0×14,0×00,0x40的,0x10的,0×12,0×00,0x40的,0x10的,0×12,0×00, 0x7E、0x1F、0x23、0xFE、0x03、0 x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,0x00, 0x60, 0xE0, 0x10, 0x00, 0x,0x,0x,0x,0x0,0x,0x0,0x,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 060 0x40, 0xC0,0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30,0,0x,0 0x,0,0 0x,0,0 0x,0,0 0x,0,0 0 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00 };void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //启动OLED显示屏 display.display();延迟(3000); // 初始化传感器particleSensor.begin(Wire, I2C_SPEED_FAST); //使用默认I2C端口,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); //绘制第一张bmp图片(小心脏) display.setTextSize(2); //在它附近显示平均BPM如果你想要可以显示BPM display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg);显示。显示(); if (checkForBeat(irValue) ==true) //如果检测到心跳 { display.clearDisplay(); //清除显示 display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //绘制第二张图片(更大的心) display.setTextSize(2); //并且仍然显示平均BPM display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg);显示。显示();音调(3,1000); //并将蜂鸣器调 100 毫秒,您可以减少它,延迟会更好(100);无音(3); //关闭蜂鸣器以产生“bip”的效果 //我们感觉到了节拍! long delta =millis() - lastBeat; //测量两次节拍之间的持续时间 lastBeat =millis(); beatsPerMinute =60 / (delta / 1000.0); //计算 BPM if (beatsPerMinute <255 &&beatsPerMinute> 20) //为了计算平均值,我们存储一些值 (4) 然后做一些数学计算来计算平均值 { rate[rateSpot++] =(byte)beatsPerMinute; //将此读数存储在数组 rateSpot %=RATE_SIZE; //包装变量 //取读数的平均值 beatAvg =0; for (byte x =0; x SparkFun MAX3010x 库
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_LibraryAdafruit SSD1306
https://github.com/adafruit/Adafruit_SSD1306Adafruit GFX 库
https://github.com/adafruit/Adafruit-GFX-Library
示意图
两个模块都有 i²c 接口,如果您使用带 GND 的 2 针蜂鸣器 (-) 和带电阻器的 (+) 则 D3制造工艺