首页 > 解决方案 > 将数据从 MAX30100 发送到 ESP8266 到 Thingspeak

问题描述

我有三个传感器连接到我的 Arduino UNO:MAX30100(这是问题所在)、TMP117 和一个脉冲传感器。所有三个传感器都可以在没有 ESP8266 的情况下工作,它们的值显示在 arduino 的串行端口上。问题是当我包含 ESP8266 以将值发送到 Thingspeak 时。TMP117 和 Pulse 传感器的值已发送,它们在 Thingspeak 上显示良好。问题出在 MAX30100 上。MAX30100 只显示值 0,它也没有显示“节拍”功能,这意味着 MAX30100 根本没有测量任何东西。有人知道如何使 MAX30100 传感器在向 Thingspeak 发送数据时工作吗?我在下面发布我的代码。

#include <Wire.h>
 
 //pentru esp
 #include <SoftwareSerial.h>
 
//pentru max
#include "MAX30100_PulseOximeter.h"

#define REPORTING_PERIOD_MS     3000

SoftwareSerial ser(9,10);
String apiKey = "JZEMME7ZYSHZMUK2";

PulseOximeter pox;
uint32_t tsLastReport = 0;
 
// Adresa senzorului TMP117
 const int TMP117_Address = 0x48;    

 // Hexadecimal addresses for various TMP116 registers 
 const int Temp_Reg = 0x00;           // Temperature register
 const int Config_Reg = 0x01;         // Configuration register

//Variabile pentru senzorul de puls   
int led_pin = 13;
volatile int bataieInima;
volatile int valoareSenzor_Puls;              
volatile int timpIntreBatai = 600;            

volatile int rataBatai[10];         //heartrataBatai values will be sotred in this array    
volatile int valoareaMaxima = 512;          
volatile int valoareaMinima = 512;        
volatile int thresh = 525;   
           
volatile int amplitude = 100;      

volatile boolean puls = false;               
volatile boolean first_heartpulse = true;      
volatile boolean second_heartpulse = false;  
  
volatile unsigned long contorTimp = 0;   //This counter will tell us the pulse timing
volatile unsigned long ultimaBataie = 0;
volatile double temp;
volatile int pulsMax;
volatile int oxigenMax;


void onBeatDetected()
{
    Serial.println("Beat!");
}

 
 void setup(){
  
  // Initiate wire library and serial communication
  Wire.begin();       
  Serial.begin(115200); 
  ScriereI2C_TMP117(TMP117_Address, Config_Reg,0x02, 0x20);
  

  intreruperePuls();
 
  
      //initializare esp
ser.begin(9600);
ser.println("AT");
delay(1000);
ser.println("AT+GMR");
delay(1000);
ser.println("AT+CWMODE=3");
delay(1000);
ser.println("AT+RST");
delay(5000);
ser.println("AT+CIPMUX=1");
delay(1000);
 
String cmd="AT+CWJAP=\"DIGI_d61430\",\"ddcc29eb\"";
ser.println(cmd);
delay(1000);
ser.println("AT+CIFSR");
delay(1000);
  


    Serial.print("Initializing pulse oximeter..");
 
    // Initialize the PulseOximeter instance
    // Failures are generally due to an improper I2C wiring, missing power supply
    // or wrong target chip
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
     pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
 
    // Register a callback for the beat detection
    pox.setOnBeatDetectedCallback(onBeatDetected);



 }


 void loop(){
  //pentru max
  // Make sure to call update as fast as possible

    
 
    pox.update();
   
      pulsMax = pox.getHeartRate();
      oxigenMax = pox.getSpO2();
      
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
     
     Serial.print("Puls senzor digital:");
        Serial.print("Heart rate:");
        Serial.print(pulsMax);
        Serial.print("bpm / SpO2:");
        Serial.print(oxigenMax);
        Serial.println("%");
//
  Serial.print("Puls senzor analogic: ");
  Serial.println(bataieInima);

    // Apeleaza functia de citire a temperaturii
       temp = CitireI2C_TEMP117();
  Serial.print("Temperatura este:");
  Serial.println(temp);

 tsLastReport = millis();
    }

     esp_8266(); 
      

 }

/*********************** Read Temperature Sensor Function **************************/
double CitireI2C_TEMP117(void){
  // Data array to store 2-bytes from I2C line
  uint8_t data[2]; 
  // Combination of 2-byte data into 16-bit data
  int16_t datac;   
  
  // Points to device & begins transmission
  Wire.beginTransmission(TMP117_Address); 
  
  // Points to temperature register to read/write data
  Wire.write(Temp_Reg); 
  
  // Ends data transfer and transmits data from register
  Wire.endTransmission(); 

  // Delay to allow sufficient conversion time
  delay(10); 

  // Requests 2-byte temperature data from device
  Wire.requestFrom(TMP117_Address,2); 

  // Checks if data received matches the requested 2-bytes
  if(Wire.available() <= 2){  
  // Stores each byte of data from temperature register
    data[0] = Wire.read(); 
    data[1] = Wire.read(); 

  // Combines data to make 16-bit binary number
    datac = ((data[0] << 8) | data[1]); 

  // Convert to Celcius (7.8125 mC resolution) and return
    return datac*0.0078125; 
  }
}

