查看: 2043|回复: 6

[未解决] 毕设求助!max30102与gy906实现脉搏体温测量

[复制链接]

该用户从未签到

发表于 2021-3-22 17:05 | 显示全部楼层 |阅读模式
各位大佬,我最近在搞毕业设计,想通过arduino,max30102,gy906实现脉搏体温测量,但效果并不好,无法读取数据(但两个传感器单独使用时能正常读取显示数据)
求教各位大佬如何解决!!!!谢谢!!!!
以下是代码:

gy906单独使用时代码:
//温度
#include <Wire.h>   //IIC头文件

void setup() {
  Wire.begin();         // join i2c bus (address optional for master)
  Serial.begin(9600);  // 波特率
}

uint16_t result;
float temp;

void loop() {

  Wire.beginTransmission(0x5A);
  Wire.write(0x07);                // sends instruction byte
  Wire.endTransmission(false);     // stop transmitting

  Wire.requestFrom(0x5A, 3);   //Send data n-bytes read
  result = Wire.read();        //Receive DATA
  result |= Wire.read() << 8;  //Receive DATA

  uint8_t pec = Wire.read();
  delay(1000);
  temp =  result*0.02-273.15;  //温度数值转换

  Serial.print(F("temp="));
  Serial.println(temp);

}





max30102单独使用测量脉搏时代码:

/*
  Optical Heart Rate Detection (PBA Algorithm) using the MAX30105 Breakout
  By: Bennu @ MH-ET LIVE
  Date: October 2nd, 2017
  https://github.com/MHEtLive/MH-ET-LIVE-max30102

  This is a demo to show the reading of heart rate or beats per minute (BPM) using
  a Penpheral Beat Amplitude (PBA) algorithm.

  It is best to attach the sensor to your finger using a rubber band or other tightening
  device. Humans are generally bad at applying constant pressure to a thing. When you
  press your finger against the sensor it varies enough to cause the blood in your
  finger to flow differently which causes the sensor readings to go wonky.

  Hardware Connections (Breakoutboard to Arduino):
  -5V = 5V (3.3V is allowed)
  -GND = GND
  -SDA = A4 (or SDA)
  -SCL = A5 (or SCL)
  -INT = Not connected

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
  but it will also run at 3.3V.
*/

#include <Wire.h>
#include "MAX30105.h"

#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing...");

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}

void loop()
{
  long irValue = particleSensor.getIR();

  if (checkForBeat(irValue) == true)
  {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);

  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();
}





gy906与max30102一起使用代码:
/*
shili5+gy906
*/

#include <Wire.h>
#include "MAX30105.h"

#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

void setup()
{
  Wire.begin();         // join i2c bus (address optional for master)
  //Serial.begin(9600);  // 波特率

  Serial.begin(115200);
  Serial.println("Initializing...");

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}


uint16_t result;
float temp;




void loop()
{
  long irValue = particleSensor.getIR();

  Wire.beginTransmission(0x5A);
  Wire.write(0x07);                // sends instruction byte
  Wire.endTransmission(false);     // stop transmitting

  Wire.requestFrom(0x5A, 3);   //Send data n-bytes read
  result = Wire.read();        //Receive DATA
  result |= Wire.read() << 8;  //Receive DATA

  uint8_t pec = Wire.read();
  delay(1000);
  temp =  result*0.02-273.15;  //温度数值转换

  Serial.print(F("temp="));
  Serial.println(temp);


  if (checkForBeat(irValue) == true)
  {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);

// Serial.print(F("temp="));
  Serial.println(temp);
  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();
}




求教各位大佬如何解决!!!!谢谢!!!!

gy906单独使用效果

gy906单独使用效果

max30102单独使用效果

max30102单独使用效果

两传感器同时使用效果

两传感器同时使用效果

签到天数: 72 天

[LV.6]常住居民II

发表于 2021-3-22 18:46 | 显示全部楼层
本帖最后由 XlinliY.Zhang 于 2021-3-22 18:52 编辑

这个问题遇到过,解决方案是使用其他引脚实现SMBUS协议,库文件可以有偿提供
附带一份
按下按钮,读取10次心率和体温,并求平均值,LCD显示,超过阈值蜂鸣器 LED红灯报警,正常LED绿灯的程序

该用户从未签到

发表于 2022-1-21 10:45 来自手机 | 显示全部楼层
XlinliY.Zhang 发表于 2021-3-22 18:46
这个问题遇到过,解决方案是使用其他引脚实现SMBUS协议,库文件可以有偿提供
附带一份
按下按钮,读取10次 ...

可以问一下是怎么解决的吗

签到天数: 72 天

[LV.6]常住居民II

发表于 2022-1-23 01:03 | 显示全部楼层
Alexjet 发表于 2022-1-21 10:45
可以问一下是怎么解决的吗

解决方案是使用其他引脚实现SMBUS协议

该用户从未签到

发表于 2022-1-23 23:34 来自手机 | 显示全部楼层
XlinliY.Zhang 发表于 2022-1-23 01:03
解决方案是使用其他引脚实现SMBUS协议

可以有偿提供库文件或教程吗

签到天数: 72 天

[LV.6]常住居民II

发表于 2022-1-24 02:10 | 显示全部楼层
Alexjet 发表于 2022-1-23 23:34
可以有偿提供库文件或教程吗

左侧QQ交谈

该用户从未签到

发表于 2022-3-31 21:20 | 显示全部楼层
兄弟,求库以及解决方法,可以有偿,急
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Arduino IDE  ESP32 下不能使用中文关键字使我非常郁闷。
Arduino IDE ESP32 下不
Arduino IDE ESP8266 下可以使用中文关键字 Arduino IDE ESP32 下不能使用中文关键
AVR32开发板
AVR32开发板
at32UC3B1128开发板支持很多硬件资源,感兴趣可以在评论区交流
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕 (上)
合宙ESP32C3使用TFT_eSPI
TFT_eSPI库升级到2.4.61版本可以完美的支持的合宙ESP32C3操作ST7735s屏幕。合宙ESP32C
blinker物联网教程——4、控制开关灯
blinker物联网教程——4、
简介[hr]在基础教程中,我们用wifiduino做了一系列的控制实验,并了解了传感器和主板
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕 (中)
合宙ESP32C3使用TFT_eSPI
TFT_eSPI库里面含有自备字库的制作工具,数字、英文大小写和中文字体采用Unicode编码
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表