心率是人类重要的生理指标,中国古人更是相信能够凭借脉搏诊断身体情况。
之前介绍过心率带和心率带接收模块的使用【参考1】。这次使用 DFRobot 的FireBeelte 和 12864 小屏幕制作一个腕表式心率计。
从前面的实验可以得知,心率带接收模块使用串口输出。FireBeelte 核心是 ESP32 ,支持3个硬件串口【参考2】。其中0号是给烧写程序使用了(其实也可以用,只是为了调试方便而不选择使用);1号串口在 IO9/10和 12864 控制Pin冲突;所以只能使用2号串口,位于IO16/17。对我们来说只需要接收即可。
供电部分这次直接使用USB提供5V, 使用板载的 3.3V接口为心率接收模块供电。FireBeelte 设计上带有电池插口(3.7V),这次设计为了简单起见并未使用。
12864 屏幕自带了字库,因此可以直接调用库来完成汉字的现实,对于汉字显示需求来说方便很多。通过函数OLED.disStr(x, y, "要显示的汉字") 即可直接显示。
代码很简单,就是从一个串口输入,找到心率数据,显示在 12864屏幕即可。
完整代码如下:
#include "DFRobot_OLED12864.h"
// 使用第三组串口
HardwareSerial Serial2(2);
// 使用12864 LCD
const uint8_t I2C_addr = 0x3c;
const uint8_t pin_SPI_cs = D5;
DFRobot_OLED12864 OLED(I2C_addr, pin_SPI_cs);
void setup(void)
{
// 串口0 用于下载代码
Serial.begin(115200);
// 串口2 用于接收心率带接收器发过来的数据
Serial2.begin(9600);
// 初始化 12864
OLED.init();
OLED.flipScreenVertically();
}
char Recv[40];
char BPM[40]="----BPM";
int count=0;
int idx;
void loop(void)
{
// 一直在串口2 接收数据
while (Serial2.available())
{
Recv[count]=Serial2.read();
count++;
}
// 心率带数据以 0xDD 起始,例如: DD 22 05 28 4D
if ((Recv[0]==0xDD)&&(count==5)) {
// 将心率数据格式化为字符串
for (int i=0;i<sizeof(BPM);i++) BPM[i]=' ';
sprintf(BPM, "%d BPM ", Recv[4]);
}
// 接收到足够的数据的话,将数据送到串口0 便于Debug
if (count>=5) {
for (int i=0;i<count;i++)
Serial.write(Recv[i]);
//清空接收 Buffer
count=0;
}
for (idx=0;idx<20;idx++) {
OLED.clear();
// 将心率信息显示在 12864 上
OLED.disStr(0, 0, "当前心率");
OLED.disStr(40, 30, BPM);
// 为了便于查看除了心率数据,还实现一个圆形的动态显示
for (int16_t i=0; i<abs(10-idx); i++) {
OLED.drawCircle(116, 52, i);
}
//显示内容到 12864 屏幕上
OLED.display();
delay(30);
}
}
成品照片:
工作的视频可以在知乎专栏看到:
https://zhuanlan.zhihu.com/p/58751665
1. Arduino获得心率带数据
https://www.arduino.cn/forum.php?mod=viewthread&tid=84101&fromuid=36850
2. FireBeelte 多串口通讯的实现
https://www.arduino.cn/forum.php?mod=viewthread&tid=84390&fromuid=36850