정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

심박센서소스(2)좀 봐주세요... 다시올립니다...
김근호 | 2016-11-17
#include <SoftwareSerial.h> //블루투스 통신 헤더파일
#include <Wire.h>
#include <SPI.h>    //SPI통신   헤더파일
#include <ADXL362.h>  //가속도센서 헤더파일
#include <BH1750.h>       //조도센서 헤더파일


SoftwareSerial mySerial(4,7); // RX, TX  //블루투스 핀 정의
BH1750 lightMeter;      //조도센서 lightMeter으로 정의
ADXL362 xl;             //가속도센서 xl로 정의


//가속도 16비트로 받기
int16_t temp;
int16_t X, Y, Z, Temperature; //(x,y,z,tem(온도))


//  Variables(심박센서 변수)
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

int sensor_save[5*60]; // 만약 1초당 하나씩 저장한다면 5*60개가 5분에 필요한 갯수
int sensor_index; // array저장 위치
int sum_cnt ; // 누적 cnt
long sum; // 누적값 0.2 초 마다 읽은 값 50번 누적 시켜 1초 단위 평균

// Volatile Variables, used in the interrupt service routine!
volatile int BPM;                   // int that holds raw Analog in 0. updated every 2mS
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // int that holds the time interval between beats! Must be seeded! 
volatile boolean Pulse = false;     // "True" when User's live heartbeat is detected. "False" when not a "live beat". 
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

// Regards Serial OutPut  -- Set This Up to your needs
static boolean serialVisual = false;   // Set to 'false' by Default.  Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse 


void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  mySerial.begin(115200);

  //심박센서 인터럽트 함수 호출
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS 
   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE, 
   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//   analogReference(EXTERNAL);   

//조도센서 시리얼 begin
  lightMeter.begin();
  
  //가속도 시리얼 begin
  xl.begin(10);                   // Setup SPI protocol, issue device soft reset
  xl.beginMeasure();              // Switch ADXL362 to measure mode  
  
}


//  Where the Magic Happens
void loop(){
  
   //==조도센서 lightMeter리드라이트레벨함수(부호없는 char 16비트 lux로 이름 정의)================
  uint16_t lux = lightMeter.readLightLevel();

 //===========================심박센서============================================================
    serialOutput() ;       
    
  if (QS == true){     // A Heartbeat Was Found
                       // BPM and IBI have been Determined
                       // Quantified Self "QS" true when arduino finds a heartbeat
        //fadeRate = 255;         // Makes the LED Fade Effect Happen
                                // Set 'fadeRate' Variable to 255 to fade LED with pulse
        serialOutputWhenBeatHappens();   // A Beat Happened, Output that to serial.     
        QS = false;                      // reset the Quantified Self flag for next time    
  }
     
  //ledFadeToBeat();                      // Makes the LED Fade Effect Happen 
  delay(200);                             //  take a break


  //=============================가속도센서 값 보여주기==============================================
 
  xl.readXYZTData(X, Y, Z, Temperature);  
 
  Serial.print("XVALUE=");
  Serial.print(X);   
  Serial.print("\tYVALUE=");
  Serial.print(Y);  
  Serial.print("\tZVALUE=");
  Serial.print(Z);  
  Serial.print("\tTEMPERATURE=");
  Serial.println(Temperature);   
  delay(100);                // Arbitrary delay to make serial monitor easier to observe
  
  //====================================================================================================  

  //===========심박센서 5분동안 값 저장시켜 저장시킨 값을 평균으로 환산하여 값 보내기====================
   sum += lux;
  if(++sum_cnt + 5 >= 50) // 5초마다
  {
  sum /= 50; // 50으로 나눠 평균함
  sensor_save[sensor_index++] = sum;
  
  if(sensor_index >= 5*60) // 5분 저장 됨
  {
  sensor_index = 0;
  
  for(int i = 0 ; i < 5 *60 ; i ++) {
  Serial.print(i);Serial.print("=");Serial.println(sensor_save[i]);
      } 
    }
  }

   //=================조도센서============================================================================
   //mySerial로 조도센서값 보내기
   Serial.print(lux);
   Serial.println(" lx");
   delay(1000);
}
//=============================================================================================

/*
//======================심박센서=================================================================
void ledFadeToBeat(){
    fadeRate -= 15;                         //  set LED fade value
    fadeRate = constrain(fadeRate,0,255);   //  keep LED fade value from going into negative numbers!
    analogWrite(fadePin,fadeRate);          //  fade LED
  }
*/


 

지금까지 소스를 짠겁니다...사실 예제파일을 센서들끼리 붙여서 좀 수정했습니다..

그런데 문제는 여기서 심박,조도,가속도 센서들의 값을 받아 실시간으로 바로 뿌려주는게아니라 3개센서들의 값을 누적시켰다가 누적시킨값을 평균내어  5분에 한번씩 블루투스를통해 스마트기기로 통신시키려는 소스를 짤려고해요.. 지금 제가 한게 맞는지도 모르겠고... 어떻게 손봐야할지 막막해서 글을 올립니다.. 센서들의 값은 1초에 한번씩 받는게아니라 용량문제로 5~10초에 한번씩 값은받는데 그 값을 누적시켜 평균을 환산하여 5분에 한번씩 블루투스로 값을 전송하는 소스를좀...  가르쳐주세요... 고수님들 도와주세요.. 만들려고하는건 스마트워치입니다... 궁금하신건 쪽지나 답글 부탁드려요

소스의 출처는 구글에서 심박센서 소스라고치면 나오는 기본적인 소스로 했구요 조도,가속도역시 기본예제를 사용했습니다.. 거기서조금씩 변형시킨겁니다

이전글   |    아두이노-안드로이드 블루투스 통신 질문 드립니다~... 2016-11-16
다음글   |    와이파이 쉴드로 날씨 정보 가져오기 문제 도와주세요 ㅠㅠㅠ(절박)... 2016-11-17