Translate

Membuat Alat Deteksi Heart Beat (BPM) dan SPO2 (Oximetry) ARDUINO

Membuat Alat Deteksi Heart Beat (BPM) dan SPO2 (Oximetry) ARDUINO


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk memonitor BPM / heart beat dan SPO2 / oximetry secara bersamaan dengan menggunakan Arduino. alat ini tentunya harus dilakukan kalibrasi terlebih dahulu agar didapat hasil yang maksimal. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Uno




b. Sensor / Probe




c. LCD 16x2




d. Skema Amplifier (Link DOWNLOAD)




e. Program Arduino Uno (BPM + SPO2)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
#include <TimerOne.h>
#define LED 9


//========================BPM=================================
float ref,hold,periode,frekuensi = 0;
int logika_detak, detak,bpm, BPM, waktu, logika_safety, waktu_safety= 0;
//========================TIMER===========================

int milidetik;
float TF;
unsigned char spo2 = 0;
//unsigned int ACredlamp,ACinfrared,DCredlamp,DCinfrared;
unsigned int maksimumACredlamp = 0, maksimumACinfrared = 0;;
int counteran;
int logika, holdACinfrared;
float ratio = 0;
float bagi1, bagi2;
int nodetak = 0;
unsigned char cekdetak = 0;
int tampilkan;

  float ACredlamp;
  float DCredlamp;
  float DCinfrared;
  float ACinfraredbpm;
  float ACinfrared;


void interruptSetup()  //inisialisasi buat timer
{
 TCCR2A = 0x02;    
 TCCR2B = 0x06;   
 OCR2A = 0X3e;     
 TIMSK2 = 0x02;   
 sei();  
}

ISR(TIMER2_COMPA_vect)  //interupsi timer tiap 1 ms
{
  milidetik++;  //milidetik bertambah 1 (untuk hitungan realtime)
  counteran++;
  tampilkan++;
 }



void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
 interruptSetup();  //inisialisasi timer interupt
 pinMode ( LED, OUTPUT );
  lcd.begin(16,2);
  lcd.init();                                       
  lcd.backlight();
}

void loop() {
  ACredlamp = analogRead(A0); //pembacaan sinyal ACRed
  DCredlamp = analogRead(A2); //pembacaan sinyal DCRed
  DCinfrared = analogRead(A3); //pembacaan sinyal DCIR
  ACinfraredbpm = analogRead(A1); //pembacaan sinyal ACIR
  Serial.println(ACinfraredbpm);
  ACinfrared =( ACinfraredbpm/1023*5);
 
 if(ref<=ACinfrared){
        ref=ACinfrared;
        }
      else{
        ref=ref;
        hold=(ref*6/10);
        if((ACinfrared<=hold)&&(logika_safety==0))
        {
          waktu_safety=waktu_safety+1;
          if(waktu_safety==200){
            waktu_safety=0;
            logika_safety=1;
            BPM=0;
          }
        }
        if((ACinfrared<=hold)&&(logika_safety==1)){
          ref=0;
          logika_safety=0; 
        }
        if(ACinfrared>hold){
          waktu_safety=0; 
        }
        if((ACinfrared>hold)&&(logika_detak==0)){
          logika_detak=1;
        }
        if((ACinfrared<hold)&&(logika_detak==1)){
          detak=detak+1;
          logika_detak = 0;
          bpm++;
          //Serial.print(detak);
          digitalWrite ( LED,HIGH );
          delay (500);
          digitalWrite ( LED,LOW );
        }
      }
          if (detak==5)
          {
            detak=0;
            periode=milidetik/5;
            frekuensi=1000/periode;
            BPM=frekuensi*60;
//            Serial.print(milidetik);
//            Serial.print("--");
//            Serial.print(periode);
//            Serial.print("--");
//            Serial.print(frekuensi);
//            Serial.print("--");
//            Serial.print(BPM);
//            Serial.println("--------------------------------"); 
            milidetik=0;

               //delay(5000);
               //lcd.clear();
               spo();
          }    

   lcd.setCursor(0,0);
   lcd.print("BPM:");
   lcd.print(detak);
   lcd.print("/");
   lcd.print(BPM);
   lcd.print("     ");
    lcd.setCursor(0, 1);
    lcd.print("SpO2:");
    lcd.print(spo2);
    lcd.print("%    ");
}


