LED Berkedip Tanpa Jeda
Termasuk bagian Pengaturan Waktu Tanpa Delay dalam perjalanan Arduino di Coddy. Pelajaran 3 dari 18.
delay() menghentikan seluruh sketch. Selama kedipan menunggu 500 ms, tidak ada bagian lain dalam loop() yang berjalan: tombol yang ditekan selama waktu itu tidak terdeteksi sampai waktu tunggu selesai.
Solusinya adalah jangan pernah menunggu. Biarkan loop() berjalan berulang kali dengan sangat cepat, lalu setiap kali bandingkan waktu saat ini dengan waktu LED terakhir kali berubah. Sebelum 500 ms berlalu, jangan lakukan apa pun. Setelah itu, ubah LED dan simpan waktu yang baru:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // saat LED terakhir kali berubah
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // ingat saat ini
// ubah status LED di sini
}
// apa pun yang lain di sini dijalankan ribuan kali per detik
}now - previousMillis adalah waktu sejak perubahan terakhir. Untuk mengganti LED, simpan statusnya dalam variabel, int redState = LOW;, ubah statusnya dengan if/else, lalu tulis nilainya dengan digitalWrite(redLed, redState);.
Jika kamu lupa memperbarui previousMillis, kondisi akan tetap benar setelah 500 ms pertama, sehingga LED berubah pada setiap perulangan dan tampak menyala redup.
Tantangan
SedangLED kuning seharusnya mengikuti tombol, tetapi reaksinya terlambat karena pemanggilan delay() pada LED merah menghentikan perulangan. Tulis ulang kedipan LED merah dengan millis():
- pertahankan bagian tombol seperti semula
- setiap 500 ms, nyalakan atau matikan LED merah pada pin 13
- jangan gunakan
delay()di mana pun
Tekan Run, tahan tombol dan amati kedua LED, lalu tekan Check.
Coba sendiri
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// LED kuning mengikuti tombol. Pertahankan bagian ini.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// LED merah berkedip, tetapi setiap delay() menghentikan baris-baris di atas
// selama setengah detik. Tulis ulang bagian ini dengan millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
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 TombolLatihan sendiri: Playground Arduino