T1 Lampiran Institutional Repository | Satya Wacana Christian University: Media Pembelajaran Sistem Pengukuran Aktivitas Elektrik Jantungeadaan Oksigen dalam Darah, dan Tekanan Darah dengan Metode NonInvasive

LAMPIRAN A

#Program Sistem Media Pembelajaran Biomedical
#include
#include
#include
#include
#include
#include




"TouchScreen.h"



#define
#define
#define
#define

#define

LCD_CS A3
LCD_CD A2
LCD_WR A1
LCD_RD A0
LCD_RESET A4

#define
#define
#define
#define

TS_MINX
TS_MINY
TS_MAXX
TS_MAXY

#define
#define

#define
#define

YP
XM
YM
XP

A1
A2
7
6

204
195
948
910
//
//
//

//

must be an analog pin, use "An" notation!
must be an analog pin, use "An" notation!
can be a digital pin
can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
#define
#define
#define
#define
#define
#define
#define
#define

BLACK

BLUE
RED
GREEN
CYAN
MAGENTA
YELLOW
WHITE

0x0000
0x001F
0xF800
0x07E0
0x07FF
0xF81F
0xFFE0
0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
boolean buttonEnabled = true;
boolean buttonEnabled1 = true;

boolean buttonEnabled3 = true;
boolean buttonEnabled4 = true;
boolean flag_puncak= false;
boolean flag_lembah = false;
boolean cetak_EKG=false;
boolean cetak_akhir=true;
int simpan_bpm_blood[200];
int bpm_blood=0;
1

50

int q=0; // isi array jumlah HR tekanan
unsigned long waktu_awalBaca=0;
int tanda_amplitudo=0;
int letak_MAP=0;
int x=0;//sumbu x LCD
boolean masuk_subMenu =true;
boolean cetak_menuUtama=false;
int pil=0;

int data_acLED=0;
int data_acIR=0;
int data_dcLED=0;
int data_dcIR=0;
boolean flag_cetak_subMenu=true;
#define pin_AC A15
#define pin_DC A14
#define pin_tekananAsli A13
#define pin_tekananFilter A12
#define pin_EKG A11
#define pin_LED 22
#define pin_IR 24
#define pin_pompa 26
#define pin_buzzer 28
#define pin_valve 30
int nilai =0;
int hasil=0;
unsigned long waktu_awalPuncak=0;
unsigned long waktu_akhirPuncak=0;
int waktu_selisihPuncak=0;

int max_acLED=0;
int max_acIR=0;
int min_acLED=10000;
int min_acIR=10000;
int m=0; // tanda LED ke IR
int n=0; // tanda IR ke LED
int selisih_acLED=0;
int selisih_acIR=0;
float ratio_acLED=0;
float ratio_acIR=0;
int spo2=0;
int tanda_spo2=0;
int tekanan_asli=0;
int tekanan_filter=0;
int data_tekananAsli=0;
int data_tekananFilter=0;
int mmhg=0;
int batas_tekanan=180;
boolean tekanan_berhenti=false;
int data_mmhg[500];

int rata_mmhg=0;
unsigned long total_mmhg;
int e=0; //isi array jumlah rata2 mmhg
int addr=0;
int baca_data_tekananFilter=0;
int batas_puncakTekanan=0;
int error_puncak=2;//4

2

51

int maks_tekanan=0;
int min_tekanan=1000;
int tinggi_tekanan=0;
int tanda_puncakTekanan=0;
int tanda_puncakTekanan1=0;
int waktu_awal_puncakTekanan=0;
int waktu_akhir_puncakTekanan=0;
int waktu_selisih_puncakTekanan=0;

boolean flag_cetak_bpmBP=false;
int v=0; //proteksi data rusak tekanan darah
int simpan_tinggi[500];
int simpan_tekanan[500];
int y=0; // array simpan tinggi dan tekanan
int habis_tekanan=60;
boolean flag_cetak_SDH=false;
int r=0; // isi array tekanan
int MAP=0;
boolean flag_panjang_arrayTekanan=false;
int z=0; // panjang array tekanan
int u=0; //isi array simpan tekanan dan tinggi
int nilai_sistol=0;
int nilai_diastol=0;
int tekanan_MAP=0;
boolean j=false; // proteksi data rusak HR Tekanan darah
boolean tanda_habis=false;
boolean lanjut_cetak=false;
boolean ulang=false;
boolean dapat_sistol=false;

const int numReadings =3;
int readings[numReadings];
// the readings from the analog
input
int readIndex = 0;
// the index of the current
reading
int total = 0;
// the running total
int average = 0;
const int numReadings2 =8;
int readings2[numReadings2];
// the readings from the analog
input
int readIndex2 = 0;
// the index of the current
reading
int total2 = 0;
// the running total
int average2 = 0;

const int numReadings3 =50;
int readings3[numReadings3];
// the readings from the analog input
int readIndex3 = 0;
// the index of the current reading
int total3 = 0;
// the running total
int average3 = 0;
const int numReadings4 =5;
int readings4[numReadings4];
// the readings from the analog input
int readIndex4 = 0;
// the index of the current reading
int total4 = 0;
// the running total
int average4 = 0;
const int numReadings5 =50;
int readings5[numReadings5];
// the readings from the analog input
int readIndex5 = 0;
// the index of the current reading
int total5 = 0;
// the running total
int average5 = 0;
3

