#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;
unsigned long lastUpdate = 0;
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');
parseBPM(data);
}
// 每500ms刷新一次屏幕(降低闪烁)
if (millis() - lastUpdate > 500) {
updateDisplay();
lastUpdate = millis();
}
}
void parseBPM(String data) {
// 假设实际数据格式示例: "HR:123"
int startIdx = data.indexOf("HR:");
if (startIdx != -1) {
String valStr = data.substring(startIdx + 3);
valStr.trim(); // 去除前后空格
bpm = valStr.toInt();
bpm = constrain(bpm, 0, 250); // 限制数值范围
}
}
void updateDisplay() {
oled.clearDisplay();
// 显示标题(小字体)
oled.setTextSize(1);
oled.setCursor((OLED_WIDTH - 6*12)/2, 5); // 居中计算
oled.print("Heart Rate Monitor");
// 显示BPM数值(大字体)
oled.setTextSize(2);
String displayStr = "BPM: " + String(bpm);
int xPos = (OLED_WIDTH - displayStr.length()*12)/2; // 字符宽度=6*2=12
oled.setCursor(xPos, 30);
oled.print(displayStr);
oled.display();
}
评论