一、项目介绍(包括设计思路、软硬件介绍等)
本次选择的是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相比,该芯片集成了玻璃盖可以有效排除处界和内部光干扰,拥有最优可靠的性能。
优点和特点
· 心率监测器和脉搏血氧计传感器输入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陶瓷输出电容,便可实现出色的线路与负载瞬态响应性能。
- 输入电压范围: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接口直流供电。
4、0.96 oled显示屏
三、硬件设计
使用Arduino进行开发非常的便捷,他有强大的库支持,根据心率模块和Arduino2560的引脚图进行接线,连接上ADI的电源部分即可。
整体接线如上图
四、关键性代码说明
具体代码如下:
#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生态的支持,一切的难题都可以迎刃而解。后期也会在这个板字的基础上进行功能的扩充,增加计步器、时钟、温湿度等模块,逐步完善可穿戴的功能。