DAFTAR PUSTAKA [1] Rina. (2007). Perencanaan Sistem Koordinasi Rele Arus Lebih (OCR) Dengan Rele Gangguan Tanah (GFR) Sistem Proteksi Kota Padang. Universitas Bung Hatta: Skripsi S1. [2] Abdul Kadir “BUKU PANDUAN PRAKTIS MEMPELAJARI APLIKASI MIKROKONTROLLER DAN PEMPROGRAMANNYA MENGGUNAKAN ARDUINO , Andi Publiser, 2013. [3] Heru
Dibyo
Laksono,
IMPLEMENTASI
RELAY
M.
Nasir ARUS
Sonni
“PERANCANGAN
LEBIH
SESAAT
DAN
BERBASIS
MICROCONTROLLER”. Jurusan Teknik Elektro, Univeristas Andalas Padang Sumatera Barat. September 2007. [4] Zuhal. (1991). Dasar Tenaga Listrik. Institute Teknologi Bandung: Skripsi S1. [5] Desrizal. (2007). Studi Penentuan Karakteristik Waktu Tunda Dan Waktu Kerja Over Current Relay (OCR) Dan Pemutus Balik Otomatis. Universitas Bung Hatta: Skripsi S1 [6] Ir. ILMANZA R.K., M.InfoTech.,17 Proyek Arduino. [7] Massimo Banzi “GETTING STARTED WITH ARDUINO”, USA , 2009. [8] Operation and configuration instructions Datasheet vamp 40, Vamp LTD Vaasa Finlandia [9] REF 610 Installation Use Comissioning, ABB , 2000.
58
http://digilib.mercubuana.ac.id/
LAMPIRAN 1 Kode Program Mikrokontroler Arduino #include <Wire.h> #include
#include #define inSensor A0 #define relay 13 #define off HIGH float settOCR,TMS,adcOCR; // SettOCR = Variabel setingan OCR, TMS = Time multiple setting OCR, adcOCR = variabel menyimpan hasil pembacaan sensor int type; //variabel type karakter OCR int oc = 0; //variabel marker status OCR float k1 = 0.14; //konstanta pada N.inv float k2 = 13.5; // konstanta pada L.inv float k3 = 80; //Konstanta pada E.inv float k4 = 120; //konstanta pada L.inv float curr = 0; // Variabel sementara perhitungan perbandingan I/Iset float expfactor1= 0.02; float expfactor2= 2; float interval,interval2; float amplitude_current; float effective_value;
// Float amplitude current // Float effective current
59
http://digilib.mercubuana.ac.id/
unsigned long tim;
const byte ROWS = 4; //Setting Jumlah baris keypad const byte COLS = 4; //Setting Jumlah kolom Keypad char keys[ROWS][COLS] = { // Mapping Karakter Keypad {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','.'} }; byte rowPins[ROWS] = {0,1,2,3}; // pin pada arduino yang digunakan sebagai pin row byte colPins[COLS] = { 4,5,6,7 }; // pin pada arduino yang digunakan sebagai pin row Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inisialisai Keypad LiquidCrystal_I2C lcd(0x3f,16,4); //menuliskan alamat i2c dan type LCD void setup() { lcd.init(); //inisialisasi LCD lcd.backlight(); // fungsi menyalakan backlight pinMode(inSensor,INPUT); // inisialisasi pin A0/insensor sebagai input pinMode(relay,OUTPUT); // inisialisasi pin 13/relay sebagai output digitalWrite(relay,off); // mematikan relay
60
http://digilib.mercubuana.ac.id/
lcd.print("OCR Digital"); lcd.setCursor(0,1); lcd.print("Tugas Akhir"); lcd.setCursor (-4,2); lcd.print("Annisa Amy F"); delay(3000); initSetup(); lcd.print("OCR Start"); } void loop() { while(oc != 2){ adcOCR=getCurrent(); f (adcOCR < settOCR){
// Section ini untuk handling sensor terhadap
perubahan dinamis dari sensor Ta12-100 oc = 0; interval = 0; } if (adcOCR > settOCR && oc == 0 ){
// Section ini untuk trigger apabila
terjadi overload //interval2 = getInterval(); tim = millis(); oc = 1; } 61
http://digilib.mercubuana.ac.id/
if (oc == 1 && millis() - tim > getInterval() ){ // section ini adalah timer yang akan bekerja saat terjadi overload digitalWrite(relay,LOW); oc = 2; } lcd.setCursor (0,0); lcd.print("ADC :"); lcd.print(adcOCR); lcd.setCursor (0,1); lcd.print("OCR :"); lcd.print(settOCR); lcd.setCursor (-4,2); lcd.print("TMS :"); lcd.print(TMS); switch(type){ //section menuliskan type karakter dari OCR yang dipilih case 1: lcd.setCursor (7,2); lcd.print("N.Inv"); break; case 2: lcd.setCursor (7,2);
62
http://digilib.mercubuana.ac.id/
lcd.print("V.Inv"); break; case 3: lcd.setCursor (7,2); lcd.print("E.Inv"); break; case 4: lcd.setCursor (7,2); lcd.print("L.Inv"); break; } lcd.setCursor (-4,3); lcd.print("t :"); lcd.print(interval); } lcd.clear(); lcd.setCursor(0,0); lcd.print("TRIP"); lcd.setCursor(0,1); lcd.print("Press * to Reset"); lcd.setCursor (-4,2); lcd.print("Trip :");
63
http://digilib.mercubuana.ac.id/
lcd.print(interval); lcd.setCursor (-4,3); lcd.print("ADC :"); lcd.print(adcOCR); char key = kpd.getKey(); if (key == '*'){ lcd.clear(); oc = 0; digitalWrite(relay,HIGH); } delay(200); } void initSetup(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter I max"); lcd.setCursor (0,1); lcd.print("min : 0.1 "); lcd.setCursor (-4,2); lcd.print("max : 5 "); lcd.setCursor (-4,3); lcd.print("Enter : ");
64
http://digilib.mercubuana.ac.id/
settOCR = GetNumberFloat(5,0.1); lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter TMS"); lcd.setCursor (0,1); lcd.print("min : 0.1 "); lcd.setCursor (-4,2); lcd.print("max : 10 "); lcd.setCursor (-4,3); lcd.print("Enter : "); TMS = GetNumberFloat(10,0.1); lcd.clear(); lcd.setCursor(0,0); lcd.print("Enter Type"); lcd.setCursor (0,1); lcd.print("1.N.Inv"); lcd.setCursor (8,1); lcd.print("2.V.Inv"); lcd.setCursor (-4,2); lcd.print("3.E.Inv"); lcd.setCursor (4,2); lcd.print("4.L.Inv");
65
http://digilib.mercubuana.ac.id/
lcd.setCursor (-4,3); lcd.print("Enter : "); type = GetNumberInt(4,1); } float GetNumberFloat(float maximal,float minimal) // Fungsi pengolah data input keypad agar bisa digunakan sebagai masukan nilai integer pada variabel tertunjuk { float num = 0; float num2 = 0; int digit = LOW; int po = 0; char key = kpd.getKey(); while(key != '#') { switch (key) { case NO_KEY: break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': lcd.print(key); if (digit==HIGH){ 66
http://digilib.mercubuana.ac.id/
po = po+1; num2 = (key -'0'); num2 = num2 /pow(10,po); num = num + num2; } else{ num = num * 10 + (key - '0'); } break; case '.': lcd.print(key); digit= HIGH; break; case '*': num = 0; lcd.clear(); lcd.print("Enter:"); break; } key = kpd.getKey(); } if (num > maximal){ lcd.clear();
67
http://digilib.mercubuana.ac.id/
lcd.setCursor(0,0); lcd.print("Invalid Value"); lcd.setCursor(0,1); lcd.print("Max Value:"); lcd.print(maximal); delay(3000); lcd.clear(); num = maximal; } else if (num < minimal){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Invalid Value"); lcd.setCursor(0,1); lcd.print("Min Value:"); lcd.print(minimal); delay(3000); lcd.clear(); num = minimal; } else { lcd.clear();
68
http://digilib.mercubuana.ac.id/
lcd.print("save data"); delay(1000); lcd.clear(); }
return num; } int GetNumberInt(int maximal,int minimal) // Fungsi pengolah data input keypad agar bisa digunakan sebagai masukan nilai integer pada variabel tertunjuk { float num = 0; float num2 = 0; int digit = LOW; int po = 0; char key = kpd.getKey(); while(key != '#') { switch (key) { case NO_KEY: break;
69
http://digilib.mercubuana.ac.id/
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': lcd.print(key); num = num * 10 + (key - '0'); break; case '*': num = 0; lcd.clear(); lcd.print("Enter:"); break; } key = kpd.getKey(); } if (num > maximal){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Invalid Value"); lcd.setCursor(0,1); lcd.print("Max Value:"); lcd.print(maximal); delay(3000); lcd.clear();
70
http://digilib.mercubuana.ac.id/
num = maximal; } else if (num < minimal){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Invalid Value"); lcd.setCursor(0,1); lcd.print("Min Value:"); lcd.print(minimal); delay(3000); lcd.clear(); num = minimal; }
else { lcd.clear(); lcd.print("save data"); delay(1000); lcd.clear(); } return num; }
71
http://digilib.mercubuana.ac.id/
float getInterval(){ float num;// Fungsi Pengolah Interval delay aktifasi relay if ( adcOCR > settOCR){ switch(type){ case 1 : curr = adcOCR / settOCR; curr = pow(curr,expfactor1); curr = curr - 1; interval = TMS * k1; interval = interval / curr ; interval = interval * 1000; num = interval; break; case 2 : curr = adcOCR / settOCR; curr = curr - 1; interval = TMS * k2; interval = interval / curr ; interval = interval * 1000; num = interval; break; case 3:
72
http://digilib.mercubuana.ac.id/
curr = adcOCR / settOCR; curr = pow(curr,expfactor2); curr = curr - 1; interval = TMS * k3; interval = interval / curr ; interval = interval * 1000; num = interval; break; case 4: curr = adcOCR / settOCR; curr = curr - 1; interval = TMS * k4; interval = interval / curr ; interval = interval * 1000; num = interval; break; default: interval = 0; num = interval; break; } }
73
http://digilib.mercubuana.ac.id/
else if (adcOCR <= settOCR){ interval = 0; num = interval *1000; } return num; } float getCurrent() { float result; int readValue; int maxValue = 0;
//value read from the sensor // store max value here
uint32_t start_time = millis(); while((millis()-start_time) < 1000) //sample for 1 Sec { readValue = analogRead(A0); // see if you have a new maxValue if (readValue > maxValue) { /*record the maximum sensor value*/ maxValue = readValue; } }
74
http://digilib.mercubuana.ac.id/
result = (maxValue * 5.0)/1024.0; // Convert the digital data to a voltage result = (result/200) * 1000; //Use Ohms law to calculate current across resistor and express in mA result = result * 0.707; // nilai I RMS dari hasil perhitungan result = result * 1000; // ratio perbandingan 1000 : 1 pada CT sehingga nilai akhir sbb result = result/1000; //nilai arus dalam A return result; }
75
http://digilib.mercubuana.ac.id/