37| 1
|
[项目] Beetle树莓派 RP2350心率监测项目总篇 |
一、项目初衷 基于Beetle树莓派 RP2350的可穿戴特质,为一些需要心率监测的人员实时查看心脏跳动情况 二、开发板介绍 产品简介 Beetle RP2350 是一款基于RP2350芯片设计的高性能迷你体积的开发板,该开发板仅硬币大小(25*20.5mm),专为对空间有要求的嵌入式应用设计。 高性能树莓派RP2350芯片 RP2350是树莓派新推出的高性能安全微控制器,该微控制器拥有独特的双核双架构设计,允许选择Arm Cortex-M33或Hazard3 RISC-V内核。RP2350拥有150MHz主频,520KB RAM和2MB Flash,可处理大量高速数据。 高度集成,超小尺寸 Beetle RP2350在仅硬币大小的体积上引出了11个IO、BAT、3.3V等众多接口,为项目制作提供了充足的IO和方便的电源连接。Beetle RP2350休眠功耗仅uA,使用电池可长时间工作。同时,Beetle RP2350还集成了锂电池充电功能和电池电压监控功能,可对锂电池进行充电和监测电量,以便在电量不足时采取措施,确保设备持续运行。 易于编程,易于集成 Beetle RP2350支持C/C++、MicroPython编程,可选择熟悉的编程语言,从而实现更高效的开发流程。Beetle RP2350所有器件均在一面,并且采用半孔设计,因此可用于贴片设计,有助于大规模集成。 产品特点
![]() 序号 功能名称 功能说明 ①Type-C USB接口下载程序及供电接口,支持4.75V~5.5V ②RST按键单击复位按钮,将程序复位 ③锂电池接口支持3.7V~4.2V ④板载LED灯使用IO25引脚控制的LED灯 ⑤充电指示灯指示充电状态的绿色LED灯,通过三种方式指示充电状态:1、充满电或未接入电源时熄灭;2、充电时常亮;3、USB供电,未连接锂电池时高频闪烁 ⑥用户按键使用QSPI_SS引脚控制该按钮 ⑦RP2350芯片芯片型号为RP2350A_QFN60引脚示意 ![]() 引脚概述 引脚号 数字口 模拟口 UART I2C SPI 其它 0D0TX1 1D1RX1 4D4SDA 5D5SCL 8D8TX2 9D9RX2 16D16SPI0/MISO 18D18SPI0/SCK 19D19SPI0/MOSI 26D26A0 27D27A1 BAT锂电池输入接口,IO29为电池电压检测引脚 GND接地引脚 VCC该引脚接在USB电源引脚,作为输出时电压为USB电压,通常为5V 3V33.3V稳压电源输出尺寸图
![]() 三、开发环境搭建 我们以Arduino为开发环境进行示例 提前安装好适合电脑版本的Arduino(建议Windows10以上) 安装完成打开后为这个界面 ![]() 语言更改: 界面为英语十分不便利,我们将更改语言 左上角File ![]() 点击Preferences ![]() 完成后ok即可 jason文件安装: 语言更改后点击Preferences(首选项) ![]() 其他开发板管理地址填写 https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json 确定保存 如图所示点击开发板管理器 搜索RP2350并安装(此处我已经安装完毕) ![]() ![]() 点击工具菜单,如下图方式选择“Generic RP2350”开发板 ![]() 最下方RP2350 至此,Beetle RP2350 SDK安装完成,可以开始使用了。 四、此项目的构想和接线 所需材料: ![]() ![]() https://www.dfrobot.com.cn/goods-1339.html https://www.dfrobot.com.cn/goods-1374.html 大致接线方式图 ![]() ![]() ![]() oled的SCL、SDA、VCC、GND分别连接至主板的SCL、SDA、VCC、GND(左侧) 心率传感器绿线连接16号通信串口(所有的数字串口都可以使用) 黑线连接GND(左侧) 红线连接VCC 五、代码编写 代码经过四次更改,其中有无法显示、字号太小和心率计算出错 终稿 #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)) valStr += data; 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