Millis Arduino
Apa itu Millis Arduino?
Millis Arduino adalah suatu fungsi pada sintak Arduino yang berguna untuk menjalankan waktu internal setiap milli seconds pada Arduino secara independent. ketika millis di baca maka millis akan terus menghitung waktu walau pun Arduino nya sedang menjalan kan program yang lain. Karena fungsi ini, Millis juga dapat digunakan sebagai multi tasking nya Arduino. Misal nya program sedang menjalan kan Motor, namun Led juga berkedip setiap tiga detik. Ketika teman-teman mencoba memprogram Arduino, maka teman teman akan paham bagaimana cara kerja program yang di jalan kan.
Membuat stopwatch Arduino dengan seven segment menggunakan fungsi millis
Contoh Program Pewaktu
Untuk mengetahui bagaimana cara memprogram millis, sebelum nya mari kita coba membuat program LED flash selama satu detik dengan menggunakan delay. delay dan millis mempunyai kesamaan. Pada delay akan terhenti dan tidak akan menjalan kan fungsi lain sampai delay nya tercapai. Berbeda dengan millis, Millis dapat bekerja sementara program Arduino lain sedang mengerjakan program lain. Contoh sederhana memprogram LED internal dengan Delay.
Delay Dasar
Teman-teman mungkin akan sangat familiar dengan program ini, karena ini adalah awal dari program Arduino, jika sebagai pemula developer software, teman-teman biasa nya memprogram “hello world”, tapi pada Arduino adalah blink, berikut program nya
void setup() { pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // Led Menyala delay(1000); // tahan selama 1 detik, program tidak menjalankan yang lain digitalWrite(LED_BUILTIN, LOW); // Led internal padam delay(1000); // tahan selama 1 detik, program tidak menjalankan yang lain }
Program di atas akan menyalakan Led internal ( PIN 13 Arduino ) selama satu detik dan mematikan nya selama satu detik. Program ini akan terus berlanjut tanpa henti, karena berada pada fungsi loop. Permasalahanya adalah ketika program menjalankan delay(1000); maka program tidak akan menjalankan yang lain. Karena alasan ini lah biasanya programmer expert jarang menggunakan delay, karana memperlambat kinerja dari Arduino itu sendiri.
Tertarik pingin belajar Arduino dari modul Belajar Arduino buatan mikroavr? cukup klik tombol di bawah ini,
Delay dengan perulangan For
Pada contoh ke dua ini kita akan melihat program menghidupkan Led seperti di atas dengan perulangan for selama 1 detik. Program nya seperti berikut,
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // set the LED on for (int x=0; x < 1000; x++) { // tunggu selama satu detik delay(1); } digitalWrite(13, LOW); // set the LED on for (int x=0; x < 1000; x++) { // tunggu selama satu detik delay(1); } }
Pada perulangan for ini sebenar nya lebih baik dari program yang di atas, kelebihan nya adalah kita bisa menambahkan fungsi pada for, maksudnya adalah kita bisa menjalankan perintah lain pada perulangan for. Jadi sembari menunggu 1 detik untuk menghidupkan led selama satu detik atau mematikan selama satu detik, Arduino akan menjalankan yang lain seperti menjalankan program untuk motor atau yang lain.
For Loop dengan Dua Led
Pada contoh program ini kita akan mencoba mengendalikan dua LED, satu Led dihubungkan ke PIN 12, satu di hubungkan ke PIN 13. Coba kita lihat Program nya di bawah ini,
void setup() { pinMode(13, OUTPUT); pinMode(12, OUTPUT); } void loop() { digitalWrite(13, HIGH); // set the LED on for (int x=0; x < 1000; x++) { // loop selama satu detik ( x counting 1 ) delay(1); if (x==500) { digitalWrite(12, HIGH); // hidupkan ketika x berjumlah 500 } } digitalWrite(13, LOW); // set LED padam for (int x=0; x < 1000; x++) { // tunggu selama satu detik delay(1); if (x==500) { digitalWrite(12, LOW); // padamkan Led jika x = 500 } } }
Pada kondisi awal, Led pada pin 13 akan di hidupkan, kemudian masuk ke loop for selama satu detik dengan menghitung variable x sebanyak 1000 kali, maksudnya adalah x = 1, tahan satu detik, kemudian x = 2 tahan satu detik, atau bisa di sederhanakan dengan persamaan x = x +1, atau x++. Ketika x = 500 maka Led pada PIN 12 akan di hidupkan.
Ketika perulangan for pertama selesai maka LED pada PIN 13 akan di matikan, kemudian masuk ke perulangan kedua, Ketika x = 500 maka LED pada PIN 12 akan di matikan, kemudian setelah perulangan selesai maka LED pada PIN 12 akan di padamkan. Pada contoh program ini juga mulai terlihat multitasking Arduino. Tapi multitasking nya adalah secara program bukan secara terpisah.
Pewaktu dengan fungsi millis()
millis() Arduino adalah menghitung waktu secara terpisah setiap milli seconds ( atau 1 / 1000 detik)
Mari kita berpikir tentang waktu . Sebagai contoh kita ingin menghidupkan dan mematikan LED selama 500ms ( setengah detik ) tanpa menggunakan fungsi delay. Apakah bisa? Bagaimana cara nya menggunakan millis ini sebagai pewaktu? Bagaimana kah contoh nya, yuk kita lihat lagi contoh program nya di bawah ini,
unsigned long interval=1000; // the time we need to wait unsigned long previousMillis=0; // millis() returns an unsigned long. bool ledState = false; // state variable for the LED void setup() { pinMode(13, OUTPUT); digitalWrite(13, ledState); } void loop() { unsigned long currentMillis = millis(); // grab current time // check if "interval" time has passed (1000 milliseconds) if ((unsigned long)(currentMillis - previousMillis) >= interval) { ledState = !ledState; // "toggles" the state digitalWrite(13, ledState); // sets the LED based on ledState // save the "current" time previousMillis = millis(); } }
Untuk melihat cara kerja program di atas teman-teman setidak nya perhatikan beberapa poin penting, yaitu variable interval, previosMillis, currentMillis, dan millis();Untuk menyimpan data millis digunakan type variableunsigned long. Ini adalah fungsi deklarasi pada millis itu sendiri.
Oke bagaimana program ini bekerja. Pertama tama adalah currentMillis menyimpan waktu independent dari millis(), kemudian adalah program terus berputar kemudian check apakah currentMillis – previosMillis >= 1000? jika tidak maka variable previousMillis akan mengambil waktu lagi dari millis. Perlu di ketahui dengan sangat penting bahwa jumlah waktu pada millis akan terus bertambah. Setelah pembahasan ini akan kita coba buat program khusus membaca data millis. Setelah currentMillis – previosMillis >= 1000 sudah terpenuhi maka LED akan di rubah dari kondisi awal, jika hidup akan di matikan, jika mati akan di hidupkan, perintah ini bisa di lihat pada potongan program di atas
ledState = !ledState; // "toggles" the state
Nah ketika pernyataan program di bawah ini belum terpenuhi,
if ((unsigned long)(currentMillis - previousMillis) >= interval) { ledState = !ledState; // "toggles" the state digitalWrite(13, ledState); // sets the LED based on ledState // save the "current" time previousMillis = millis(); }
maka kita bisa saja menjalankan program yang lain. Karena ketika program lain di jalan kan, millis tetap bekerja dengan sendiri nya.
Untuk lebih jelas nya bagaimana millis bekerja, coba kita buat satu program lagi. Berikut program nya.
unsigned long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print("Time: "); time = millis(); Serial.println(time); //prints time since program started delay(1000); // wait a second so as not to send massive amounts of data }
Seharus nya program di atas tidak akan melakukan apa-apa setelah sampai pada delay(1000), tapi kenyataan nya adalah millis() tetap bekerja secara terpisah walau program Arduino berhenti selama satu detik, hasil nya bisa di lihat pada gambar di bawah ini,
Mungkin teman-teman masih perlu refrensi lain dari fungsi millis, yuk kita lihat artikel selanjut nya di bawah ini, cukup klik link nya
Membuat stopwatch Arduino dengan seven segment menggunakan fungsi millis
Semoga tulisan ini dapat membantu teman-teman mikro, kritik saran silahkan di koment yah,
Thanks