Apa Itu Milis pada Arduino dan Cara Penggunaanya ?

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

Bagikan Postingan ini :

Putu Artha

Seorang Laki- Laki yang senang berbagi ilmu seputar Informasi Teknologi dan Elektronika Serta pengalaman yang pernah saya lakukan

This Post Has 2 Comments

  1. aprek

    bang izin tanya,bagaimana cara membuat 2LED dengan milis,LED1 interval=3dtk LED2 interval=4dtk.trus agar setelah 5mnt intervalnya bertukar bang.
    trimakasih bang

    1. Putu Artha

      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

Leave a Reply