Image by Marco Bianchetti
Finite state machine (FSM) adalah sebuah model yang dapat digunakan memodelkan sebuah simulasi logika atau proses komputer. Finite state machine adalah salah satu model yang sangat sering dipakai dan sangat krusial. Seperti namanya, model yang digunakan dalam FSM adalah sebuah state atau keadaan terbatas yang dikenali oleh sistem. FSM hanya dapat berada dalam satu state dalam satu waktu dan dapat bertransisi dari satu state ke state yang lainnya berdasarkan input.
Salah satu contoh penggunaan FSM adalah dalam mendesain sebuah sistem untuk lampu lalu lintas / lampu merah. Dalam mendesain lampu lalu lintas menggunakan FSM, kita dapat memodelkan berdasarkan aturan dan durasi yang sudah ditentukan.
STATE | N-S | E-W |
---|---|---|
0 | RED | RED |
1 | YELLOW | RED |
2 | GREEN | RED |
3 | YELLOW | RED |
4 | RED | RED |
5 | RED | YELLOW |
6 | RED | GREEN |
7 | RED | YELLOW |
Ada dua arah jalan yang akan dipasang lampu lalu lintas, North - South dan East - west atau sederhananya ini adalah salah satu contoh desain FSM untuk perempatan jalan. Ada 8 state yang akan digunakan, sebagai contoh di State 2, ketika N-S dalam keadaan GREEN maka E-W akan dalam keadaan RED.
Sebagai trigger transisi, saya akan menggunakan fixed time atau delay yang sudah ditentukan. Input bisa dalam bentuk lain seperti sensor atau emergency button. Dengan menggunakan fixed time, kita bisa menentukan delay pada satu state sebelum masuk ke state selanjutnya. Dalam contoh ini, saya menggunakan delay 5 detik untuk lampu hijau, 2 detik untuk lampu kuning, dan 1 detik ketika dua jalur dalam keadaan lampu merah.
Contoh code
/* Finite State machine for traffic light
*
* Designing a two way traffic light, Nort to South (NS) and East to West (EW)
* I will use 8 State which is:
* State 0: NS = RED; EW = RED
* State 1: NS = YELOW; EW = RED
* State 2: NS = GREEN; EW = RED
* State 3: NS = YELLOW; EW = RED
* State 4: NS = RED; EW = RED
* State 5: NS = RED; EW = YELLOW
* State 6: NS = RED; EW = GREEN
* State 7: NS = RED; EW = YELLOW
*
* */
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NS_RED "North to south = RED"
#define NS_YELLOW "North to south = YELLOW"
#define NS_GREEN "North to south = GREEN"
#define EW_RED "Eaast to west = RED"
#define EW_YELLOW "East to west = YELLOW"
#define EW_GREEN "East to west = GREEN"
#define S0 0
#define S1 1
#define S2 2
#define S3 3
#define S4 4
#define S5 5
#define S6 6
#define S7 7
void delay(int number_of_seconds) {
unsigned int start_time = time(0) + number_of_seconds;
while (time(0) < start_time)
;
}
void printState(uint8_t state) {
switch (state) {
case S0:
puts("State 0");
puts(NS_RED);
puts(EW_RED);
break;
case S1:
puts("State 1");
puts(NS_YELLOW);
puts(EW_RED);
break;
case S2:
puts("State 2");
puts(NS_GREEN);
puts(EW_RED);
break;
case S3:
puts("State 3");
puts(NS_YELLOW);
puts(EW_RED);
break;
case S4:
puts("State 4");
puts(NS_RED);
puts(EW_RED);
break;
case S5:
puts("State 5");
puts(NS_RED);
puts(EW_YELLOW);
break;
case S6:
puts("State 6");
puts(NS_RED);
puts(EW_GREEN);
break;
case S7:
puts("State 7");
puts(NS_RED);
puts(EW_YELLOW);
break;
}
puts("\n");
}
int main(void) {
uint8_t state = S0;
while (1) {
printState(state);
switch (state) {
case S0:
delay(1);
state = S1;
break;
case S1:
delay(2);
state = S2;
break;
case S2:
delay(5);
state = S3;
break;
case S3:
delay(2);
state = S4;
break;
case S4:
delay(1);
state = S5;
break;
case S5:
delay(2);
state = S6;
break;
case S6:
delay(5);
state = S7;
break;
case S7:
delay(2);
state = S1;
break;
}
}
return EXIT_SUCCESS;
}