FireBeetle打造腕表式心率计

心率是人类重要的生理指标,中国古人更是相信能够凭借脉搏诊断身体情况。

之前介绍过心率带和心率带接收模块的使用【参考1】。这次使用 DFRobot 的FireBeelte 和 12864 小屏幕制作一个腕表式心率计。

主控板 ESP32
配套 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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注