DAFTAR PUSTAKA
Andrianto, Heri. 2008. Pemrograman Mikrokontroler AVR ATMega16 Menggunakan Bahasa C (Codevision AVR).Bandung : Informatika.
Ardiwinoto. 2008. Mikrokontroler AVR ATMega 8/32/8535 & Pemrogramannya Dengan Bahasa C WINAVR. Bandung :Informatika.
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.
/**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};
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_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 () {
/* 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 (); }
/**
* 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;
}
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 () {
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 () {
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; }
}
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]; }
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 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; }
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; } }
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 (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 () {
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;
} }