/**************************** I2C Write Function ********************************/
double ScriereI2C_TMP117(int dev, int reg, int H, int L){
  // Takes in 4 variables:
  // device address, register addres
  // high and low bytes of data to transmit 
  Wire.beginTransmission(dev); 
  Wire.write(reg);
  Wire.write(H); 
  Wire.write(L);
  Wire.endTransmission();
  delay(10);
}


/**************************** Functia de intrerupere pentru senzorul de puls ********************************/
void intreruperePuls()
{    
  TCCR2A = 0x02;  // This will disable the PWM on pin 3 and 11
  OCR2A = 0X7C;   // This will set the top of count to 124 for the 500Hz sample rate
  TCCR2B = 0x06;  // DON'T FORCE COMPARE, 256 PRESCALER
  TIMSK2 = 0x02;  // This will enable interrupt on match between OCR2A and Timer
  sei();          // asigura activarea intreruperii
}

ISR(TIMER2_COMPA_vect)
{ 
  cli();                                     
  valoareSenzor_Puls = analogRead(0);  //citim valoarea analogica a senzoruui          
  contorTimp += 2;                        
  int N = contorTimp - ultimaBataie; //N se foloseste pentru a inlatura zgomotul

  if(valoareSenzor_Puls < thresh && N > (timpIntreBatai/5)*3) // trebuie sa treaca o perioada de timp 3/5ibi pentru a evita zgomotul
    {     
      if (valoareSenzor_Puls < valoareaMinima)
      {                       
        valoareaMinima = valoareSenzor_Puls;
      }
    }

   if(valoareSenzor_Puls > thresh && valoareSenzor_Puls > valoareaMaxima)
    {        
      valoareaMaxima = valoareSenzor_Puls;
    }           


    if (N > 250)
  {                            
    if ( (valoareSenzor_Puls > thresh) && (puls == false) && (N > (timpIntreBatai/5)*3) )
      {       
        puls = true;          
        digitalWrite(led_pin,HIGH);
        timpIntreBatai = contorTimp - ultimaBataie;
        ultimaBataie = contorTimp; //actualizam ultima bataie de inima

        
   if(second_heartpulse)
        {                        
          second_heartpulse = false;   
          for(int i=0; i<=9; i++)    
          {            
            rataBatai[i] = timpIntreBatai; //Filling the array with the heart rataBatai values                    
          }
        }

   if(first_heartpulse)
        {                        
          first_heartpulse = false;
          second_heartpulse = true;
          sei();            
          return;           
        }  
        
  word runningTotal = 0;  //variabila folosita pentru a mentine ibi-urile
  
      for(int i=0; i<=8; i++)
        {               
          rataBatai[i] = rataBatai[i+1];
          runningTotal += rataBatai[i];
        }

         rataBatai[9] = timpIntreBatai;             
      runningTotal += rataBatai[9];   
      runningTotal /= 10;        
      bataieInima = 60000/runningTotal;
    }                      
  }

   if (valoareSenzor_Puls < thresh && puls == true)
    {  
      digitalWrite(led_pin,LOW); 
      puls = false;             
      amplitude = valoareaMaxima - valoareaMinima;
      thresh = amplitude/2 + valoareaMinima; 
      valoareaMaxima = thresh;           
      valoareaMinima = thresh;
    }


   if (N > 2500)
    {                          
      thresh = 512;                     
      valoareaMaxima = 512;                 
      valoareaMinima = 512;               
      ultimaBataie = contorTimp;     
      first_heartpulse = true;                 
      second_heartpulse = false;               
    }


   sei();                                
}

void esp_8266()
{
// TCP connection AT+CIPSTART=4,"TCP","184.106.153.149",80
String cmd = "AT+CIPSTART=4,\"TCP\",\"";
cmd += "184.106.153.149"; // api.thingspeak.com
cmd += "\",80";
ser.println(cmd);
Serial.println(cmd);
if(ser.find("Error"))
{
Serial.println("AT+CIPSTART error");
return;
}
String getStr = "GET /update?api_key=";
getStr += apiKey;
getStr +="&field1=";
getStr +=String(temp);
getStr +="&field2=";
getStr +=String(bataieInima);
getStr +="&field3=";
getStr +=String(pulsMax);
getStr +="&field4=";
getStr +=String(oxigenMax);
getStr += "\r\n\r\n";
// send data length
cmd = "AT+CIPSEND=4,";
cmd += String(getStr.length());
ser.println(cmd);
Serial.println(cmd);
delay(1000);
ser.print(getStr);
Serial.println(getStr); //thingspeak needs 15 sec delay between updates
delay(3000);
}

        
 

标签: sensorsesp8266arduino-unoarduino-esp8266

解决方案


推荐阅读