回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

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

头像 天眼FAST 2025.05.09 13 0

#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();
}
 

评论

user-avatar