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(); } |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed