Kontrol Sequential Arduino
Kontrol Sequential Arduino
Disusun Oleh :
Muh D’x Audy Ray (23050430026)
// Variabel timer
int nilai_timer1 = 0;
int nilai_timer2 = 0;
int nilai_timer3 = 0;
int nilai_timer4 = 0;
// Variabel halaman dan kontrol loop
int halaman = 0;
int stop = 1;
// Objek LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
nilai_timer1 = EEPROM.read(0);
nilai_timer2 = EEPROM.read(10);
nilai_timer3 = EEPROM.read(20);
nilai_timer4 = EEPROM.read(30);
pinMode(tombol_up, INPUT);
pinMode(tombol_down, INPUT);
pinMode(tombol_set, INPUT);
pinMode(tombol_back, INPUT);
pinMode(tombol_stop, INPUT);
pinMode(10, OUTPUT); // T1
pinMode(9, OUTPUT); // T2
pinMode(8, OUTPUT); // T3
pinMode(7, OUTPUT); // T4
}
void loop() {
switch (halaman) {
case 0:
lcd.setCursor(0, 0);
lcd.print("T1 T2 T3 T4");
lcd.setCursor(0, 1);
lcd.print(nilai_timer1);
lcd.setCursor(4, 1);
lcd.print(nilai_timer2);
lcd.setCursor(8, 1);
lcd.print(nilai_timer3);
lcd.setCursor(12, 1);
lcd.print(nilai_timer4);
if (digitalRead(tombol_down) == HIGH) {
lcd.clear();
halaman = 1;
}
if (digitalRead(tombol_up) == HIGH) {
lcd.clear();
halaman = 4;
}
if (digitalRead(tombol_set) == HIGH) {
lcd.clear();
halaman = 5;
}
break;
if (digitalRead(tombol_up) == HIGH) {
lcd.clear();
halaman = 0;
}
if (digitalRead(tombol_down) == HIGH) {
lcd.clear();
halaman = 2;
}
lcd.setCursor(0, 0);
lcd.print("Timer 1 ");
lcd.setCursor(0, 1);
lcd.print(nilai_timer1);
lcd.setCursor(14, 1);
lcd.print("mS");
if (digitalRead(tombol_back) == HIGH) {
break;
}
}
EEPROM.write(0, nilai_timer1);
lcd.clear();
}
break;
// Halaman Timer 2
case 2:
lcd.setCursor(0, 0);
lcd.print("Timer 2");
lcd.setCursor(0, 1);
lcd.print(nilai_timer2);
lcd.setCursor(14, 1);
lcd.print("mS");
if (digitalRead(tombol_up) == HIGH) {
lcd.clear();
halaman = 1;
}
if (digitalRead(tombol_down) == HIGH) {
lcd.clear();
halaman = 3;
}
if (digitalRead(tombol_down) == HIGH) {
nilai_timer2--;
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Timer 2 ");
lcd.setCursor(0, 1);
lcd.print(nilai_timer2);
lcd.setCursor(14, 1);
lcd.print("mS");
if (digitalRead(tombol_back) == HIGH) {
break;
}
}
EEPROM.write(10, nilai_timer2);
lcd.clear();
}
break;
// Halaman Timer 3
case 3:
lcd.setCursor(0, 0);
lcd.print("Timer 3");
lcd.setCursor(0, 1);
lcd.print(nilai_timer3);
lcd.setCursor(14, 1);
lcd.print("mS");
if (digitalRead(tombol_up) == HIGH) {
lcd.clear();
halaman = 2;
}
if (digitalRead(tombol_down) == HIGH) {
lcd.clear();
halaman = 0;
}
else if (digitalRead(tombol_set) == HIGH) {
while (stop == 1) {
if (digitalRead(tombol_up) == HIGH) {
nilai_timer3++;
delay(200);
}
if (digitalRead(tombol_down) == HIGH) {
nilai_timer3--;
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Timer 3 ");
lcd.setCursor(0, 1);
lcd.print(nilai_timer3);
lcd.setCursor(14, 1);
lcd.print("mS");
if (digitalRead(tombol_back) == HIGH) {
break;
}
}
EEPROM.write(20, nilai_timer3);
lcd.clear();
}
break;
if (digitalRead(tombol_up) == HIGH) {
lcd.clear();
halaman = 3;
break;
}
if (digitalRead(tombol_down) == HIGH) {
lcd.clear();
halaman = 0;
break;
}
if (digitalRead(tombol_down) == HIGH) {
nilai_timer4--;
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Timer 4 ");
lcd.setCursor(0, 1);
lcd.print(nilai_timer4);
lcd.setCursor(14, 1);
lcd.print("s ");
if (digitalRead(tombol_back) == HIGH) {
break;
}
}
EEPROM.write(30, nilai_timer4);
lcd.clear();
}
break;
berhenti:
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berhenti");
delay(2000);
halaman = 0;
lcd.clear();
break;
}
}
D. Pembahasan
Kelebihan:
o Mencapai tujuan kendali sekuensial dengan empat timer.
o Memiliki antarmuka pengguna yang fungsional dengan LCD dan tombol.
o Fitur penyimpanan nilai ke EEPROM sangat berguna untuk mempertahankan
pengaturan setelah power cycle.
o Fungsi "stop" darurat memberikan kontrol yang baik kepada pengguna.
Kekurangan dan Potensi Peningkatan:
o Blocking delay(): Penggunaan delay() secara ekstensif (terutama 1000 ms
dalam loop eksekusi dan 200 ms untuk debouncing) membuat mikrokontroler
"diam" selama durasi delay. Ini berarti mikrokontroler tidak dapat merespons
input tombol lain selama delay aktif, kecuali untuk tombol_stop yang diperiksa
di dalam loop for. Untuk aplikasi yang lebih kompleks atau responsif, teknik
non-blocking timer menggunakan fungsi millis() sangat direkomendasikan.
o Penggunaan goto: Meskipun berfungsi dalam konteks ini, penggunaan goto
umumnya dianggap praktik pemrograman yang kurang baik karena dapat
membuat alur program sulit dilacak dan dipelihara. Alternatif seperti flag
boolean dan loop while dengan kondisi multi-bagian akan lebih bersih.
o Debouncing Tombol Sederhana: delay(200) adalah metode debouncing yang
efektif, namun dapat memperlambat responsivitas. Teknik debouncing berbasis
state change (misalnya, membaca tombol beberapa kali dalam interval waktu
singkat untuk mengonfirmasi penekanan) akan lebih optimal.
o Unit Waktu yang Konsisten: Perbedaan label mS dan s untuk timer pada LCD
bisa membingungkan. Sebaiknya gunakan unit waktu yang konsisten
(misalnya, selalu detik) atau sediakan opsi untuk memilih unit.
o Batas Nilai EEPROM: Karena EEPROM.write() menyimpan satu byte (0-
255), nilai timer tidak dapat melebihi 255. Jika diperlukan durasi timer yang
lebih lama, perlu digunakan dua byte atau lebih untuk setiap nilai timer.
E. Kesimpulan
Berdasarkan praktikum yang telah dilaksanakan, dapat disimpulkan bahwa tujuan untuk
merancang dan membuat sistem kendali sekuensial menggunakan Arduino telah berhasil
dicapai. Sistem ini mampu mengendalikan empat output secara berurutan dengan durasi
yang dapat diatur oleh pengguna melalui antarmuka LCD dan tombol. Fitur penyimpanan
nilai ke EEPROM berhasil diimplementasikan, memastikan bahwa pengaturan timer tetap
tersimpan meskipun catu daya dimatikan. Fungsi stop darurat juga memberikan kontrol
yang efektif selama proses eksekusi. Meskipun implementasi dasar ini fungsional,
penggunaan teknik non-blocking timer di masa depan akan meningkatkan responsivitas
sistem secara signifikan, memungkinkan pemrosesan tugas lain secara bersamaan. Sistem
kendali sekuensial seperti ini memiliki aplikasi luas dalam otomatisasi industri, kontrol
proses, dan proyek-proyek elektronik yang membutuhkan urutan waktu yang presisi.