void spo(){

  ACredlamp = analogRead(A0); //pembacaan sinyal ACRed
  DCredlamp = analogRead(A2); //pembacaan sinyal DCRed
  DCinfrared = analogRead(A3); //pembacaan sinyal DCIR
  ACinfraredbpm = analogRead(A1); //pembacaan sinyal ACIR
  Serial.println(ACinfraredbpm);
  ACinfrared =( ACinfraredbpm/1023*5);
 
    //====olah SPO2====//
  if (maksimumACredlamp < ACredlamp)
  {
    maksimumACredlamp = ACredlamp;
  }      //untuk mendeteksi puncak (apabila puncak kurang dari maksimum puncak tetep menampilkan nilai puncak tertinggi)
  if (maksimumACinfrared < ACinfrared)
  {
    maksimumACinfrared = ACinfrared;
  }
  else
  {
    maksimumACinfrared = maksimumACinfrared; ////nilai maks acred
    holdACinfrared = (maksimumACinfrared * 0.8);
  }
  if (ACinfrared > holdACinfrared)            //apabila nilai adc dari tegangan ac infrared lebih dari 50, dan terdapat perubahan logika dari 0 ke 1 maka nilai counteran akan bertambah
  { // apabila tidak terdapat perubahan logika, counteran tidak bertambah
    if (logika == 0)
    {
      counteran++;
      nodetak = 0;
    }
    logika = 1;
  }
  else
  {
    logika = 0;
  }

  if (counteran >= 5)
  {
    if (DCredlamp == 0) //apabila counteran sudah sejumlah 5 kali, dan apabila nilai adc yg dibaca dari tegangan dc red lamp = 0, maka variabel bagi 1 dianggap bernilai 0
    {
      bagi1 = 0;
    }
    else               //apabila nilai adc dari tegangan dc red lamp bukan 0, maka akan menjalankan program variabel bagi1 yg berasal dari nilai adc tegangan maksimum ac red lamp dibagi dengan nilai adc tegangan dc red lamp
    {
      bagi1 = (float) maksimumACredlamp / DCredlamp;
    }
    if (DCinfrared == 0)
    {
      bagi2 = 0;        //apabila counteran sudah sejumlah 5 kali, dan apabila nilai adc yg dibaca dari tegangan dc infrared = 0, maka variabel bagi 2 dianggap bernilai 0
    }
    else
    {
      bagi2 = (float) maksimumACinfrared / DCinfrared; //apabila nilai adc dari tegangan dc infared bukan 0, maka akan menjalankan program variabel bagi2 yg berasal dari nilai adc tegangan maksimum ac infrared dibagi dengan nilai adc tegangan dc infrared
    }

    if (bagi2 == 1) //apabila nilai adc yg dihasilkan bagi2 = 0, maka akan ditampilkan presentase nilai spo2 = 0
    {
      spo2 = spo2;
    }
    else         //apabila nilai adc yg dihasilkan bagi2 bukan 0, maka akan menjalankan program dengan variabel ratio yg menghasilkan nilai adc dari nilai adc bagi 1 dibagi dengan nilai adc bagi 2
    { //kemudian menjalankan program dengan variabel spo2 yang nilainya didapat dari perhitungan matematis dengan memasukkan nilai adc dari variabel ratioratio=(float) bagi1/bagi2;
      ratio = (float) bagi1 / bagi2;
      delay(100);
      spo2 = 110 - (25 * ratio)
      ;
    }
    counteran = 0;              //apabila semua program diatas sudah dijalankan maka program kembali ke langkah awal/me-reset ulang program
    maksimumACredlamp = 0;
    maksimumACinfrared = 0;
   
   // lcd.setCursor(0, 0);
   // lcd.print("SpO2:");
  //  lcd.print(spo2);
  //  lcd.print("%");
   // delay(5000);
   // lcd.clear();
    return;
   
  }
  tampilkan++;
 
  cekdetak++;
  if (cekdetak == 50 && nodetak == 0) //apabila selama 50x10ms=500ms variabel nodetak=1, maka tampilan nilai presentase spo2 = 0 dan cek detak kembali ke 0/me-reset ulang timer
  {
    spo2 = spo2;
    nodetak = 1;
    cekdetak = 0;
  }
  if (tampilkan == 1000) //selama 20x10ms=200ms, tampilkan akan kembali ke 0/me-reset ulang/menampilkan data baru, apabila nilai spo2 > 100 maka nilai spo2 yang ditampilkan = 100
  {
    tampilkan = 0;
    int spo2, temp;
  }
  if (DCredlamp==0)
  {
    spo2=0;
  }

  {
      
 //   lcd.setCursor(0, 1);
 //   lcd.print("SpO2:");
 //   lcd.print(spo2);
 //   lcd.print("%    ");
   
  }
    
  spo();
  }





