void setup()
{
pinMode(oxiInt, INPUT); // pin D0 connects to the interrupt output pin of the MAX30102
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.clearBuffer();
delay(2000);
u8g2.setFont(u8g2_font_unifont_tr);
u8g2.setCursor(0, 14);
u8g2.print("Initializing...");
u8g2.sendBuffer();
Wire.begin();
Serial.begin(115200);
Serial.println("Initializing");
maxim_max30102_reset(); // resets the MAX30102
maxim_max30102_read_reg(REG_INTR_STATUS_1, &uch_dummy); // Reads/clears the interrupt status register
maxim_max30102_init(); // initialize the MAX30102
old_n_spo2 = 0.0;
Serial.println(F("Time[s]\tSpO2\tHR\tRatio\tCorr"));
timeStart = millis();
}
在 setup()
函数中,首先将 oxiInt
引脚设置为输入模式(用于连接到 MAX30102 的中断输出引脚),然后对 OLED 屏幕进行初始化操作,在开机画面上输出 “Initializing…”。接着使用 Wire
库初始化 I2C 总线,打开串口输出,并分别进行了 MAX30102 的复位、中断状态清除和初始化操作。最后输出表头 “Time[s]\tSpO2\tHR\tRatio\tCorr”,并记录开始时间。
显示心率和血氧值
void print_hr_spo2(int val_hr, int val_spo2){
if(val_hr > 999 || val_hr < 0){
return;
}
if(val_spo2 > 100 || val_spo2 < 0){
return;
}
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_fub14_tr);
u8g2.setCursor(0,14);
u8g2.print(" HR");
u8g2.setCursor(60,14);
u8g2.print("SPO2");
char str_hr[4];
u8g2.setFont(u8g2_font_fur20_tr);
itoa(val_hr, str_hr, 10);
if(val_hr > 99){
u8g2.drawStr(0, 38, str_hr);
}else if(val_hr > 9){
u8g2.drawStr(14,38, str_hr);
}else{
u8g2.drawStr(28,38, str_hr);
}
char str_spo2[4];
u8g2.setFont(u8g2_font_fur30_tr);
itoa(val_spo2, str_spo2, 10);
if(val_spo2 > 99){
u8g2.drawStr(55, 48, str_spo2);
}else if(val_spo2 > 9){
u8g2.drawStr(70, 48, str_spo2);
}else{
u8g2.drawStr(85, 48, str_