52

int maks_tekanan=0;
int min_tekanan=1000;
int tinggi_tekanan=0;
void setup() {
Serial.begin(9600);
Serial.print("Starting...");
tft.reset();
tft.begin(0x7575);
tft.setRotation(1);
pinMode(pin_LED,OUTPUT);
pinMode(pin_IR,OUTPUT);
pinMode(pin_buzzer,OUTPUT);
pinMode(pin_valve,OUTPUT);
pinMode(pin_tekananAsli,INPUT);
pinMode(pin_tekananFilter,INPUT);
digitalWrite(pin_buzzer,LOW);
digitalWrite(pin_valve,LOW);
}
void loop()
{
Serial.println("loop1");
if (cetak_menuUtama==false)
{
menuUtama();
cetak_menuUtama=true;
}
TSPoint p = ts.getPoint();
// we have some minimum pressure we consider 'valid'
// pressure of 0 means no pressing!
if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\tPressure = "); Serial.println(p.z);
}
//TSPoint p = ts.getPoint();
if(p.x>108 && p.x133 && p.y
MINPRESSURE && p.z < MAXPRESSURE )
{
Serial.println("if1");
pil=1;
masuk_subMenu=true;
flag_cetak_subMenu=true;
digitalWrite(pin_buzzer,LOW);
boolean flag_puncak = false;
boolean flag_lembah = false;
buttonEnabled = false;
buttonEnabled1=true;
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
}

4

53

else if(p.x>396 && p.x122 && p.y
MINPRESSURE && p.z < MAXPRESSURE )
{
Serial.println("if2");
pil=2;
flag_cetak_subMenu=true;
masuk_subMenu=true;
buttonEnabled = false;
buttonEnabled1=true;
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
digitalWrite(pin_buzzer,LOW);
}
else if(p.x>662 && p.x112 && p.y MINPRESSURE && p.z < MAXPRESSURE )
{
Serial.println("if 3");
pil=3;
masuk_subMenu=true;
flag_cetak_subMenu=true;
flag_cetak_SDH=true;
r=0;
flag_panjang_arrayTekanan=true;
z=0;
flag_cetak_bpmBP=false;
letak_MAP=0;
MAP=0;
ulang=true;
u=0;
v=0;
digitalWrite(pin_buzzer,LOW);
tanda_puncakTekanan=0;
tanda_puncakTekanan1=0;
nilai_sistol=0;
nilai_diastol=0;
dapat_sistol=false;
digitalWrite(pin_valve,LOW);
tekanan_MAP=0;
tekanan_berhenti=false;
tanda_habis=false;
buttonEnabled = false;
buttonEnabled1=true;
lanjut_cetak=false;
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
}

5

54

switch(pil)
{
case 1:
Serial.println("case 1 ");
menuEKG();
break;
case 2:
menuPPG();
break;
case 3:
menuBLOOD();
break;
default:
break;
}
delay(1);
}
void menuUtama()
{

//Tombol EKG
tft.fillRect(0,0,320, 80, RED);
tft.drawRect(0,0,320,80,WHITE);
tft.setCursor(119,25);
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.print("EKG");
//Tombol PPG
tft.fillRect(0,80,320,80, BLUE);
tft.drawRect(0,80,320,80,WHITE);
tft.setCursor(119,105);
tft.setTextColor(WHITE);
tft.setTextSize(4);
tft.print("PPG");
//Tombol BLOODPRESSURE
tft.fillRect(0,160,320, 79, GREEN);
tft.drawRect(0,160,320,79,WHITE);
tft.setCursor(35,185);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("BLOOD PRESSURE");
digitalWrite(pin_buzzer,LOW);
}

6

55

