Beetle树莓派RP2350心率监测项目代码,四稿

2025-05-0932
AI 快速预览详细 收起
本文介绍了如何使用Beetle树莓派RP2350实现心率监测。项目使用Adafruit SSD1306 OLED显示屏,通过SoftwareSerial读取心率数据并动态显示。代码中包含改进版的数据解析函数,兼容多种格式,确保准确提取心率值。通过此项目,用户可以快速搭建心率监测系统,适用于STEM教育场景,适合零基础新手入门。

#include
#include
#include
#include

#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_ADDR 0x3C

SoftwareSerial hrSerial(18, 19);
Adafruit_SSD1306 oled(OLED_WIDTH, OLED_HEIGHT, &Wire, -1);

int bpm = 0;
int lastBpm = -1;  // 用于检测数值变化

void setup() {
 Serial.begin(9600);
 hrSerial.begin(9600);
 
 if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
   Serial.println("OLED Error");
   while(1);
 }
 oled.clearDisplay();
 oled.display();
}

void loop() {
 if (hrSerial.available()) {
   String data = hrSerial.readStringUntil('\n');
   if (parseBPM(data) && (bpm != lastBpm)) {  // 仅当数值变化时刷新
     updateDisplay();
     lastBpm = bpm;
   }
 }
}

bool parseBPM(String data) {
 // 改进版数据解析(兼容多种格式)
 data.trim();
 int startIdx = data.indexOf("BPM:");
 if (startIdx == -1) startIdx = data.indexOf("HR:");
 if (startIdx == -1) startIdx = data.indexOf("Heart:");
 
 if (startIdx != -1) {
   String valStr = "";
   for (unsigned int i = startIdx + 4; i < data.length(); i++) {  // 4为"BPM:"长度
     if (isDigit(data[i])) valStr += data[i];
     else break;
   }
   if (valStr.length() > 0) {
     bpm = valStr.toInt();
     bpm = constrain(bpm, 0, 250);
     return true;
   }
 }
 return false;
}

void updateDisplay() {
 oled.clearDisplay();
 
 // 动态字号调整
 uint8_t textSize = (bpm > 99) ? 2 : 3;  // 三位数用小字号
 oled.setTextSize(textSize);
 
 String displayStr = String(bpm);
 int charWidth = 6 * textSize;          // 每个字符像素宽度
 int xPos = (OLED_WIDTH - displayStr.length() * charWidth) / 2;
 
 oled.setCursor(xPos, 20);
 oled.print(displayStr);
 
 // 添加单位标签(小字号)
 oled.setTextSize(1);
 oled.setCursor((OLED_WIDTH - 30)/2, OLED_HEIGHT - 15);
 oled.print("BPM");
 
 oled.display();
}
 

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -