Senin, 31 Mei 2021

Arduino - Implementasi millis sebagai penghitung waktu

Ada berbagai macam implementasi millis diantaranya millis sebagai pengganti delay, millis sebagai timer, multitasking arduino dengan millis dll. 

Sebagai pembahasan yang cukup menarik dan sangat jarang dibahas, pada postingan kali ini akan dibahas bagaimana aplikasi millis sebagai timer, pada contoh kasus membuat sebuah system perhitungan biaya berdasarkan waktu. 

Pada contoh kasus ini implementasi millis sebagai penghitung 3 waktu(timer) yang berbeda yang dapat berjalan secara independen. 

Apa saja kegunaannya? 
tentu saja sangat banyak kegunaannya yang dapat kita terapkan, contohnya : 
  1. Sebagai timer penghitung biaya parkir 
  2. Sebagai timer penghitung biaya penyimpanan barang 
  3. Sebagai timer penghitung biaya sewa, dll
kita ambil contoh penerapan pada sistem penyimpanan barang pada 3 buah locker yang berbeda, yang mana biaya penyimpanan ini dihitung berdasarkan lama waktu penyimpanan dengan 4 tingkatan harga, yaitu : 
  • Rp 2.000,- biaya penyimpanan 1 jam pertama 
  • Rp 4.500,- biaya penyimpanan bila mencapai 3 jam 
  • Rp 7.500,- biaya penyimpanan bila mencapai 4 jam 
  • Rp 10.000,- biaya maksimum bila mencapai 6 jam 
Berikut contoh dasar program dengan simulasi pada serial monitor:


#define SecondPrice 3 //nilai dalam satuan menit
#define ThirdPrice 4 //nilai dalam satuan menit
#define MaxPrice 6 //nilai dalam satuan menit

unsigned long Timer1;
unsigned long CountTimer1;
unsigned long Timer1Millis = 0;
const long IntervalTimer1 = 1000;

unsigned long Timer2;
unsigned long CountTimer2;
unsigned long Timer2Millis = 0;
const long IntervalTimer2 = 1000;

unsigned long Timer3;
unsigned long CountTimer3;
unsigned long Timer3Millis = 0;
const long IntervalTimer3 = 1000;

unsigned long PrintMillis = 0;
const long IntervalPrint = 5000;

int Price1;
int Price2;
int Price3;

char data;

void setup() {
Serial.begin(9600);
}

void loop()
{

unsigned long Timer1CurrentMillis = millis();
if (Timer1CurrentMillis - Timer1Millis >= IntervalTimer1)
{
Timer1Millis = Timer1CurrentMillis;
Timer1 - millis();
Timer1++;
}

unsigned long Timer2CurrentMillis = millis();
if (Timer2CurrentMillis - Timer2Millis >= IntervalTimer2)
{
Timer2Millis = Timer2CurrentMillis;
Timer2 - millis();
Timer2++;
}

unsigned long Timer3CurrentMillis = millis();
if (Timer3CurrentMillis - Timer3Millis >= IntervalTimer3)
{
Timer3Millis = Timer3CurrentMillis;
Timer3 - millis();
Timer3++;
}

unsigned long PrintCurrentMillis = millis();
if (PrintCurrentMillis - PrintMillis >= IntervalPrint)
{
PrintMillis = PrintCurrentMillis;
Serial.print (" Biaya Locker 1 = Rp.");
Serial.print (Price1);
Serial.print (" / ");
Serial.print (" Biaya Locker 2 = Rp.");
Serial.print (Price2);
Serial.print (" / ");
Serial.print (" Biaya Locker 3 = Rp.");
Serial.println (Price3);
Serial.println ();
}

if(Serial.available()>0){
data = Serial.read();
Serial.print(data);
Serial.print("\n");
}
if(data == '1'){ //Reset Timer 1
Timer1 = 0;
CountTimer1 = 0;
Serial.println ("RESET TIMER 1");
}
if(data == '2') { //Reset Timer 2
Timer2 = 0;
CountTimer2 = 0;
Serial.println ("RESET TIMER 2");
}
if(data == '3') { //Reset Timer 3
Timer3 = 0;
CountTimer3 = 0;
Serial.println ("RESET TIMER 3");
}


if (Timer1==60){ //Auto Reset Timer1 setiap 60s & penjumlahan
Timer1 = 0;
CountTimer1 ++;
}
if (Timer2==60){ //Auto Reset Timer2 setiap 60s & penjumlahan
Timer2 = 0;
CountTimer2 ++;
}
if (Timer3==60){ //Auto Reset Timer3 setiap 60s & penjumlahan
Timer3 = 0;
CountTimer3 ++;
}


if (CountTimer1 <= SecondPrice) {
Price1 = 2000; //Harga terendah(Awal)
}
if (CountTimer1 == SecondPrice && CountTimer1 << ThirdPrice) {
Price1 = 4500;
}
if (CountTimer1 == ThirdPrice && CountTimer1 << MaxPrice) {
Price1 = 7500;
}
if (CountTimer1 >= MaxPrice) {
Price1 = 10000; //Harga maksimum
}


if (CountTimer2 <= SecondPrice) {
Price2 = 2000;
}
if (CountTimer2 == SecondPrice && CountTimer2 << ThirdPrice) {
Price2 = 4500;
}
if (CountTimer2 == ThirdPrice && CountTimer2 << MaxPrice) {
Price2 = 7500;
}
if (CountTimer2 >= MaxPrice) {
Price2 = 10000;
}


if (CountTimer3 <= SecondPrice) {
Price3 = 2000;
}
if (CountTimer3 == SecondPrice && CountTimer3 << ThirdPrice) {
Price3 = 4500;
}
if (CountTimer3 == ThirdPrice && CountTimer3 << MaxPrice) {
Price3 = 7500;
}
if (CountTimer3 >= MaxPrice) {
Price3 = 10000;
}

}



Pada simulasi ini menggunakan hitungan menit (1menit, 3menit, 4menit, 6menit) untuk perubahan tingkatan harga, dapat dilihat pada baris program 
 
            #define SecondPrice
            #define ThirdPrice 4  
            #define MaxPrice 6

jika ingin mengimplementasikan dalam satuan jam cukup mengganti angka pada baris program tersebut dari hasil perkalian 60, contoh angka 3 diganti dengan 180 untuk menghitung waktu 3 jam (3x 60 = 180).


Untuk me-reset timer 1 ketik 1 (pada serial monitor) kemudian enter
Untuk me-reset timer 2 ketik 2 (pada serial monitor) kemudian enter
Untuk me-reset timer 3 ketik 3 (pada serial monitor) kemudian enter



*Note: Sketch program diatas hanya sebagai contoh dasar saja tentunya dapat dikembangkan sehingga menjadi sebuah project yang luar biasa.

Semoga bermantaat...
keep sharing...


0 comments: