Menu
CoddyTech

Bergilir Antar-Mode dengan Tombol

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

Banyak gadget memiliki satu tombol untuk berpindah mode: lampu sepeda mati, menyala, berkedip, berkedip cepat, lalu mati lagi. Itu adalah mesin status, di mana penekanan tombol, bukan waktu, memindahkan ke status berikutnya.

Letakkan langkah tersebut dalam fungsinya sendiri. switch pada mode saat ini menetapkan mode berikutnya, dan mode terakhir kembali ke mode pertama:

void nextMode() {
  switch (mode) {
    case OFF:
      mode = ON;
      Serial.println("ON");
      break;
    // ... dan seterusnya, sampai FAST kembali ke OFF
  }
}

Sketch memanggil nextMode() satu kali setiap kali tombol ditekan. Tombol dihilangkan pantulannya dengan cara yang kamu pelajari di bagian Input: saat pembacaan berubah, tanggapi perubahan itu, lalu tunggu 20 ms agar kontaknya stabil. switch kedua pada mode mengatur LED.

challenge icon

Tantangan

Sedang

Tombol dan LED sudah disiapkan untukmu. Tulis nextMode() agar setiap kali tombol ditekan, program berpindah ke mode berikutnya dan mencetak namanya: OFF, ON, BLINK, FAST, lalu kembali ke OFF.

Tekan Jalankan, tekan tombol beberapa kali, lalu Periksa.

Coba sendiri

const int ledPin = 13;
const int buttonPin = 2;

enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;

bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// Beralih ke mode berikutnya dan mencetak namanya.
void nextMode() {
  // satu case untuk setiap mode: atur mode berikutnya, cetak namanya, lalu break
}

// Mengubah status LED setiap interval ms.
void blinkEvery(unsigned long interval) {
  unsigned long now = millis();
  if (now - blinkPrevious >= interval) {
    blinkPrevious = now;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}

void loop() {
  // 1. penekanan tombol (setelah debouncing) memanggil nextMode()
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      nextMode();
    }
    wasPressed = pressed;
    delay(20);   // tunggu hingga kontak stabil
  }

  // 2. mode menentukan apa yang dilakukan LED
  switch (mode) {
    case OFF:
      digitalWrite(ledPin, LOW);
      break;
    case ON:
      digitalWrite(ledPin, HIGH);
      break;
    case BLINK:
      blinkEvery(500);
      break;
    case FAST:
      blinkEvery(100);
      break;
  }
}
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