Lampu Geser 2 Arah Asinkron Dengan Mikroprosesor
Lampu Geser 2 Arah Asinkron Dengan Mikroprosesor
Spesifikasi
- Input 2 buah tombol SPST
- Nama input: tombol kiri, tombol kanan
- Output 4 buah lampu LED
- Lampu dipasang berjejer, dari kiri ke kanan. Nama lamput: OUT1,OUT2,OUT3,OUT4
Perilaku yang diharapkan
- pada satu saat hanya 1 lampu yang menyala
- kondisi awal lampu paling kiri menyala
- jika tombol kanan ditekan, lampu yang menyala bergeser ke kanan
- jika tombol kiri ditekan, lampu yang menyala bergeser ke kiri
- jika lampu yang menyala sudah sampai di paling kanan, penekanan ke kanan akan membuat lampu paling kiri menyala
- jika lampu yang menyala sudah sampai di paling kiri , penekanan ke kiri akan membuat lampu paling kanan menyala
Perancangan
Pada artikel ini, solusi yang dibuat memiliki sifat berikut
- even triggered, input penekanan tombol menyebabkan terjadinya interupsi yang akan memanggil Finite State Machine (FSM)
- FSM bersifat asinkron. Transisi/ reaksi FSM ditrigger oleh penekanan tombol
Perilaku sistem yang diharapkan dapat dimodelkan dengan menggunakan Timing Diagram (diagram waktu).. Untuk sederhananya dimulai dulu dengan kasus lampu hanya digeser ke 1 arah saja.
Model Flowchart (Diagram Alir)
Model State Chart
Video demo
Hasil
- Lampu sudah dapat bergeser kiri kanan sesuai penekanan tombol
- Masih terjadi bouncing, yaitu penekanan tombol satu kali menghasilkan pergeseran lampu lebih dari satu. Solusinya mesti ditambahkan fitur debouncing.
Lampiran
Implementasi perangkat lunak
/*
lampu geser dengan input event-triggerred dari interupsi eksternal
FSM dengan model asinkron
*/
#define OUT1 12
#define OUT2 11
#define OUT3 10
#define OUT4 9
#define STATE1 101
#define STATE2 102
#define STATE3 103
#define STATE4 104
#define EVENT_A 201
#define EVENT_B 202
int state = STATE1;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
pinMode(OUT3, OUTPUT);
pinMode(OUT4, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), Pin2_isr, FALLING );
attachInterrupt(digitalPinToInterrupt(3), Pin3_isr, FALLING );
// initial state
state = STATE1;
digitalWrite(OUT1, HIGH);
}
void Pin2_isr() {
fsm(EVENT_B);
}
void Pin3_isr() {
fsm(EVENT_A);
}
int fsm(int event) {
switch (state) {
case STATE1: {
if (event == EVENT_A) {
state = STATE2;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, HIGH);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, LOW);
} else if (event == EVENT_B)
{
state = STATE4;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, LOW);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, HIGH);
}
break;
}
case STATE2: {
if (event == EVENT_A) {
state = STATE3;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, LOW );
digitalWrite(OUT3, HIGH);
digitalWrite(OUT4, LOW);
} else if (event == EVENT_B)
{
state = STATE1;
digitalWrite(OUT1, HIGH);
digitalWrite(OUT2, LOW);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, LOW);
}
break;
}
case STATE3: {
if (event == EVENT_A) {
state = STATE4;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, LOW );
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, HIGH);
} else if (event == EVENT_B)
{
state = STATE2;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, HIGH);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, LOW);
}
break;
}
case STATE4: {
if (event == EVENT_A) {
state = STATE1;
digitalWrite(OUT1, HIGH);
digitalWrite(OUT2, LOW);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, LOW);
} else if (event == EVENT_B)
{
state = STATE3;
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, LOW);
digitalWrite(OUT3, HIGH);
digitalWrite(OUT4, LOW);
}
break;
}
default: {
break;
}
}
}
void loop() {
}
Contoh-contoh lain pemodelan dengan FSM dapat dilihat di artikel “Contoh Implementasi FSM dengan mikrokontroler“
One thought on “Lampu Geser 2 Arah Asinkron Dengan Mikroprosesor”