被験者の加速度、位置、脈拍 + SpO2 を監視する必要があるプロジェクトがあります。そこで、ESP32 を使用して MAX30100 Pulse Oxi センサーと MPU6050 Accelero および Gyroscope センサーからのデータをチェックするために、このプログラムを作成しました -
このプログラムは完全に正常に動作します。まったく問題ありません。
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "*********************";
// For Pulse sensor
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = 0;
// For Accelerometer sensor
const int MPU_addr=0x68;
int16_t accelX, accelY, accelZ, gyroX, gyroY, gyroZ;
float gForceX, gForceY, gForceZ,rotX, rotY, rotZ;
void onBeatDetected()
{
Serial.println("Beat Detected!");
}
void setup() {
Serial.begin(115200);
WiFi.begin("TP-Link", "**********");
// Wait for wifi to be connected
uint32_t notConnectedCounter = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.println("Wifi connecting...");
notConnectedCounter++;
if(notConnectedCounter > 50) { // Reset board if not connected after 5s
Serial.println("Resetting due to Wifi not connecting...");
ESP.restart();
}
}
Serial.print("Wifi connected, IP address: ");
Serial.println(WiFi.localIP());
Blynk.begin(auth,"TP-Link_380B", "installation*500");
Serial.println("Initializing Pulse Oximeter..");
if (!pox.begin())
{
Serial.println("FAILED");
for(;;);
}
else
{
Serial.println("SUCCESS");
pox.setOnBeatDetectedCallback(onBeatDetected);
}
// The default current for the IR LED is 50mA and it could be changed by uncommenting the following line.
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
Wire1.begin(32,33,100000);
Wire1.beginTransmission(MPU_addr);
Wire1.write(0x6B); // PWR_MGMT_1 register
Wire1.write(0); // set to zero (wakes up the MPU-6050)
Wire1.endTransmission(true);
}
void loop()
{
// Reading data from Accelerometer sensor
Wire1.beginTransmission(MPU_addr);
Wire1.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire1.endTransmission(false);
Wire1.requestFrom(MPU_addr,14,true); // request a total of 14 registers
accelX=Wire1.read()<<8|Wire1.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
accelY=Wire1.read()<<8|Wire1.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
accelZ=Wire1.read()<<8|Wire1.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
gyroX=Wire1.read()<<8|Wire1.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
gyroY=Wire1.read()<<8|Wire1.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
gyroZ=Wire1.read()<<8|Wire1.read();
gForceX = (accelX-2050) / 16384.0;
gForceY = (accelY-77) / 16384.0;
gForceZ = (accelZ-1947) / 16384.0;
rotX = (gyroX+270) / 131.0;
rotY = (gyroY-351) / 131.0;
rotZ = (gyroZ+136) / 131.0;
// calculating Amplitute vactor for 3 axis
float Raw_Amp = pow(pow(gForceX,2)+pow(gForceY,2)+pow(gForceZ,2),0.5);
int Amp = Raw_Amp * 10; // Mulitiplied by 10 bcz values are between 0 to 1
int angleChange = pow(pow(rotX,2)+pow(rotY,2)+pow(rotZ,2),0.5);
// Reading data from pulseoximeter sensor
pox.update();
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
// Uploading data to Blynk server AND printing data on serial monitor
if (millis() - tsLastReport > REPORTING_PERIOD_MS)
{
Blynk.run();
Blynk.virtualWrite(V3, BPM);
Blynk.virtualWrite(V4, SpO2);
Serial.println(Amp);
Serial.println(angleChange);
Serial.print("Heart rate:");
Serial.print(BPM);
Serial.print(" bpm / SpO2:");
Serial.print(SpO2);
Serial.println(" %");
tsLastReport = millis();
}
}
GPSを追加したので、場所も追跡できます。GPS は加速度計と一緒に動作していますが、パルス酸素濃度計センサーは動作していません。出力は 0 で、残りのセンサーは期待どおりの出力を生成しています。そのためのプログラムを以下に示します
#include <TinyGPSPlus.h>
#include <HardwareSerial.h>
#include <Arduino.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "******************";
// For GPS sensor
float latitude , longitude;
String latitude_string , longitiude_string;
TinyGPSPlus gps;
WidgetMap myMap(V0);
HardwareSerial SerialGPS(2);
// For Pulse sensor
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = 0;
// For Accelerometer sensor
const int MPU_addr=0x68;
int16_t accelX, accelY, accelZ, gyroX, gyroY, gyroZ;
float gForceX, gForceY, gForceZ,rotX, rotY, rotZ;
void onBeatDetected()
{
Serial.println("Beat Detected!");
}
void setup() {
Serial.begin(115200);
WiFi.begin("TP-Link", "***********");
// Wait for wifi to be connected
uint32_t notConnectedCounter = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.println("Wifi connecting...");
notConnectedCounter++;
if(notConnectedCounter > 50) { // Reset board if not connected after 5s
Serial.println("Resetting due to Wifi not connecting...");
ESP.restart();
}
}
Serial.print("Wifi connected, IP address: ");
Serial.println(WiFi.localIP());
Blynk.begin(auth,"TP-Link", "*********");
// Pulse oximeter setup
Serial.println("Initializing Pulse Oximeter..");
if (!pox.begin())
{
Serial.println("FAILED");
for(;;);
}
else
{
Serial.println("SUCCESS");
pox.setOnBeatDetectedCallback(onBeatDetected);
}
// The default current for the IR LED is 50mA and it could be changed by uncommenting the following line.
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Accelerometer setup
Wire1.begin(32,33,100000);
Wire1.beginTransmission(MPU_addr);
Wire1.write(0x6B); // PWR_MGMT_1 register
Wire1.write(0); // set to zero (wakes up the MPU-6050)
Wire1.endTransmission(true);
// GPS Setup
SerialGPS.begin(9600, SERIAL_8N1, 16, 17);
}
void loop()
{
// Reading data from Accelerometer sensor
Wire1.beginTransmission(MPU_addr);
Wire1.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire1.endTransmission(false);
Wire1.requestFrom(MPU_addr,14,true); // request a total of 14 registers
accelX=Wire1.read()<<8|Wire1.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
accelY=Wire1.read()<<8|Wire1.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
accelZ=Wire1.read()<<8|Wire1.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
gyroX=Wire1.read()<<8|Wire1.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
gyroY=Wire1.read()<<8|Wire1.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
gyroZ=Wire1.read()<<8|Wire1.read();
gForceX = (accelX-2050) / 16384.0;
gForceY = (accelY-77) / 16384.0;
gForceZ = (accelZ-1947) / 16384.0;
rotX = (gyroX+270) / 131.0;
rotY = (gyroY-351) / 131.0;
rotZ = (gyroZ+136) / 131.0;
// calculating Amplitute vactor for 3 axis
float Raw_Amp = pow(pow(gForceX,2)+pow(gForceY,2)+pow(gForceZ,2),0.5);
int Amp = Raw_Amp * 10; // Mulitiplied by 10 bcz values are between 0 to 1
int angleChange = pow(pow(rotX,2)+pow(rotY,2)+pow(rotZ,2),0.5);
// Reading data from pulseoximeter sensor
pox.update();
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
// Reading the data from GPS
if(SerialGPS.available() > 0) {
if (gps.encode(SerialGPS.read()))
{
if (gps.location.isValid())
{
latitude = gps.location.lat();
latitude_string = String(latitude , 6);
longitude = gps.location.lng();
longitiude_string = String(longitude , 6);
}
}
}
// Uploading data to Blynk server AND printing data on serial monitor
if (millis() - tsLastReport > REPORTING_PERIOD_MS)
{
Blynk.run();
Blynk.virtualWrite(V3, BPM);
Blynk.virtualWrite(V4, SpO2);
Serial.println(Amp);
Serial.println(angleChange);
Serial.print("Heart rate:");
Serial.print(BPM);
Serial.print(" bpm / SpO2:");
Serial.print(SpO2);
Serial.println(" %");
Blynk.virtualWrite(V0, 1, latitude, longitude, "Location");
Serial.print("Latitude = ");
Serial.println(latitude_string);
Serial.print("Longitude = ");
Serial.println(longitiude_string);
tsLastReport = millis();
}
}
これで私を助けてくれませんか。プログラムの何が問題なのですか。