f. Program Arduino IDE (BPM)

#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
#define LED 9

//========================BPM=================================
float ref,hold,periode,frekuensi = 0;
int logika_detak, detak,bpm, BPM, waktu, logika_safety, waktu_safety= 0;
//========================TIMER===========================
int milidetik;

void interruptSetup()  //inisialisasi buat timer
{
 TCCR2A = 0x02;    
 TCCR2B = 0x06;   
 OCR2A = 0X3e;     
 TIMSK2 = 0x02;   
 sei();  
}

ISR(TIMER2_COMPA_vect)  //interupsi timer tiap 1 ms
{
  milidetik++;  //milidetik bertambah 1 (untuk hitungan realtime)
 }



void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);
 interruptSetup();  //inisialisasi timer interupt
 pinMode ( LED, OUTPUT );
  lcd.begin(16,2);
  lcd.init();                                       
  lcd.backlight();
}

void loop() {
  float ACredlamp = analogRead(A0); //pembacaan sinyal ACRed
  float DCredlamp = analogRead(A2); //pembacaan sinyal DCRed
  float DCinfrared = analogRead(A3); //pembacaan sinyal DCIR
  float ACinfraredbpm = analogRead(A1); //pembacaan sinyal ACIR
  Serial.println(ACinfraredbpm);
  float ACinfrared =( ACinfraredbpm/1023*5);
 if(ref<=ACinfrared){
        ref=ACinfrared;
        }
      else{
        ref=ref;
        hold=(ref*6/10);
        if((ACinfrared<=hold)&&(logika_safety==0))
        {
          waktu_safety=waktu_safety+1;
          if(waktu_safety==200){
            waktu_safety=0;
            logika_safety=1;
            BPM=0;
          }
        }
        if((ACinfrared<=hold)&&(logika_safety==1)){
          ref=0;
          logika_safety=0; 
        }
        if(ACinfrared>hold){
          waktu_safety=0; 
        }
        if((ACinfrared>hold)&&(logika_detak==0)){
          logika_detak=1;
        }
        if((ACinfrared<hold)&&(logika_detak==1)){
          detak=detak+1;
          logika_detak = 0;
          bpm++;
          //Serial.print(detak);
          digitalWrite ( LED,HIGH );
          delay (500);
          digitalWrite ( LED,LOW );
        }
      }
          if (detak==5)
          {
            detak=0;
            periode=milidetik/5;
            frekuensi=1000/periode;
            BPM=frekuensi*60;
//            Serial.print(milidetik);
//            Serial.print("--");
//            Serial.print(periode);
//            Serial.print("--");
//            Serial.print(frekuensi);
//            Serial.print("--");
//            Serial.print(BPM);
//            Serial.println("--------------------------------"); 
            milidetik=0;
          }    
  lcd.setCursor(0,0);
   lcd.print("BPM:");
   lcd.print(milidetik);
   lcd.setCursor(0,1);
   lcd.print("DETAK:");
   lcd.print(detak);
}






g. Program Arduino IDE (SPO2)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
#define LED 9
float TF;
unsigned char spo2 = 0;
//unsigned int ACredlamp,ACinfrared,DCredlamp,DCinfrared;
unsigned int maksimumACredlamp = 0, maksimumACinfrared = 0;;
int counteran;
int logika, holdACinfrared;
float ratio = 0;
float bagi1, bagi2;
int nodetak = 0;
unsigned char cekdetak = 0;
int tampilkan;
//==================BPM==============//
//float ref, hold,periode, frekuensi = 0;
//int logika_detak, detak, bpm, BPM,waktu, logika_safety, waktu_safety = 0;
//int milidetik ;
void interruptSetup()  //inisialisasi buat timer
{
 TCCR2A = 0x02;    
 TCCR2B = 0x06;   
 OCR2A = 0X3e;     
 TIMSK2 = 0x02;   
 sei();  
}

ISR(TIMER2_COMPA_vect)  //interupsi timer tiap 1 ms
{
  counteran++;
  tampilkan++;
 }

void setup() {
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.init();                                       
  lcd.backlight();                     

}
void loop()

