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.
Tantangan
SedangSebuah 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 keDONE.DONE: LED merah menyala. Setelah 1000 ms, matikan LED dan kembali keREADY.
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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengaturan Waktu Tanpa Delay
1millis()
Jam millis()Waktu dalam unsigned longLED Berkedip Tanpa JedaDua LED, Dua KecepatanLED Berkedip Saat Tombol Mengubah StatusLampu dengan Pengatur Waktu4Pengaturan Waktu yang Presisi
Mengukur dengan micros()Saat millis() Berputar KembaliStopwatch Tombol2Mesin Keadaan
Mengingat ModeMemilih dengan switchKeadaan Bernama dengan enumMesin Keadaan Lampu Lalu LintasBergilir Antar-Mode dengan TombolLatihan sendiri: Playground Arduino