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.

Diagram waktu lampu geser kanan 1 arah
Diagram waktu lampu geser kanan 1 arah

Model Flowchart (Diagram Alir)

Model State Chart

State chart lampu geser asinkron
State chart lampu geser asinkron

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

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.