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, M. Nasir Sonni “PERANCANGAN DAN IMPLEMENTASI RELAY ARUS LEBIH SESAAT 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
LAMPIRAN 1
Kode Program Mikrokontroler Arduino
#include <Wire.h>
#include <LiquidCrystal_I2C.h> #include <Keypad.h>
#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 amplitude current float effective_value; // Float effective current
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
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; }
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);
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 :");
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 : ");
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");
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);
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();
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();
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;
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();
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; }
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:
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; } }
else if (adcOCR <= settOCR){ interval = 0; num = interval *1000; } return num; } float getCurrent() { float result;
int readValue; //value read from the sensor int maxValue = 0; // 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;
} }
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;