Funpack第12期——用Wio Terminal做个生命监控终端
Funpack第12期 Wio Terminal Arduino Max30102 心率 血氧浓度
标签
嵌入式系统
测试
happy
更新2021-12-24
873

内容介绍

任务选择:
Funpack第12期活动,我选择任务一:利用扩展接口,自由选择连接三到五个传感器,并将采集的数据显示在LCD屏幕上,并解释数据的含义。

硬件介绍:
Wio Terminal 是基于SAMD51的微控制器,具有 Realtek RTL8720DN 支持的无线连接,与Arduino和MicroPython兼容。它的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。它同时支持蓝牙和Wi-Fi,为物联网项目提供了骨架。Wio Terminal自身配有一个2.4英寸 LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和940nm红外发射器。 除了这些它还有两个用于Grove生态系统的多功能Grove接口和兼容Raspberry pi的40个GPIO引脚,用于支持更多附加组件。个人觉得Wio Terminal 更像是一个可编程终端。
这次的任务我是用Wio Terminal来制作一个生命监控终端,可以监控病人生命体征的心率和血氧含量,还能监控病床振动和病人的呼叫。
心率和血氧含量使用的是MAX30102传感器模块。这个模块原理是将红光/红外光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号,再经过AD转换成数字信号。简化过程:光--> 电 --> 数字信号。所以我们需要控制光源LED的电流强度和采样率,光敏传感器的ADC精度(xbit)等。
图片来源于网络
振动传感器,是一个用来检测墙体入侵的探头。感觉里边是一个滚珠,当有振动发生时,就会引起探头短路,从而发送信号给单片机。
FmOQXxuvJJZc2z_im09fRYASxMGb
声音采集模块。使用的是一个麦克风模块。通过驻极话筒采集环境中的声音信号。有两种输出方式,一种是模拟信号输出,就是完完整整地将麦克风收集到的声波转换为电压值输出;一种是数字信号输出,当麦克风收集到的声音超过设定的阈值时,就输出低电平,否则输出高电平。这种输出方式最合适用来测量声音的强度,我这里就是使用这种方式。阈值的设定由电位器加LM393来决定,调节电位器就可以调整决定低电平声音的大小。

实现过程
MAX30102模块驱动。这个模块通过IIC方式通讯,用数据线接到Wio Terminal的Grove口。参考网上的例程,分别读取到MAX30102模块的红外和红光的信号,通过串口展示出来。从图像上看,红外的波动比红光的波动幅度要大些。
FgJQTvvKCW_XlFHC2nipsU0OYl-A这就是典型的PPG波形。其中从最高的波峰到最低的波谷,这个范围算作AC signal,最低的波谷到0算作DC signal。然后用红光的AC/DC再除以红外光的AC/DC就可以获得R值,然后通过美信拟合的公式计算出血氧含量。

//计算血氧含量   使用灌注指数PI  然后用 SpO2 = -45.060*R*R + 30.354 *R + 94.845 计算
float countspo2() {
  double acred, dcred, acir, dcir;
  float r, spo2;
  acred = double(redmax - redmin);
  dcred = double(redmin);
  acir = double(irmax - irmin);
  dcir = double(irmin);
  r = (float(acred / acir)) * (float(dcir / dcred));
  spo2 = (-45.06) * r * r + 30.354 * r + 94.845;
  if (spo2 < 0 || spo2 > 100) return 0;
  return spo2;
}

获得的原始波形,很容易干扰,导致波纹整体的上下移动。将每次获得的值与前值做差,就能很好地获得心跳的波纹。
FqBOqRm4Febsc5G0qT4BdTkiHJ0a
从波形上观察,红外的波幅略微大些,所以取红外的波来计算心跳和展示。这里计算心跳是取一段时间内的波形数据,数波谷的个数来获得心跳次数。感觉用傅里叶变换应该也可以,但fft还是没吃透,算出来感觉有些问题。

//计算心率  使用红外的心率数据 寻找曲线的下端点 数下端顶点个数
byte countheartbeat() {
  uint32_t offset = avgir - (avgir - irmin) / 3;
  byte num = 0;
  //寻找突变点
  for (byte i = 1; i < max_size - 1; i++) {
    if (irlist[i] < offset && irlist[i] < irlist[i + 1] && irlist[i] < irlist[i - 1] ) {
      num++;
    }
  }
  return num * 60000 / (endtime - begtime);
}

使用中感觉MAX30102模块的灯光太刺眼了,就增加了靠近感应模块。上电初始化后给Led灯微弱电流,检查反光情况,当反光值大于指定阈值后,再给Led灯更多的电流,更好地照亮皮肤,获得反光信息。一旦反光值低于阈值,判断手指离开了传感器,再降低Led电流。经过测量0x10值是比较合适的值,不能给太高,过高会导致传感器饱和,无法测量到反射光线的波动信息了。

振动和声音的信号收集比较简单。传感器送来的就是低电平,通过D0、D1送到开发板。Wio Terminal通过中断获得低电平信号,目前只是在屏幕上显示告警信息,没有做过多的处理。收到告警后可以通过A按键取消掉告警信息。

//处理按键  取消所有报警
void dealalarm() {
  micstat = 0;
  movestat = 0;
}

//声音告警
void micalarm() {
  micstat = 1;
}
// 移动告警
void movealarm() {
  movestat = 1;
}

 显示使用官方提供的Line Charts显示50个心率的数据,动态的绘制心率曲线。最后增加了扬声器的声音,在正常测量时,模拟个心跳的声音,异常时发出“滴”的声音。

void loop() {
  val_red = particleSensor.getRed();    //读取传感器值
  val_ir = particleSensor.getIR();
  if (val_ir > 3000) {//检测到手指头
    sensorLedCtl(0x10, 0x10);   //开灯
    if (data.size() >= max_size) {
      data.pop();//this is used to remove the first read variable
    }
    data.push(long(val_ir - old_ir));
    if (pos == 0) begtime = millis();
    redlist[pos] = val_red;
    irlist[pos] = val_ir;
    pos++;
    stat = 0;
    if (micstat == 1 ||  movestat == 1) {
      Serial.printf("%d,%d\n", long(val_ir - old_ir),long(val_red - old_red));
    }
    //    Serial.println(pos);
    if (pos >= max_size) { //攒够50个数据 进行处理
      endtime = millis();
      finemaxval();
      hbeat = countheartbeat();
      spo2 = countspo2();
      pos = 0;
      stat = 1;
    }
    old_red = val_red;
    old_ir = val_ir;
    draw_screen();
  } else {
    sensorLedCtl(0, 2);     //没有手指头 关灯
    stat = 2;
  }
  if (stat == 1) {
    analogWrite(WIO_BUZZER, 28);
    delay(40);
    analogWrite(WIO_BUZZER, 0);
  }
  if (stat == 2) {
    analogWrite(WIO_BUZZER, 128);
    delay(40);
  }
}

但是整个程序不知道是哪里没有做好,经常会卡死,原因未知。

FiwfNuhiilkgXYnH0Bfs5_9yxLWk

心得体会:
在MAX30102模块上使用手指按压方式测量心率、血氧含量,随着手指的压力、位置变化,测量值也会有较大的波动。感觉应该需要做个指套,套在手指上,测量结果会准确一些。感谢funpack组织的活动,Wio Terminal可玩性超强,期待着学习分享大家的作品。

附件下载

max30102.zip

团队介绍

团队成员
happy

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号