Arduino - Ganti Delay dengan Millis

Pada postingan kali ini, saya akan membagikan cara mengganti fungsi delay dengan menggunakan millis. Secara teknis, fungsi delay adalah semacam blocking function yang mengijinkan program untuk menunggu beberapa waktu sebelum lanjut melakukan aktivitas lainnya. Sedangkan, fungsi millis adalah fungsi yang mengembalikan nilai lama waktu hardwarenya sudah nyala dalam millisecond. Jika dibandingkan apple-to-apple, sebenernya kedua fungsi ini berfungsi untuk hal yang berbeda. Di postingan kali ini, kita akan membuat fungsi "delay" dengan menggunakan millis.

Berdasarkan beberapa sumber, penggunaan fungsi millis lebih dianjurkan dibanding dengan fungsi delay, khususnya pada keluarga ESP, baik ESP8266 atau ESP32. Pada keluarga ESP, terdapat watchdog timer (wdt) yang berfungsi untuk menjaga agar sistem yang dibuat tidak mengalami crash atau hang yang dapat merusak hardware. Salah satu caranya adalah dengan memeriksa waktu tunggu yang tersedia pada hardware ketika mengeksekusi program. Seperti yang telah dijelaskan sebelumnya, fungsi delay adalah blocking function. Blocking function artinya tidak mengijinkan program lain berjalan ketika fungsi ini sedang dieksekusi. Hal ini bisa menimbulkan waktu tunggu yang tidak tercapai (timeout) dan menyebabkan wdt reset. Akibat dari wdt reset adalah hardware akan terreset. Tentunya ini akan mengganggu karena program akan mengulang dari awal.

Sebelumnya sudah dijelaskan kenapa fungsi delay perlu dihindari. Namun pada postingan ini, saya ingin tetap membuat fungsi "delay" dengan "blocking function". Dalam kasus saya, ada library yang membuat fungsi delay tidak berfungsi dengan semestinya (misalnya library DMD2 ketika melakukan pengaturan kecerahan). 

Sebelum masuk ke codingnya, saya akan memberikan informasi singkat mengenai alat yang saya gunakan. Saya menggunakan PC dengan OS Windows 10 untuk melakukan compiling firmware. IDE yang digunakan adalah Arduino IDE versi 1.8.9. Dan versi board ESP8266 (versi framework) yang digunakan adalah 2.7.4. 

Berikut adalah fungsi "delay" baru menggunakan millis yang dibuat untuk menggantikan fungsi delay.

void millisDelay(unsigned long delayTime) {
  unsigned long startTime = millis();
  while(millis() - startTime < delayTime) {
    yield();
  }
}

Pada coding di atas, kita membuat fungsi dengan nama millisDelay dengan passing parameter berupa jumlah millisecond untuk melakukan delay. Di dalam fungsi tersebut akan dilakukan perulangan sampai waktu delaynya terpenuhi. Selama masih melakukan perulangan, fungsi yield akan dipanggil. Berdasarkan yang saya baca, fungsi yield ini sebenernya tidak melakukan apa-apa. Namun dengan menggunakan fungsi ini, "katanya" bisa digunakan oleh hardware untuk melakukan perganti eksekusi task. Saya sendiri pun kurang paham bagian ini dan belum bisa membuktikannya, tapi yang jelas, jika kalau menggunakan ESP8266, penggunaan fungsi yield ini dapat digunakan untuk menghindari wdt reset.

Kemudian kita tinggal menggunakannya seperti fungsi delay biasa, misalnya untuk menulis di serial monitor Hello kemudian satu detik kemudian World!, seperti contoh di bawah.

Serial.println("Hello");
millisDelay(1000);
Serial.println("World!");
millisDelay(1000);


Sekian mengenai cara mengganti fungsi delay menggunakan fungsi millis. Semoga bermanfaat dan membantu rekan-rekan yang menjumpai hal sama seperti saya, menghadapi fungsi delay yang tidak berjalan dengan semestinya. Selamat membaca dan mencoba.


Salam Share,


Funtastic Share

Komentar