1664浏览
查看: 1664|回复: 0

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

[复制链接]
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>

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


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail