DAFTAR PUSTAKA
Andrianto, Heri. 2008. Pemrograman Mikrokontroler AVR ATMega16 Menggunakan Bahasa C (Codevision AVR).Bandung : Informatika. Ardiwinoto. 2008. Mikrokontroler AVR ATMega 8/32/8535 Bahasa C WINAVR. Bandung :Informatika.
& Pemrogramannya Dengan
Budiharto, Widodo. 2005. Perancangan Sistem dan Aplikasi Mikrokontroler. Jakarta : PT. Alex Media Komputindo. Kadir, Abdul. 2013. Panduan Praktis Mempelajari Aplikasi Mikrokontroller dan Pemrograman Arduino.Yogyakarta :Andi. Lukman, Ardiansyah, Nendi. 2010. Line Follower Robot Peniup Lilin Berlengan Satu Berbasis Microcontroller ATMEGA16. Jakarta : Universitas Mercu Buana. Winoto, Ardi. 2008. Mikrokontroler AVR ATmega 8/16/32/8535 dan Pemrogramannya dengan Bahasa C pada WinAVR. Bandung : Informatika. Arduino. 2014. Examples. http://arduino.cc/en/Tutorial/HomePage. 5 Januari 2014. Oomlout. 2014. ARDX. http://www.oomlout.com/a/products/ardx/. 25 Maret 2014.
http://digilib.mercubuana.ac.id/
/**SUMMARY** * Program lift menunggu sampai tombol ditekan. Bila tombol ditekan, sangkar lift akan bergerak menuju lantai tujuan/panggilan * * Sangkar lift akan berhenti disemua lantai yang telah dipanggil pada arah yang sama, sebelum mengubah arah * * Jika lebih dari satu tombol ditekan ke arah yang sama, sangkar lift akan berhenti terlebih dahulu di lantai yang tertinggi atau terendah * * Untuk CONTOH, jika tombol panggil paling atas ditekan, dan kemudian tombol turun dari lantai satu dipanggil, lift akan melewati lantai satu terlebih dahulu dan melanjutkan ke lantai atas. * dan kemudian berhenti di lantai satu dalam perjalanan turun. * */ const int tombolPanggilLift[] = { 10,11,12,13}; const int tombolTujuanlLift[] = {
http://digilib.mercubuana.ac.id/
6,7,8};
//Set to true when the associated interior or exterior buttons are selected const int JML_TOMBOLPANGGIL = 3; const int JML_TOMBOLTUJUAN = 4; boolean tombolpanggilditekan[] = { false,false,false}; boolean tomboltujuanditekan[] = { false,false,false,false};
const int JML_LED = 6; const int Pin_LED[] = { A0, A1, A2, A3, A4, A5};
const int MotorNaik = 5; const int MotorTurun = 4;
const int LevelSwitch = 3;
int posisiSangkarLift = 0;
const int LANTAI_MAX = 2;
http://digilib.mercubuana.ac.id/
const int LANTAI_MIN = 0; const int JUMLAH_LANTAI = 3;
boolean ArahSangkarLift = true; //Stores the current direction the elevator is travelling. true is up. false is down boolean tahanposisi = true; //True when elevator is stationary
boolean MendeteksiLantai = true; unsigned long waktuSensorAktif; const unsigned long WAKTU_AKTIF_LEVEL_SWITCH = 2000;
const float JARAK_LANTAI = 200; //mm void setup () { Serial.begin (9600); setup_LED (); setup_TombolTujuan (); setup_TombolPanggil (); pinMode(MotorNaik, OUTPUT); pinMode(MotorTurun, OUTPUT); }
void loop () {
http://digilib.mercubuana.ac.id/
/* if (DEBUG) { posisiSangkarLift = Serial.read (); DEBUG = false; }*/ if (!tahanposisi) { if (TelahMencapaiLantai()) { MencapaiLantai(); if (LiftBerhenti (posisiSangkarLift, ArahSangkarLift)) { Serial.print("Berhenti Dilantai : " ); Serial.println (posisiSangkarLift); HentikanLift (); delay (2000); TandaiLantaiDilewati(posisiSangkarLift); Serial.println ("*******************"); } eksekusiProgram(); } } if (TombolDitekan()) eksekusiProgram (); StatusLed (); }
http://digilib.mercubuana.ac.id/
/** * Gets the elevator to start moving towards the next floor it should visit */ void eksekusiProgram(){ if (bergerakSearah(ArahSangkarLift)) SangkarLiftBergerak (); else if (bergerakSearah (!ArahSangkarLift)) { MerubahArahSangkar(); SangkarLiftBergerak(); } }
/** * Returns true if there is still a floor to visit in direction specified */ boolean bergerakSearah(boolean ArahSangkarLift) { for (int i = posisiSangkarLift; ArahSangkarLift ? i < 3 : i >= 0; i = ArahSangkarLift ? i + 1 : i 1) //Muhahahahahahahahaha { if (LiftBerhenti(i,ArahSangkarLift)) return true;
http://digilib.mercubuana.ac.id/
} return false; }
void setup_TombolPanggil () { for (int i = 0; i < JML_TOMBOLTUJUAN; i++) pinMode (tombolPanggilLift[i], INPUT); }
void setup_TombolTujuan () { for (int i = 0 ; i < JML_TOMBOLPANGGIL; i++) pinMode (tombolTujuanlLift[i], INPUT); }
void setup_LED () { for (int i = 0 ; i < JML_LED; i++) pinMode (Pin_LED[i], OUTPUT); }
//Returns true if a button press is detected boolean TombolDitekan () {
http://digilib.mercubuana.ac.id/
return (PeriksaPanggilan () || PeriksaStatusTujuan ());
}
boolean PeriksaPanggilan () { int count = 0; for (int i = 0 ; i < 4; i++) { if (count != menujuLantaiPanggilan(i)) count++; if (digitalRead (tombolPanggilLift[i]) == HIGH && count != posisiSangkarLift) { tomboltujuanditekan[i] = true; Serial.print ("Ada Panggilan Kelantai"); Serial.println (i); return true; }
} return false; }
boolean TelahMencapaiLantai () {
http://digilib.mercubuana.ac.id/
if (digitalRead (LevelSwitch) && !MendeteksiLantai && (millis() - waktuSensorAktif > WAKTU_AKTIF_LEVEL_SWITCH)) { Serial.println("Sampai Dilantai"); //delay(100); return true; } return false; }
/** * Digital reads all of the buttons and updates the interiorSelected flags if a button is pressed */ boolean PeriksaStatusTujuan () { for (int i = 0 ; i < 3; i++) { if (i != posisiSangkarLift) { if (digitalRead(tombolTujuanlLift[i]) && !tombolpanggilditekan[i]) { tombolpanggilditekan[i] = true; Serial.print ("Lantai Tujuan"); Serial.println (i); return true; } }
http://digilib.mercubuana.ac.id/
} return false; }
/** * Returns true if an interior button selection for the floor at index specified was made or an * exterior button that is in the same direction as the current floors direction has been selected. */ boolean LiftBerhenti (int floorIndex, boolean ArahSangkarLift) { switch (floorIndex) { case 0: return LiftBerhentiGround(ArahSangkarLift); case 1: return LiftBerhentiSatu(ArahSangkarLift); default: return LiftBerhentiDua (ArahSangkarLift); } }
boolean LiftBerhentiGround (boolean ArahSangkarLift) { return (!ArahSangkarLift && tomboltujuanditekan[0]) ||tombolpanggilditekan[0]; }
http://digilib.mercubuana.ac.id/
boolean LiftBerhentiSatu (boolean ArahSangkarLift) { return (ArahSangkarLift && tomboltujuanditekan[2]) || (!ArahSangkarLift && tomboltujuanditekan[1]) || ( (tomboltujuanditekan[1] || tomboltujuanditekan[2]) && (ArahSangkarLift ? !LiftBerhentiDua(ArahSangkarLift) : !LiftBerhentiGround(ArahSangkarLift)) ) || tombolpanggilditekan[1]; }
boolean LiftBerhentiDua (boolean ArahSangkarLift) { return (ArahSangkarLift && tomboltujuanditekan[3]) || tombolpanggilditekan[2]; }
/** * Increments or decrements floorReached variable depending on direction of the elevator * Ensures that the floor is marked as visited by deactivating its floor visited commands * Returns false if the elevator is at the top or bottomFloor */ boolean MencapaiLantai() {
http://digilib.mercubuana.ac.id/
boolean succesfull = true; MendeteksiLantai = true; if (ArahSangkarLift) { if (posisiSangkarLift < LANTAI_MAX) posisiSangkarLift++; else { Serial.println("Reached top floor!"); succesfull = false; } } else { if (posisiSangkarLift > LANTAI_MIN) posisiSangkarLift--; else { Serial.println("Reached bottom floor"); succesfull = false; } } return succesfull; }
void TandaiLantaiDilewati (int floorIndex) {
http://digilib.mercubuana.ac.id/
tombolpanggilditekan[floorIndex] = false; switch (floorIndex) { case 0: tomboltujuanditekan[0] = false; break; case 1: if (ArahSangkarLift) tomboltujuanditekan[2] = false; else tomboltujuanditekan[1] = false; if (!LiftBerhentiDua(ArahSangkarLift) && !LiftBerhentiGround(ArahSangkarLift)) { tomboltujuanditekan[2] = false; tomboltujuanditekan[1] = false; } break; case 2: tomboltujuanditekan[3] = false; break; } }
http://digilib.mercubuana.ac.id/
void MerubahArahSangkar () { Serial.print("Sangkar Lift Berubah Arah: " ); Serial.println (!ArahSangkarLift); ArahSangkarLift = !ArahSangkarLift; digitalWrite (MotorNaik, !ArahSangkarLift); digitalWrite (MotorTurun, ArahSangkarLift); }
void HentikanLift () { Serial.print("Mencapai Lantai: " ) ; Serial.println (posisiSangkarLift); Serial.print ("Jarak Antar Lantai: "); //Serial.println ((float)JARAK_LANTAI/ (float)(waktuSensorAktif - millis())); digitalWrite (MotorNaik,LOW); digitalWrite (MotorTurun, LOW); tahanposisi = true; }
void SangkarLiftBergerak () { Serial.print("Berjalan dari Lantai: "); Serial.println (posisiSangkarLift); digitalWrite (MotorNaik, ArahSangkarLift);
http://digilib.mercubuana.ac.id/
digitalWrite (MotorTurun, !ArahSangkarLift); tahanposisi = false; MendeteksiLantai = false; waktuSensorAktif = millis(); }
void StatusLed () { for (int i = 0; i < JUMLAH_LANTAI; i++) { if (LiftBerhenti(i, ArahSangkarLift)) digitalWrite (Pin_LED[i + JUMLAH_LANTAI], HIGH); else digitalWrite (Pin_LED [i + JUMLAH_LANTAI],LOW); if (i == posisiSangkarLift) digitalWrite (Pin_LED[i], HIGH); else digitalWrite (Pin_LED[i], LOW);
} }
void printStatusTombolPanggil () { for (int i = 0 ; i < JML_TOMBOLTUJUAN; i++) {
http://digilib.mercubuana.ac.id/
Serial.print ("Tombol Panggil : "); Serial.print (i); Serial.println (tomboltujuanditekan[i] ? " TRUE " : " FALSE "); } }
void printStatusTombolTujuan () { for (int i = 0 ; i < JML_TOMBOLPANGGIL; i++) { Serial.print ("TombolTujuan : "); Serial.print (i); Serial.println (tombolpanggilditekan[i] ? " TRUE " : " FALSE "); } }
int menujuLantaiPanggilan (int DaftarTombol) { switch (DaftarTombol) { case 0: return 0; case 3: return 2; default: return 1;
http://digilib.mercubuana.ac.id/
} }
http://digilib.mercubuana.ac.id/