一、项目介绍(包括设计思路、软硬件介绍等)
这是fastbond活动项目,主题是智能可穿戴。使用美信公司IIC接口MAX30102心率传感器芯片实现心率BPM测量并通过IIC接口oled12832显示,BPM(beats per minute)正常人通常在65-75。
二、项目用到的板卡、芯片、模块、仪器、设备等介绍
1.美信公司心率传感器MAX30102
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
将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);
}
}
四、功能演示结果及说明(可添加演示图片进行解释说明)
五、对本活动的心得体会(包括意见或建议)
1.本次活动主题很丰富,几乎是没限制条件,自由发挥,希望后面多多举办类似活动。
2.网站资源很丰富,尤其是百科,简直就是电子爱好者的百宝箱。