Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

LED 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);
}
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