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.
Tantangan
SedangTombol 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;
}
}
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