Menu
CoddyTech

Keadaan Bernama dengan enum

Termasuk bagian Pengaturan Waktu Tanpa Delay dalam perjalanan Arduino di Coddy. Pelajaran 9 dari 18.

Mode bernomor 0, 1, dan 2 bisa digunakan, tetapi if (mode == 2) tidak menjelaskan arti 2. enum memberi nama untuk setiap angka:

enum State { READY, RUNNING, DONE };
State state = READY;

Baris pertama membuat tipe baru, State, yang hanya memiliki nilai READY, RUNNING, dan DONE. Di balik nama-nama itu, nilainya tetap 0, 1, dan 2, tetapi nama-nama tersebut menjelaskan arti setiap nilai. Baris kedua membuat variabel dengan tipe tersebut.

enum dan switch cocok digunakan bersama: satu case untuk setiap status.

switch (state) {
  case READY:
    // apa yang dilakukan READY dan kapan beralih ke status berikutnya
    break;
  case RUNNING:
    // ...
    break;
}

Untuk berpindah ke status baru, tetapkan state dan ingat kapan status itu dimulai: state = DONE; stateStart = millis();. Setiap status kemudian menghitung waktunya sendiri dengan millis() - stateStart. Cara menulis sketch ini disebut mesin status.

challenge icon

Tantangan

Sedang

Sebuah mesin memiliki tiga state. READY sudah dituliskan untukmu: LED hijau menyala, dan satu kali tekan akan memulai mesin. Tambahkan dua kasus lainnya:

  • RUNNING: LED kuning menyala. Setelah 2000 ms, matikan LED dan lanjutkan ke DONE.
  • DONE: LED merah menyala. Setelah 1000 ms, matikan LED dan kembali ke READY.

Simpan stateStart setiap kali terjadi perubahan. Tekan Run, tekan tombol, lalu tekan Check.

Coba sendiri

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // saat state saat ini dimulai

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // tambahkan case RUNNING: nyalakan lampu kuning; setelah 2000 ms, matikan lampu kuning dan beralih ke DONE

    // tambahkan case DONE: nyalakan lampu merah; setelah 1000 ms, matikan lampu merah dan kembali ke READY
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengaturan Waktu Tanpa Delay

Latihan sendiri: Playground Arduino