Pada postingan kali ini saya akan membahas apa sih milis itu ? temen – teman yang sering menggunakan Arduino pasti pernah mendengar atau melihat contoh koding dari milis ini.
MILIS ADALAH WAKTU YANG TERUS BERJALAN MAJU PADA ARDUINO TERHITUNG SAAT ARDUINO PERTAMA KALI DIJALANKAN
pada function arduino penggunaan milis biasanya dengan cara memanggil —> milis()
Perbedaan Delay dan Milis
Seperti kita ketahui delay adalah proses menghentikan suatu program yang berjalan di Arduino.
Jadi semisal kita menggunakan Delay(1000) maka program yang berjalan akan terhenti selama 1 Detik di Arduino tersebut sama seperti di bandara kalau pesawat kena Delay jadi kita harus menunggu sampai penerbangan selanjutnya dilakukan kurang lebih seperti itu lah.
Nah sedangkan Milis adalah waktu yang terus berjalan menggunakan mili detik (Satuan dibawah detik) sehingga waktu ini walaupun kita gunakan bersamaan dengan fungsi Delay tidak akan berpengaruh karena milis akan tetap menghitung waktu dari awal arduino di jalankan.
Contoh penggunaan Delay pada Arduino
#define LED1 7 void setup() { pinMode(LED1,OUTPUT); } void loop() { digitalWrite(LED1,HIGH); delay (1000); digitalWrite(LED1,LOW); delay(1000); }
Koding di atas menggunakan delay untuk mematikan dan menghidupkan LED1.
Jadi LED1 akan hidup dan mati dalam selang waktu 1 Detik, fungsi Delay di sela – sela digitalWrite(LED1,HIGH) dan digitalWrite(LED1,LOW) yang artinnya program di arduino akan dihentikan dulu dalam 1 detik dan setelah 1 detik berlalu barulah arduino melanjutkan ke perintah selanjutnya, proses tersebut dilakukan terus – menerus (loop) sehingga menghasilakan Flip – Flop.
Kemudian kita lanjut ke penggunaan Milis
Contoh Penggunaan Milis pada Arduino
unsigned long hitungan_milis; //variable yang nantinya kita gunakan untuk menyimpan milis unsigned long milis_sekarang; const unsigned long nilai = 1000; //nilai yang akan kita jadikan patokan 1000 = 1 detik const byte ledPin = 7; //pin LED yang akan kalian gunakan di Arduino void setup() { pinMode(ledPin, OUTPUT); hitungan_milis = 0; //menyimpan milidetik terakhir dari loop } void loop() { milis_sekarang = millis(); //mengambil waktu yang berjalan dan menyimpan di variabel milis_sekarang if (milis_sekarang - hitungan_milis >= nilai) //setiap milis_sekarang - hitungan_milis yang mencapai nilai lebih besar atau sama dengan 1000 { digitalWrite(ledPin, !digitalRead(ledPin)); //LED akan menyala dan mati secara bergantian hitungan_milis = milis_sekarang; //waktu yang disimpan dari saat LED hidup / mati } }
milis menggunakan tipe data long.
Untuk penjelasan dari koding di atas milis_sekarang – hitungan_milis >= nilai dibaca seperti ini :
Jika milis_sekarang dikurangi hitungan_milis lebih besar atau sama dengan nilai maka dilanjutkan dengan perintah selanjutnnya yaitu menyalakan LED dan diulangi lagi menghitung apabila hitungan mencapai nilai maka LED akan mati, Kasarnya seperti ini :
milis_sekarang(menghitung 1-1000) – hitungan_milis ( 0 ) saat milis menjumlahkan dan hasilnya 1000 maka sesuai dengan statement >= nilai (1000) maka LED akan menyala atau sebaliknya setiap 1 detik (1000) lalu setelah menyala nanti ada perintah dibawahnnya yaitu hitungan_milis = milis_sekarang yang artinya nilai dari hitungan milis terakhir sama dengan milis_sekarang sehingga saat state pertama mencapai 1 detik (1000) maka milis_ sekarang berubah nilainya dari 0 menjadi 1000 akan tetapi hitungan_milis akan tetap menghitung maju, sehingga setiap mencapai 1 detik (1000) maka LED akan menyala dan mati.
Gimana udah paham belum ?
Buat lebih jelasnya lagi kita akan mencoba bagaimana sih milis itu bekerja dengan koding di bawah ini…
unsigned long waktu; void setup(){ Serial.begin(9600); } void loop(){ Serial.print("Milis: "); waktu = millis(); Serial.println(waktu); //menampilkan waktu dalam milidetik yang terhitung delay(1000); // menunggu 1 detik supaya waktu tidak terbaca secara massif }
coba kalian upload coding di atas dan lihat hasilnnya di Serial monitor, maka akan muncul angka seperti ini
Dari gambar di atas kita bisa melihat milis itu adalah waktu yang terus berjalan pada arduino sejak pertama digunakan dan akan terus bergerak maju, milis ini biasanya digunakan untuk multitasking di Arduino sehingga pekerjaan tidak perlu menggunakan delay dan lebih tepatnya adalah untuk membentuk waktu yang lebih efisien.
Delay dan milis memiliki persamaan yaitu untuk menentukan waktu namun saat fungsi delay digunakan maka program akan berhenti berbeda dengan milis yang akan tetap berjalan walaupun ada program lain yang dijalankan bersamaan oleh sebab itu milis sering dikatakan orang adalah fungsi untuk multitasking pada Arduino.
Contoh Penggunaan Multitasking
unsigned long hitungan_milis; //variable yang nantinya kita gunakan untuk menyimpan milis unsigned long milis_sekarang; const unsigned long nilai = 5000; //nilai yang akan kita jadikan patokan 1000 = 1 detik const byte ledPin = 7; //pin LED yang akan kalian gunakan di Arduino const byte ledPin2 = 5; //pin LED2 yang akan kalian gunakan di Arduino void setup() { Serial.begin(9600); //memulai koneksi serial untuk mengirim data di Serial Monitor pinMode(ledPin, OUTPUT); pinMode(ledPin2, OUTPUT); hitungan_milis = 0; //menyimpan milidetik terakhir dari loop } void setiap_limadetik() { milis_sekarang = millis(); //mengambil waktu yang berjalan dan menyimpan di variabel milis_sekarang if (milis_sekarang - hitungan_milis >= nilai) //setiap milis_sekarang - hitungan_milis yang mencapai nilai lebih besar atau sama dengan 1000 { digitalWrite(ledPin, !digitalRead(ledPin)); //LED akan menyala dan mati secara bergantian hitungan_milis = milis_sekarang; //waktu yang disimpan dari saat LED hidup / mati } } void setiap_satudetik() { digitalWrite(ledPin2,HIGH); delay (1000); digitalWrite(ledPin2,LOW); delay(1000); } void loop(){ setiap_satudetik(); setiap_limadetik(); }
Hasil Penggunaan Multitasking dengan Milis dan Delay secara bersamaan dapat sobat lihat melalui video di bawah ini
MEMBUAT JAM DENGAN MILIS
untuk percobaan kita kali ini kita akan membuat jam dengan fungsi milis, pertama – tama kalian buat rangkaian seperti gambar di bawah ini…
setelah selesai merangkai kalian bisa upload coding di bawah ini ke Arduino.
/* http://mr-leong.com */ #include <Wire.h> // Comes with Arduino IDE #include <LCD.h> #include <LiquidCrystal_I2C.h> // set Alamat LCD menjadi 0x27 untuk 16 karekter dan 2 baris (Sesuaikan dengan Alamat LCD Sobat) // Set pin pada chip I2C yang digunakan untuk koneksi // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Mengeset Alamat I2C LCD int buttonHrs=7; //pin yang digunakan untuk Jam int prevbuttonHrs=0; // digunakan untuk membaca tombol jam ditekan berapa kali int buttonMin=8; //pin yang digunakan untuk menit int prevbuttonMin=0; // digunakan untuk membaca tombol menit ditekan berapa kali int secs =0; //set variable detik menjadi 0 int mins =-1; // -1 dikarenkan saat program berjalan menit menjadi 1 sehingga agar 0 dibuat -1 int hrs=0; //set variable Jam menjadi 0 int milliDivsecs=1000 ; //digunakan untuk membagi milis unsigned long currmillis; boolean minlock=false; void setup() { pinMode(buttonHrs,INPUT); pinMode(buttonMin,INPUT); Serial.begin(9600); lcd.begin(16,2); // memberitahu program untuk memulai dan lcd adalah 16x2 lcd.backlight(); // menyalakan lampu backlight lcd lcd.setCursor(0,0); //menampilkan lcd mulai dari kolom 0-1 dan baris pertama lcd.print("WAKTU:"); // T adalah inisial Waktu lcd.setCursor(6,0); //menampilkan lcd mulai dari kolom ke 2 dan baris pertama lcd.print("00:00:00"); // tampil seperti ini saat dinyalakan } //fungsi menit void updateMin() { if(mins>59)// jika menit lebih besar dari 59 maka jam akan bertambah 1 { mins=0; hrs=hrs+1; // jam ditambah 1 updateHrs(); // memanggil void updateHrs } if(mins<10) // jika menit kurang dari 10 digit (1-9) { lcd.setCursor(10,0); //set lcd di kolom 6 baris pertama lcd.print(mins); // tampilkan variable mins lcd.setCursor(9,0); //set lcd di kolom 5 baris pertama lcd.print(0); // tampilkan nol (0) } else // selain di atas maka menampilkan 11-59 { lcd.setCursor(9,0); // set k=lcd di kolom 5 lcd.print(mins); // tampilkan variable mins } } //fungsi jam void updateHrs() { Serial.println(hrs); if(hrs>23)// jika jam lebih besar dari angka 23 maka jam kembali ke 0 { hrs=0; //mengembalikan jam ke 0 } if(hrs< 10) //jika jam kurang dari 10 digit (1-9) { lcd.setCursor(6,0); //set lcd di kolom 2 baris pertama lcd.print("0"); // set blank atau kosong sebagai karakternya lcd.setCursor(7,0); } else { lcd.setCursor(6,0); } lcd.print(hrs); } void loop() { currmillis=millis(); // currmilis== milis sekarang //mendapatkan waktu dari milis secs=(millis()/milliDivsecs)%60; //mendapatkan detik dari milis yang merupakan mili detik //selanjutnya adalah memakai fungsi if apabila detik mencapai 0 kembali maka menit akan bertambah 1 if((secs==0) && (minlock==false))// menggunakan minlock dikarenakan saat detik menjadi 0, menit akan bertambah lebih dari 1 { mins=mins+1; // saat program berjalan dan detik 0 otomatis membuat menit menjadi 1 oleh sebab itu kita tambah disni sehingga menit menjadi 0 updateMin(); //memanggil fungsi updateMin untuk menambahkan menit minlock=true; // melakukan blokir menit agar tidak terus bertambah dan hanya bertambah 1 saja saat detik menjadi 0 } else if(secs !=0) //jika detik tidak sama dengan 0 { minlock=false; //buka pengunci menit } if(secs<10) //jika detik lebih kecil dari 10 digit (0-9) { lcd.setCursor(12,0);// set lcd di kolom 9 baris pertama lcd.print(secs); // tampilkan variable secs lcd.setCursor(13,0); // set lcd di kolom 8 baris pertama lcd.print(0); // tampilkan 0 di depanya } else // selain itu apabila digit lebih besar dari 10 (11-59) { lcd.setCursor(12,0); //set lcd di kolom 8 baris pertama lcd.print(secs); //tampilkan variable secs } if(digitalRead(buttonMin)==HIGH && prevbuttonMin==LOW) //mengecek apakah tombol menit ditekan { mins=mins+1; // apabila ditekan maka menit akan bertambah 1 updateMin(); // memanggil void updateMin untuk melakukan update } prevbuttonMin=digitalRead(buttonMin); //prevbutton akan membaca nilai dari buttonMin dan menyimpan berapa kali tombol di tekan if(digitalRead(buttonHrs)==HIGH && prevbuttonHrs==LOW) // mengecek apakah tombol jam ditekan { hrs=hrs+1; // apabila ditekan maka jam akan bertambah 1 updateHrs(); // memanggil void updateHrs untuk melakukan update } prevbuttonHrs=digitalRead(buttonHrs); //prevbutton akan membaca nilai dari buttonHrs dan menyimpan berapa kali tombol di tekan }
Jika sudah mengupload kode di atas jalankan programnnya nanti akan tampil seperti video di bawah ini.
Ketika tombol menit ditekan maka menit akan bertambah 1 dan begitu juga dengan tombol jam.
Untuk penjelasan Codingnya bisa kalian lihat langsung di atas.
Saya berusaha menjabarkan pengertian setiap fungsi dari baris kode tersebut.
Kemudian untuk kalian yang belum mengetahui bagaimana cara mengecek alamat LCD bisa langsung saja ke artikel di bawah ini untuk penjelasanya.
Cara Mengetahui Alamat LCD Serta I2C dengan Arduino
Mungkin sekian dulu pembahasan saya mengenai millis dan delay.
Semoga tulisan saya dapat membantu kawan sekalian dan apabila kalian ingin tau lebih jauh tentang milis langsung saja bertanya di kolom komentar di bawah.
Terimakasih dan Salam Mr. Leong
bang izin tanya,bagaimana cara membuat 2LED dengan milis,LED1 interval=3dtk LED2 interval=4dtk.trus agar setelah 5mnt intervalnya bertukar bang.
trimakasih bang
Saya bantu logikanya ya gan, yang perlu agan lakukan
buat 2 buah state
jika state 1 (sebelum 5menit)
Jalankan fungsi
1. void setiap_tiga detik (led biru)
2. void setiap_empat detik (led merah)
jika state 2 (setelah 5menit)
Jalankan Fungsi
1. void setiap_tiga detik (led merah)
2. void setiap_empat detik (led biru)
jadi void yang perlu agan buat berjumlah 4 dan akan berfunsi begantian setiap 5 menit