void menuEKG()
{
while( masuk_subMenu==true)
{
//This is important, because the libraries are sharing pins
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if(flag_cetak_subMenu==true)
{
tft.fillRect(0,60,200,60,BLUE);
tft.fillRect(0,0,200,60,RED);
tft.setCursor(0,25);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("
HR");
tft.fillRect(0,120,320,240,BLACK);
tft.fillRect(200,0,320,120,YELLOW);
tft.setCursor(220,50);
tft.setTextColor(BLACK);
tft.setTextSize(3);
tft.print("HOME");
flag_cetak_subMenu=false;
}
for(x=0; x122 && p.x120 && p.y 2&&buttonEnabled3==true)
{
m=0;
}

8

57

}
masuk_subMenu=false;
}
void menuBLOOD()
{
while(
{

masuk_subMenu==true)

//This is important, because the libraries are sharing pins

pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if(flag_cetak_subMenu==true)
{
tft.fillRect(0,0,200,60,RED);

// HALAMAN

PPG
tft.setCursor(0,25);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("HR = ");
tft.fillRect(0,60,200,60,BLUE);
tft.setCursor(0,80);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("P(mmhg)= ");
tft.fillRect(0,120,320,240,BLACK);
tft.fillRect(200,0,320,120,YELLOW);
tft.setCursor(220,50);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print("HOME");
flag_cetak_subMenu=false;
}

baca_Tekanan();
pompa();
puncak_Tekanan();
}
masuk_subMenu=false;
}

9

58

void baca_LED()
{
digitalWrite(pin_buzzer,LOW);
digitalWrite(pin_LED,HIGH);
digitalWrite(pin_IR,LOW);
flag_puncak=false;
flag_lembah=false;
delay(2000);
for(x=0; x1)
{
max_acLED=0;
min_acLED=10000;
tanda_amplitudo=0;
}
if(data_acLED > max_acLED)
{
max_acLED= data_acLED;
data_dcLED=analogRead(A14);
}
//Baca Min AC LED
if(data_acLED < min_acLED)
{
min_acLED = data_acLED;

}
if(p.x>122 && p.x120 && p.y 100 && flag_puncak == false )
{
waktu_awalPuncak=millis();
flag_puncak = true;
digitalWrite(pin_buzzer,HIGH);
}
if (data_acLED < 80 && flag_puncak==true)
{
flag_lembah = true;
digitalWrite(pin_buzzer,LOW);
}
if(data_acLED>100 && flag_lembah == true )
{
digitalWrite(pin_buzzer,HIGH);
waktu_akhirPuncak=millis();
waktu_selisihPuncak=waktu_akhirPuncak-waktu_awalPuncak;
tft.fillRect(100,25,100,25,RED);
tft.setCursor(100,25);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print((60000/waktu_selisihPuncak));
flag_puncak = false;
flag_lembah = false;
tanda_amplitudo++;
tanda_spo2++;
}
delay(6);
}
m=5;
tft.fillRect(0,120,320,240,BLACK);
x=0;
}
void baca_IR()
{
digitalWrite(pin_buzzer,LOW);
digitalWrite(pin_LED,LOW);
digitalWrite(pin_IR,HIGH);
flag_puncak=false;
flag_lembah=false;
delay(2000);

11

60

for(x=0; x1)
{
max_acIR=0;
min_acIR=10000;
tanda_amplitudo=0;
}
if(data_acIR > max_acIR)
{
max_acIR= data_acIR;
data_dcIR=analogRead(A14);
}
//Baca Min AC LED
if(data_acIR < min_acIR)
{
min_acIR = data_acIR;
}
if(p.x>122 && p.x120 && p.y 100 && flag_puncak == false )
{
waktu_awalPuncak=millis();
flag_puncak = true;
digitalWrite(pin_buzzer,HIGH);
}
if (data_acIR < 80 && flag_puncak==true)
{
flag_lembah = true;
digitalWrite(pin_buzzer,LOW);
}
if(data_acIR>100 && flag_lembah == true )
{
waktu_akhirPuncak=millis();
waktu_selisihPuncak=waktu_akhirPuncak-waktu_awalPuncak;
tft.fillRect(100,25,100,25,RED);
tft.setCursor(100,25);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print((60000/waktu_selisihPuncak));
flag_puncak = false;
flag_lembah = false;
tanda_amplitudo++;
tanda_spo2++;
}
delay(6);
}
n=5;
tft.fillRect(0,120,320,240,BLACK);
x=0;
}
void hitung_spo2()
{
Serial.print("dc LED=========================================");
Serial.println(data_dcLED);
Serial.print("dc IR=========================================");
Serial.println(data_dcIR);
Serial.print("ratio_acLED=========================================");
Serial.println(ratio_acLED);
Serial.print("ratio_acIR=========================================");
Serial.println(ratio_acIR);

13

62

ratio_acLED=(float)(0.701*selisih_acLED)/data_dcLED;
ratio_acIR=(float)(0.701*selisih_acIR)/data_dcIR;
spo2=(110 -((ratio_acLED/ratio_acIR)*25))+11;
Serial.print("SPO2=========================================");
Serial.println(spo2);
Serial.print("spo2=================");
tft.fillRect(90,60,100,50,BLUE);
tft.setCursor(100,80);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print(spo2);
}
void baca_Tekanan()
{
digitalWrite(pin_buzzer,LOW);
if(tanda_habis==false)
{
for(x=0; x122 && p.x120 && p.y 3)
{
j=true;
}
if(flag_cetak_bpmBP==true && tekanan_berhenti==true && j==true &&
tanda_habis==false)
{
tft.fillRect(100,25,100,25,RED);
tft.setCursor(100,25);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print((60000/waktu_selisih_puncakTekanan));
flag_cetak_bpmBP=false;
}
if(e>=9 && tanda_habis==false)
{
rata_mmhg=total_mmhg/10;
tft.fillRect(130,60,70,50,BLUE);
tft.setCursor(135,80);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.print(mmhg);
e=0;
}
tft.drawPixel(x,data_tekananFilter,WHITE);
tft.drawPixel(x,data_tekananFilter+1,WHITE);
tft.drawPixel(x,data_tekananFilter+2,WHITE);
tft.drawPixel(x,data_tekananFilter+3,WHITE);
if(mmhg