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