{
  float ACredlamp = analogRead(A0); //pembacaan sinyal ACRed
//   Serial.println(ACredlamp);
  float ACinfrared = analogRead(A1); //pembacaan sinyal ACIR
Serial.println(ACinfrared);
  float DCredlamp = analogRead(A2); //pembacaan sinyal DCRed
  float DCinfrared = analogRead(A3); //pembacaan sinyal DCIR

  //====olah SPO2====//
  if (maksimumACredlamp < ACredlamp)
  {
    maksimumACredlamp = ACredlamp;
  }      //untuk mendeteksi puncak (apabila puncak kurang dari maksimum puncak tetep menampilkan nilai puncak tertinggi)
  if (maksimumACinfrared < ACinfrared)
  {
    maksimumACinfrared = ACinfrared;
  }
  else
  {
    maksimumACinfrared = maksimumACinfrared; ////nilai maks acred
    holdACinfrared = (maksimumACinfrared * 0.8);
  }
  if (ACinfrared > holdACinfrared)            //apabila nilai adc dari tegangan ac infrared lebih dari 50, dan terdapat perubahan logika dari 0 ke 1 maka nilai counteran akan bertambah
  { // apabila tidak terdapat perubahan logika, counteran tidak bertambah
    if (logika == 0)
    {
      counteran++;
      nodetak = 0;
    }
    logika = 1;
  }
  else
  {
    logika = 0;
  }

  if (counteran == 5)
  {
    if (DCredlamp == 0) //apabila counteran sudah sejumlah 5 kali, dan apabila nilai adc yg dibaca dari tegangan dc red lamp = 0, maka variabel bagi 1 dianggap bernilai 0
    {
      bagi1 = 0;
    }
    else               //apabila nilai adc dari tegangan dc red lamp bukan 0, maka akan menjalankan program variabel bagi1 yg berasal dari nilai adc tegangan maksimum ac red lamp dibagi dengan nilai adc tegangan dc red lamp
    {
      bagi1 = (float) maksimumACredlamp / DCredlamp;
    }
    if (DCinfrared == 0)
    {
      bagi2 = 0;        //apabila counteran sudah sejumlah 5 kali, dan apabila nilai adc yg dibaca dari tegangan dc infrared = 0, maka variabel bagi 2 dianggap bernilai 0
    }
    else
    {
      bagi2 = (float) maksimumACinfrared / DCinfrared; //apabila nilai adc dari tegangan dc infared bukan 0, maka akan menjalankan program variabel bagi2 yg berasal dari nilai adc tegangan maksimum ac infrared dibagi dengan nilai adc tegangan dc infrared
    }

    if (bagi2 == 1) //apabila nilai adc yg dihasilkan bagi2 = 0, maka akan ditampilkan presentase nilai spo2 = 0
    {
      spo2 = spo2;
    }
    else         //apabila nilai adc yg dihasilkan bagi2 bukan 0, maka akan menjalankan program dengan variabel ratio yg menghasilkan nilai adc dari nilai adc bagi 1 dibagi dengan nilai adc bagi 2
    { //kemudian menjalankan program dengan variabel spo2 yang nilainya didapat dari perhitungan matematis dengan memasukkan nilai adc dari variabel ratioratio=(float) bagi1/bagi2;
      ratio = (float) bagi1 / bagi2;
      delay(100);
      spo2 = 110 - (25 * ratio)
      ;
    }
    counteran = 0;              //apabila semua program diatas sudah dijalankan maka program kembali ke langkah awal/me-reset ulang program
    maksimumACredlamp = 0;
    maksimumACinfrared = 0;
  }
  tampilkan++;
 
  cekdetak++;
  if (cekdetak == 50 && nodetak == 0) //apabila selama 50x10ms=500ms variabel nodetak=1, maka tampilan nilai presentase spo2 = 0 dan cek detak kembali ke 0/me-reset ulang timer
  {
    spo2 = spo2;
    nodetak = 1;
    cekdetak = 0;
  }
  if (tampilkan == 1000) //selama 20x10ms=200ms, tampilkan akan kembali ke 0/me-reset ulang/menampilkan data baru, apabila nilai spo2 > 100 maka nilai spo2 yang ditampilkan = 100
  {
    tampilkan = 0;
    int spo2, temp;
  }
  if (DCredlamp==0)
  {
    spo2=0;
  }

  {
   
    lcd.setCursor(0, 0);
    lcd.print("SpO2:");
    lcd.print(spo2);
    lcd.print("%");
   

  }
       
}





h. Cara Penggunaan Alat

          Cara menggunakan alat ini yaitu pertama hubungkan probe ke amplifier seperti skema yang telah diberikan diatas, kemudian output dari amplifer dimasukkan ke Arduino atau microcontroller, jangan lupa untuk menghubungkan alat ke adaptor atau power supply.













No comments:

Post a Comment