当前位置:   article > 正文

树莓派pico+max30102实现心率、脉搏检测_max30102连接树莓派上传云端

max30102连接树莓派上传云端

max30102简介:


        MAX30102是高灵敏度血氧和心率生物传感器,它包括内部LED、光电探测器、光学元件和具有环境光抑制功能的低噪声电子设备。传感器内部通过一个1.8V电源和一个单独的5.0V电源为内部LED供电。利用标准I2C兼容接口进行通信,同时MAX30102传感器的封装上加了玻璃盖,极大地增强了芯片的抗干扰能力,使其测量效果可以达到更优。另外本模块可以通过软件断电,待机电流也可忽略不计,从而使电源导轨始终保持通电状态。

        此外对于测量脉搏主要方法有心电信提取,测量血压压力传感器测到的波动来计算脉率以及光容积法。对于MAX30102采用的便是光容积法。

        其基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的,其使用的传感器由光源和光电转换器两部分组成。通过绷带或夹子固定在病人的手指、手腕或耳垂。测血氧饱和度时,根据氧合血红蛋白(Hb02)和血红蛋白(Hb)对红光、红外光的吸收量来计算。血管随着心跳舒张和收缩,舒张时血量多,吸收的红光和红外光多,收缩时血量少,吸收的红光和红外光少。根据反射到传感器的光量周期性变化,可以计算出心率。血氧饱和度计算公式。

树莓派PICO:

        对于树莓派PICO网上的资料介绍都有很多,这里我就不在浪费大家的时间了。直接上代码

代码部分:

        代码主要便是使用i2c协议,配置max30102的寄存器,并从寄存器中读取出数据。注意该部分读取的是红光与红外光反射强度的原始数据:

  1. from machine import Pin,I2C
  2. import time
  3. # 定义Max30102传感器的I2C地址
  4. MAX30102_I2C_ADDR = 0x57
  5. # 定义Max30102传感器的寄存器地址
  6. REG_INTR_STATUS_1 = 0x00
  7. REG_INTR_STATUS_2 = 0x01
  8. REG_INTR_ENABLE_1 = 0x02
  9. REG_INTR_ENABLE_2 = 0x03
  10. REG_FIFO_WR_PTR = 0x04
  11. REG_OVF_COUNTER = 0x05
  12. REG_FIFO_RD_PTR = 0x06
  13. REG_FIFO_DATA = 0x07
  14. REG_FIFO_CONFIG = 0x08
  15. REG_MODE_CONFIG = 0x09
  16. REG_SPO2_CONFIG = 0x0A
  17. REG_LED1_PA = 0x0C
  18. REG_LED2_PA = 0x0D
  19. REG_PILOT_PA = 0x10
  20. REG_MULTI_LED_CTRL1 = 0x11
  21. REG_MULTI_LED_CTRL2 = 0x12
  22. REG_TEMP_INTR = 0x1F
  23. REG_TEMP_FRAC = 0x20
  24. REG_TEMP_CONFIG = 0x21
  25. REG_PROX_INT_THRESH = 0x30
  26. REG_REV_ID = 0xFE
  27. REG_PART_ID = 0xFF
  28. i2c = I2C(0,sda=Pin(8),scl=Pin(9),freq=400000)
  29. i2c.scan() # 扫描从设备
  30. # 初始化Max30102传感器
  31. def writ_to_register():
  32. # 势能寄存器
  33. i2c.writeto(0x57,bytearray([REG_INTR_ENABLE_1,0xc0]))
  34. i2c.writeto(0x57,bytearray([REG_INTR_STATUS_2,0x00]))
  35. #
  36. i2c.writeto(0x57,bytearray([REG_FIFO_WR_PTR,0x00]))
  37. i2c.writeto(0x57,bytearray([REG_OVF_COUNTER,0x00]))
  38. i2c.writeto(0x57,bytearray([REG_FIFO_RD_PTR,0x00]))
  39. i2c.writeto(0x57,bytearray([REG_FIFO_CONFIG,0x4f]))
  40. i2c.writeto(0x57,bytearray([REG_MODE_CONFIG,0x03]))
  41. i2c.writeto(0x57,bytearray([REG_SPO2_CONFIG,0x27]))
  42. i2c.writeto(0x57,bytearray([REG_LED1_PA,0x024]))
  43. i2c.writeto(0x57,bytearray([REG_LED2_PA,0x024]))
  44. i2c.writeto(0x57,bytearray([REG_PILOT_PA,0x7f]))
  45. def read_data():
  46. data = i2c.readfrom_mem(0x57,REG_FIFO_RD_PTR,1)
  47. write = i2c.readfrom_mem(0x57,REG_FIFO_WR_PTR,1)
  48. return data
  49. # 读取数据
  50. def read_fifo(address=0x57):
  51. """
  52. This function will read the data register.
  53. """
  54. red_led = None
  55. ir_led = None
  56. # read 1 byte from registers (values are discarded)
  57. reg_INTR1 = i2c.readfrom_mem(address, REG_INTR_STATUS_1, 1)
  58. reg_INTR2 = i2c.readfrom_mem(address, REG_INTR_STATUS_2, 1)
  59. # read 6-byte data from the device
  60. d = i2c.readfrom_mem(address, REG_FIFO_DATA, 6)
  61. # mask MSB [23:18]
  62. red_led = (d[0] << 16 | d[1] << 8 | d[2]) & 0x03FFFF
  63. ir_led = (d[3] << 16 | d[4] << 8 | d[5]) & 0x03FFFF
  64. return red_led, ir_led
  65. if __name__ == "__main__":
  66. # 初始化Max30102传感器
  67. writ_to_register()
  68. while True:
  69. # 读取脉搏数据
  70. pulse = read_fifo()
  71. print(pulse)
  72. # print(int.from_bytes(pulse))
  73. time.sleep_ms(10)

附上硬件接线图:

由于是晚上拍的可能会看不清在这口述一下,GND与VIN分别接上PICO的GND与3V3,SDA接GPIO8,SCL接GPIO9。 

        由于第一次写博客还不太熟悉,如果对大家有帮助的话请大家点赞支持一下。最后本文如有错误的地方还请指正。 浏览量高后续还会更新对原始数据处理求出心率与脉搏的部分。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/673145
推荐阅读
  

闽ICP备14008679号