Resistor adalah komponen pasif dua terminal yang memiliki sifat melawan arus. Transistor adalah komponen aktif dari bahan semikonduktor yang berfungsi sebagai penguat atau sakelar.
Resistor
Resistor di bidang elektronika adalah komponen pasif yang memiliki tahanan listrik di dalamnya. Resistor tersusun dari material konduktor listrik. Resistor memiliki dua terminal. Hubungan antara arus dan tegangan pada resistor mengikuti hukum ohm sebagai berikut:
V = I x R
Dengan: V: tegangan listrik dengan satuan volt (V) I: arus listrik dengan satuan ampere (A) R: resistansi pada resistor dengan satuan ohm (Ω)
Berikut ini contoh komponen resistor dalam berbagai bentuk dan ukuran.
Macam-macam resistor
Transistor
Berikut ini contoh foto transistor:
Parameter
Resistor
Transistor
Peranan
menghambat arus listrik
penguat atau sakelar
Jumlah kutub
2
umumnya 3
Persamaan matematis
V = I x R
Bahan / material
karbon, thick film, thin film, metal film, metal oxide film, wire wound, metal foil
semikonduktor seperti silikon , germanium dan sebagainya
Resistor adalah komponen elektronika yang sifatnya menghambat arus listrik, Kapasitor adalah komponen elektronika yang sifatnya menyimpan energi dalam bentuk medan listrik. Induktor adalah komponen elektronika yang sifatnya menyimpan energi dalam bentuk medan magnetik pada arus yang mengalir.
Kapasitor dikenal juga sebagai kondensator.
Berikut ini penjelasan lebih panjang dari hal tersebut.
Resistor
Resistor di bidang elektronika adalah komponen pasif yang memiliki tahanan listrik di dalamnya. Resistor tersusun dari material konduktor listrik. Resistor memiliki dua terminal. Hubungan antara arus dan tegangan pada resistor mengikuti hukum ohm sebagai berikut:
V = I x R
Dengan: V: tegangan listrik dengan satuan volt (V) I: arus listrik dengan satuan ampere (A) R: resistansi pada resistor dengan satuan ohm (Ω)
Berikut ini contoh komponen resistor dalam berbagai bentuk dan ukuran.
Macam-macam resistor
Kapasitor
Kapasitor/kondensator di bidang elektronika dalah komponen pasif yang menyimpan energi listrik dalam bentuk medan listrik. Kapasitor tersusun dari 2 keping penghantar listrik yang dipisahkan oleh bahan isolator listrik.
Hubungan antara muatan listrik dan tegangan pada kapasitor adalah sebagai berikut:
C = Q / V Dengan: C: nilai kapasitansi kapasitor dengan satuan farad (F) Q: muatan listrik dengan satuan coulomb (C) V: tegangan listrik dengan satuan volt (V)
Berikut ini kapasitor dalam berbagai bentuk:
Induktor
Induktor adalah komponen elektronika pasif yang dapat menyimpan energi pada medan magnet yang ditimbulkan oleh arus listrik yang melintasinya.
Berikut ini beberapa contoh komponen induktor.
Beberapa macam induktor
Parameter
Resistor
Kapasitor
Induktor
Peranan
menghambat arus listrik
menyimpan energi dalam medan listrik
menyimpan energi dalam medan magnet
Jumlah kutub
2
2
2
Persamaan matematis
V = I x R
C = Q / V
Bahan / material
karbon, thick film, thin film, metal film, metal oxide film, wire wound, metal foil
Artikel ini adalah pengembangan dari artikel “Lampu Kedip Dengan Model Finite State Machine“. Pada artikel tersebut pewaktuan 1 detik menggunakan fungsi delay() dari Arduino. Pada artikel ini digunakan vTaskDelay pada sistem operasi real time FreeROTS untuk mendapatkan perioda 1 detik untuk eksekusi Finite State Machine (FSM).
Spesifikasi
Sistem yang dibuat adalah lampu kedip, dengan perioda 2 detik.
Perangkat Keras
Perangkat lunak dengan Arduino Nano ATmega328. Output dengan LED yang diseri dengan resistor pembatas arus. Nilai resistor tidak kritis. Pada percobaan ini dipakai nilai resistor 1000 ohm. LED disambung ke port D3 pada Arduino Nano.
Model Sistem
Model FSM untuk lampu kedip adalah sebagai berikut.
Perangkat Lunak
Pada sistem ini diperlukan pewaktuan (timing) agar lampu berkedip dengan frekuensi 0,5 Hz. Untuk itu diperlukan FSM yang dihitung/dipanggil setiap 1 detik. Untuk membuat pemanggilan periodik seperti ini dapat dilakukan dengan beberapa cara sebagai berikut:
delay pada Arduino atau library lain
interupsi timer
delay pada Real Time Operating System misal FreeRTOS
Pada implementasi ini yang dibuat adalah menggunakan FreeRTOS. Delay menggunakan fungsi vTaskDelay() pada FreeRTOS. Penjelasan tentang FreeRTOS di Arduino dapat dibaca di artikel https://www.arduino.cc/reference/en/libraries/freertos/
Model diagram alir (flowchart) perangkat lunak adalah sebagai berikut.
Diagram alir perangkat lunak berbasis FreeRTOS
Aplikasi memiliki 2 super loop. Super loop pertama ada di main program, tidak berisi apa-apa. Super loop kedua ada di Task FSM.
#include "Arduino_FreeRTOS.h"
#define ON 100
#define OFF 101
#define LED_OUTPUT 3
int state = OFF;
TaskHandle_t xHandle1 = NULL;
Inisialisasi Sistem
void setup() {
int output = 0;
pinMode(LED_BUILTIN, OUTPUT);
pinMode(LED_OUTPUT, OUTPUT);
Serial.begin(115200);
Serial.print("portTICK_PERIOD_MS: ");
Serial.print(portTICK_PERIOD_MS);
Serial.println();
fsm_init(&state);
fsm_output(output);
xTaskCreate(
TaskFSM
, "TaskFSM" // A name just for humans
, 100 // stacksize
, NULL
, 2 // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
, &xHandle1 );
}
static void TaskFSM(void *pvParameters)
{
TickType_t xLastWakeTime;
/* The xLastWakeTime variable needs to be initialised with the current tick
count. Note that this is the only time we access this variable. From this
point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
API function. */
xLastWakeTime = xTaskGetTickCount();
while (1)
{
int output = 0;
fsm(&state, &output);
if (output == 1) {
digitalWrite(LED_OUTPUT, HIGH);
} else {
digitalWrite(LED_OUTPUT, LOW);
}
Serial.print("state: ");
Serial.print(state);
Serial.print(" output: ");
Serial.print( output);
Serial.println();
vTaskDelayUntil( &xLastWakeTime, ( 1000 / portTICK_PERIOD_MS ) ); // perioda 1 detik
}
}
Pengujian
Pengujian dilakukan dengan menjalankan program, kemudian mengamati kedipan lampu dan output ke port serial.
Pada output serial akan muncul tampilan seperti berikut ini:
Dari output serial tersebut nampak perubahan state dan output terjadi sesuai rancangan.
Waktu perubahan tidak tepat 1 detik, terlihat bergeser sedikit. Penyebabnya kemungkinan karena implementasi timer tick pada FreeRTOS Arduino menggunakan Watchdog Timer, bukan Timer 0, Timer 1 ataupun Timer 2. Watchdog Timer pada Arduino menggunakan osilator RC yang tidak setepat osilator kristal.
Artikel ini adalah pengembangan dari artikel “Lampu Kedip Dengan Model Finite State Machine“. Pada artikel tersebut pewaktuan 1 detik menggunakan fungsi delay() dari Arduino. Pada artikel ini digunakan Timer 1 untuk mendapatkan perioda 1 detik untuk eksekusi Finite State Machine (FSM).
Spesifikasi
Sistem yang dibuat adalah lampu kedip, dengan perioda 2 detik.
Perangkat Keras
Perangkat lunak dengan Arduino Nano ATmega328. Output dengan LED yang diseri dengan resistor pembatas arus. Nilai resistor tidak kritis. Pada percobaan ini dipakai nilai resistor 1000 ohm. LED disambung ke port D3 pada Arduino Nano.
Model Sistem
Model FSM untuk lampu kedip adalah sebagai berikut.
Perangkat Lunak
Pada sistem ini diperlukan pewaktuan (timing) agar lampu berkedip dengan frekuensi 0,5 Hz. Untuk itu diperlukan FSM yang dihitung/dipanggil setiap 1 detik. Untuk membuat pemanggilan periodik seperti ini dapat dilakukan dengan beberapa cara sebagai berikut:
delay pada Arduino atau library lain
interupsi timer
delay pada Real Time Operating System misal FreeRTOS
Pada implementasi ini yang dibuat adalah menggunakan interupsi Timer 1 pada Arduino.
Model diagram alir (flowchart) perangkat lunak adalah sebagai berikut.
Inisialisasi di fungsi setup() hanya dipanggil sekali.
loop() dapat dikosongkan , karena tidak melakukan apa-apa di situ.
Interupsi Timer 1 dipanggil setiap detik oleh periferal Timer 1 pada Arduino.
Fungsi ini dipanggil setiap kali terjadi interupsi timer 1. Setiap kali ada interupsi, dilakukan hal berikut:
menghitung transisi state
mengirim output ke port digital I/O pada Arduino
mengirim status ke port serial. status ini dipakai untuk debugging / monitoring. Jika dipakai pada sistem sesungguhnya (production), bagian monitoring ini tidak wajib ada.
Pada serial monitor Arduino kita dapat mengaktifkan timestamp, sehingga kita dapat mengecek apakah pewaktuan pada sistem ini sudah sesuai dengan yang spesifikasi.
Pada artikel ini diuraikan pembuatan lampu kedip berbasis mikrokontroler Arduino Nano ATmega328 dengan model Finite State Machine (FSM). Lampu kedip sebenarnya dapat juga dibuat dengan menggunakan model flowchart biasa. Tujuan tulisan ini untuk menunjukkan teknik implementasi FSM yang sederhana. Untuk sistem yang sangat sederhana seperti lampu kedip biasa, penggunaan FSM mungkin berlebihan (overkill). Pada sistem yang kompleks, penggunaan FSM akan sangat memudahkan. Implementasi FSM dalam bentuk perangkat lunak agak rumit, memerlukan latihan. Untuk itu pada artikel ini ditunjukkan tahap implementasi FSM yang sederhana dulu. Setelah dapat memahami artikel ini, dapat dilanjutkan dengan membuat FSM yang lebih kompleks.
Spesifikasi
Sistem yang dibuat adalah lampu kedip, dengan perioda 2 detik.
Perangkat Keras
Perangkat lunak dengan Arduino Nano ATmega328. Output dengan LED yang diseri dengan resistor pembatas arus. Nilai resistor tidak kritis. Pada percobaan ini dipakai nilai resistor 1000 ohm. LED disambung ke port D3 pada Arduino Nano.
Model Sistem
Model FSM untuk lampu kedip adalah sebagai berikut.
Pada sistem ini tidak ada input.
FSM dievaluasi setiap detik.
Notasi FSM pada gambar ini diadopsi dari buku Lee & Seshia “Introduction to Embedded Systems”.
Kondisi awal sistem adalah state OFF, dengan lampu mati. Pada state OFF, state berikutnya adalah ON, tanpa syarat. Maka pada panah dari OFF ke ON diberi syarat ‘true’, artinya transisi ini selalu terjadi tanpa syarat apapun. Transisi ini menyebabkan state berganti menjadi ON, dan lampu output menyala. Output aktif ditandai dengan ‘out=1’.
Pada state ON, state selanjutnya adalah OFF tanpa syarat. Maka syarat transisi dari ON ke OFF adalah ‘true’. Setiap kali transisi ini, output sistem adalah 1, maka ditulis sebagai ‘out=0’.
Perangkat Lunak
Pada sistem ini diperlukan pewaktuan (timing) agar lampu berkedip dengan frekuensi 0,5 Hz. Untuk itu diperlukan FSM yang dihitung/dipanggil setiap 1 detik. Untuk membuat pemanggilan periodik seperti ini dapat dilakukan dengan beberapa cara sebagai berikut:
delay pada Arduino atau library lain
interupsi timer
delay pada Real Time Operating System misal FreeRTOS
Pada implementasi ini yang dibuat adalah menggunakan delay dengan Arduino
Model diagram alir (flowchart) software adalah sebagai berikut.
Finite State Machine diimplementasikan di fungsi fsm(). Pada fungsi ini ada 2 state yang ditangani yaitu ON dan OFF. Pemilihan state dilakuan dengan perintah switch() di bahasa C. Pada setiap case diimplementasikan setiap transisi yang ada pada model FSM di atas.
Fungsi ini tidak menggunakan global variabel maupun static variabel, supaya didapat kode yang lebih aman.
Output dari fungsi diberikan dengan passing pointer pada fungsi. Ada 2 parameter yaitu state (state dari FSM) dan out (output). Kedua parameter diberikan menggunakan pointer.
void fsm(int *state, int *out) {
switch (*state) {
case ON: {
*state = OFF;
*out = 0;
break;
}
case OFF: {
*state = ON;
*out = 1;
break;
}
}
}
Implementasi FSM ini menggunakan kode C standar yang dapat dijalankan di semua mikrokontroler. Akses ke port output dipisahkan ke fungsi fsm_output(). Tujuannya agar fungsi ini dapat dengan mudah diporting ke mikrokontroler lain.
Proses yang dilakukan di main loop adalah sebagai berikut:
Perhitungan nilai state di FSM
Output ke pin output digital dengan fungsi fsm_output()
mencetak status FSM ke port serial. Data yang dicetak meliputi state dan output. Jika FSM memiliki input ataupun variabel pada extended state machine, maka nilai-nilai ini juga perlu dicetak.
Melakukan delay selama 1 detik. Pada implementasi delay ini ditambahkan fitur lampu kedip, sehingga LED_BUILTIN akan berkedip dengan frekuensi sekitar 1 Hz. Lampu kedip 1 Hz ini fungsinya untuk menunjukkan waktu terjadinya perubahan state. Frekuensinya tidak akan tepat sekali di 1 Hz, namun untuk sistem ini sudah dapat dianggap cukup baik.
Output FSM
Fungsi fsm_output() adalah menerjemahkan output dari FSM ke pin output pada mikrokontroler.
Dari output serial tersebut dapat diamati perubahan state dan output serta waktu kejadiannya. Dari output di atas dapat disimpulkan bahwa lampu berkedip dengan perioda sekitar 2 detik. Perubahan state juga sesuai dengan model FSM.
Menurut foto di artikelnya, mereka mengembangkan board khusus kerjasama antara Texas Instruments dengan Stanford: (Picture of the DSP shield calculating heart rate in bpm) dari [dokumen]
Berikut ini foto DSP Shield yang dikembangkan Stanford: [sumber]
Pada artikel ini diuraikan pembuatan sistem mikrokontroler dengan lampu yang berkedip dengan duty cycle 10%.
Pada mikrokontroler , lampu kedip dapat dibuat dengan delay ataupun dengan finite state machine (FSM). Pada artikel ini dipakai FSM dengan tujuan mendemonstratikan kemampuan FSM sebagai model untuk membuat perangkat lunak mikrokontroler.
Duty cycle yang diinginkan adalah 10%. Untuk itu maka lampu akan menyala selama 1 satuan waktu, dan lampu mati selama 9 satuan waktu. Lampu menyala selama 1 state , sedangkan lampu mati selama 9 state. Untuk itu dibuat 10 state: 1 state lampu menyala, dan 10 state lampu mati.
Pada artikel ini diuraikan membuat sistem mikrokontroler untuk mengendalikan lampu berdasarkan sebuah sakelar. Lampu dinyalakan dengan menekan tombol satu kali. Lampu dimatikan dengan cara menekan tombol agak lama.
Kebutuhan Sistem
Input switch push-button
Output 1 buah LED
Tombol ditekan sekali secara singkat untuk menyalakan lampu
Tombol ditekan dan ditahan selamat 1 detik untuk mematikan lampu
Diagram Blok Sistem secara umum sebagai berikut
Skenario sistem
Untuk memperjelas sistem yang akan dibuat, perlu dibuat dulu beberapa skenario yang dapat terjadi pada sistem ini.
LED mati: ditekan 1x pendek (kurang dari 1 detik) maka LED menyala
LED mati: ditekan 1x panjang (lebih dari 1 detik) -> LED menyala
LED menyala: ditekan & ditahan selama 1 detik -> LED mati
LED menyala: ditekan kurang dari 1 detik -> LED tetap menyala
LED menyala: ditekan & ditahan selama lebih dari 1 detik -> LED mati dalam 1 detik, setelah itu tetap mati
LED menyala: switch ditekan berkali-kali pendek -> LED tetap menyala (frekuensi di bawah batas tertentu)
LED mati: switch ditekan berkali-kali pendek -> LED menyala dan tidak mati (frekuensi di bawah batas tertentu)
Hal-hal yang tidak diperhatikan pada sistem ini:
prosedur mematikan/menyalakan sistem
keadaan baterai habis. Untuk sistem yang menggunakan baterai isi ulang (rechargeable), seharusnya ada mekanisme untuk mencegah baterai betul-betul habis.
Berikut ini Diagram Skenario 1 LED mati: ditekan 1x pendek (kurang dari 1 detik) maka LED menyala
Diagram Skenario 2: LED mati: ditekan 1x panjang (lebih dari 1 detik) -> LED menyala
Diagram skenario 3: LED menyala: ditekan & ditahan selama 1 detik -> LED mati
Skenario 4 LED menyala: ditekan kurang dari 1 detik -> LED tetap menyala
LED menyala: ditekan & ditahan selama lebih dari 1 detik -> LED mati dalam 1 detik, setelah itu tetap mati
Skenario Ekstra 6
Skenario Ekstra 7
Strategi/Algoritma:
Kondisi awal mati
Tunggu ada tombol ditekan. Jika ada , nyalakan lampu.
Tunggu tombol ditekan lama. Jika ada, matikan lampu. Abaikan input lain.
Berikut ini adalah implementasi lampu penyeberangan jalan (“traffic light at a pedestrian crosswalk”) dari Example 3.9 di buku “Introduction to Embedded Systems, a cyber physical systems approch” karangan Lee & Seshia.
Model sistem menggunakan Extended State Machine, sebagai berikut:
Perangkat Keras
Implementasi hardware menggunakan Arduino Nano ATmega328
Pin yang dipakai:
output lampu merah : pin D2 (active high)
output lampu hijau: D3 (active high)
output lampu kuning: pin D4 (active high)
input tombol: pin D11 (active low)
output lampu kedip: pin LED_BUILTIN / D13
Pada model tidak diperlukan lampu kedip, namun pada aplikasi ini ditambahkan lampu kedip sebagai indikasi bahwa sistem berfungsi.
Perangkat Lunak
Model FSM perangkat lunak mengikuti Example 3.9 sebagai berikut:
Perangkat lunak dibuat menggunakan library Arduino. Perangkat lunak terbagi menjadi bagian inisialisasi yang hanya dilakukan sekali di fungsi setup() dan bagian yang dilakukan berulang-ulang di fungsi loop().
Implementasi finite state machine (FSM) ada di fungsi fsm_init() dan fsm(). Fungsi fsm_init() berisi inisialisasi variabel FSM. fungsi fsm() berisi perubahan (reaction) yang terjadi pada FSM. Sesuai dengan penjelasan di Example 3.9, fungsi fsm() ini dipanggil secara setiap 1 detik, dengan cara menambahkan delay dengan fungsi delay().
Membuat fungsi periodik dengan delay() sebenarnya tidak tepat sekali pewaktuannya. Jika diperlukan pewaktuan yang lebih tepat, dapat menggunakan interupsi Timer1.
Penjelasan Perangkat Lunak
Pada sistem ini terdapat 4 buah state. Untuk itu, setiap state didefinisikan menggunakan macro. Penggunaan macro ini untuk membantu memahami kode dengan lebih mudah.
Setiap state diasosiasikan dengan suatu angka tertentu. Angka yang dipakai bebas, asal memperhatikan batas tipe data yang dipakai. Pada program ini tipe data yang dipakai adalah int, sehingga nilainya yang dapat dipakai adalah antara -32,768 sampai dengan 32,767
Bagian selanjutnya adalah definisi untuk pin-pin yang dipakai. Ada 4 pin yang dipakai, sehingga diperlukan 4 buah macro sebagai berikut.
Penggunaan macro ini untuk memudahkan pembacaan source code.
Bagian selanjutnya adalah variabel global
int state ;
int sig_r = 0;
int sig_g = 0;
int sig_y = 0;
int count = 0;
Pada program ini diperlukan beberapa variabel global. Variabel global diperlukan karena fungsi fsm_init() dipanggil di setup(), sedangkan fsm() dipanggil di fungsi loop(), padahal ada variabel FSM diperlukan untuk keduanya.
Software embedded yang baik seharusnya meminimalkan penggunaan variabel global, supaya program lebih rapi.
Fungsi setup()
Selanjutnya adalah fungsi setup() untuk inisialisasi Arduino
fungsi pinMode() dipanggil untuk mengatur konfigurasi pin-pin sebagai input dan output. Pada kode ini, yang dipakai adalah macro dari nomor pin, dengan tujuan memudahkan pembacaan software.
Port serial sebenarnya tidak wajib diaktifkan untuk sistem lampu penyeberangan ini. Pada implementasi ini, port serial dipakai untuk melakukan monitoring dan debugging. Variabel state, input dan output dicetak ke port serial secara teratur untuk mengecek apakah implementasi sudah berjalan sebagaimana mestinya.
Bagian selanjutnya dari fungsi setup() adalah melakukan inisialisasi FSM.
Fungsi activate_output(int r, int g, int y) fungsinya adalah menyalakan lampu output sesuai output dari FSM. Pada penjelasan Example 3.9, output adalah berupa sinyal sigR, sigR dan sigY. Sinyal-sinyal ini hanya ada / aktif ketika diperlukan perubahan lampu yang menyala. Untuk itu perlu fungsi ini untuk mengubah 3 buah sinyal ini menjadi penyalaan lampu yang sesuai.
Fungsi fsm_init()
Fungsi fsm_init() berfungsi memasukkan nilai awal (state) di FSM.
Berikut ini adalah bagian yang diimplementasikan di fungsi fsm_init()
Menurut model FSM, yang perlu dilakukan di awal adalah variabel count diubah menjadi 0, dan state awal adalah RED. Namun pada program ini ditambahkan juga kondisi awal lampu merah menyala, dengan cara memberikan sinyal sigR.
Fungsi loop()
Fungsi loop() dipanggil secara rutin oleh Arduino.
Hal-hal yang dilakukan di fungsi ini adalah:
membaca input dari tombol dengan perintah digitalRead()
membalik nilai input, karena tombol di hardware dibuat active low, sedangkan FSM memerlukan tombol pedestrian yang active_high
memanggil fungsi fsm() untuk menghitung state berikut dari FSM berdasarkan state terkini dan input pada saat itu. Hasilnya adalah state akan diubah, variabel count diubah, dan ada keluaran di variabel output.
memanggil activate_output() untuk melakukan perubahan lampu menyala jika diperlukan
mencetak state,input dan output untuk keperluan debugging / monitoring
membuat delay 1 detik
Fungsi print_state()
Fungsi ini tugasnya adalah mencetak semua variabel sistem untuk melakukan debugging
Fungsi fsm()
Fungsi ini adalah implementasi state chart.
Fungsi ini dirancang untuk tidak menggunakan variabel global, karena variabel global kurang baik dipakai . Semua output menggunakan pointer sebagai metode passing parameter. Pada fungsi ini tidak ada variabel global ataupun variabel jenis static.
Jenis FSM yang dipakai adalah extended state machine, jadi pada FSM ini ada variabel state dan variabel ‘count’.
Pada bagian awal, variabel sig_r,sig_g dan sig_y dinolkan, untuk menandakan bahwa defaultnya tidak ada output apapun.
Pada fungsi fsm() , yang dihitung adalah:
state selanjutnya, di variabel *state
variabel count (*count)
Perhitungan state dan variabel *count dibagi berdasarkan state terkini.
Implementasi STATE_RED
Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_RED
Dari state RED akan pindah ke state GREEN dengan syarat varioabel count lebih besar atau sama dengan 60. Jika terjadi perpindahan ini, maka variabel count diubah menjadi 0.
Jika tidak terjadi perpindahan state, maka variabel count ditambah dengan 1.
Implementasi STATE_GREEN
Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_GREEN
Dari state GREEN akan pindah ke state PENDING dengan syarat tombol input pedestrian ditekan, dan variabel count<60. Jika terjadi perpindahan ini, maka variabel count ditambah 1.
Dari state GREEN akan pindah ke state YELLOW dengan syarat tombol input pedestrian ditekan, dan variabel count lebih dari atau sama dengan 60. Jika terjadi perpindahan ini, maka variabel count diubah menjadi 0.
Implementasi STATE_PENDING
Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_PENDING
Dari state PENDING akan pindah ke state YELLOW dengan syarat variabel count lebih atau sama dengan 60. Jika terjadi perpindahan ini, maka terjadi output sigY dan variabel count diset menjadi 0.
Jika tidak terjadi perpindahan tersebut, maka variabel count ditambah 1
Implementasi STATE_YELLOW
Berikut ini adalah bagian dari state chart yang diimplementasikan untuk case STATE_YELLOW
Dari state YELLOW akan pindah ke state RED dengan syarat count>5. Jika terjadi transisi ini , maka akan ada sinyal sigR dan variabel count dibuat menjadi 0
Jika tidak terjadi pindah ke state RED, maka variabel count ditambah 1.
Komentar
Pada model FSM yang diberikan di Example 3.9, ada kelemahan:
pada initial state tidak diberikan output, sehingga lampu yang menyala tidak terdefinisi. Pada program, hal ini diselesaikan dengan menambahkan sinyal sigR untuk menyalakan lampu merah
Sistem ini memiliki kelemahan dalam pembacaan tombol input. Penekanan tombol perlu dilakukan cukup lama agar terbaca oleh FSM. Hal ini terjadi karena fungsi fsm() dipanggil setiap detik. Jadi pada kondisi worst case, tombol input pedestrian perlu ditekan dan ditahan selama 1 detik. Pada best case cukup ditahan mendekati 0 detik. Rata-rata 0,5 detik.
Untuk mengatasi masalah lambatnya pembacaan tombol, dapat diatas dengan memperkecil perioda pemanggilan fungsi fsm(). Supaya perilaku sistem tidak berubah, maka batas-batas untuk variabel count di FSM perlu diubah. Misal perioda diubah dari 1 detik menjadi 1 milidetik. Maka batasan count<60 di FSM pada STATE_GREEN perlu diubah menjadi count<60000, demikian juga untuk batasan lainnya.