Cara mengatasi waktu tunda yang tidak ngeblok menggunakan fungsi milis()

PERTEMUAN KE – 12

Waktu Tunda Yang Tidak Ngeblok 



A. TUJUAN :
  • Mahasiswa dapat menggunakan waktu tunda yang tidak ngeblok.

B. TEORI SINGKAT :
Pada percobaan-percobaan sebelumnya waktu tunda menggunakan fungsi delay(). Fungsi delay() bersifat menunda dengan menggunakan perulangan. Karena menggunakan perulangan maka mempunyai efek ngeblok. Sebelum perulangan selesai maka instruksi lain tidak dapat dieksekusi.
Pada beberapa aplikasi, penggunaan fungsi delay() tidak dapat digunakan karena keakuratan tundaanya terpengaruh dengan tundaan yang lainnya. Misalnya fungsi satu menggunakan delay(1000) dan fungsi dua menggunakan delay(2000), semua fungsi dipanggil di fungsi loop(), maka semua fungsi akan merasakan tunda selama 3000 mili detik.
Untuk mengatasi hal tersebut, Arduino menyediakan fungsi millis() yang berfungsi membaca waktu sejak Arduino dijalankan dalam satuan mikrodetik. Dengan menghitung interval antara waktu yang lalu dengan waktu sekarang akan didapatkan waktu tunda yang dikehendaki.


C. PEMBAHASAN :
Pada praktikum ini kita akan mencoba menjalankan dua buah `program sederhana dimana pada program pertama untuk menambahkan waktu tunda pada program kita menggunakan fungsi delay() sedangkan pada program yang kedua untuk menambahhkan waktu tunda pada program kita menggunakan fungsi milis() dimana fungsi milis itu sendiri adalah untuk membaca waktu sejak Arduino dijalankan dalam satuan mikrodetik. Berikut adalah penjelasan dari script programnya :
1. Praktik 1 menggunakan fungsi delay()
const int ledKedip1 = 13; //deklarasi variabel
const int ledKedip2 =12;
void setup() {
// Semua kode didalam kurung kurawal akan dijalankan hanya satu kali ketika program Arduino dijalankan untuk pertama kalinya.
pinMode(ledKedip1, OUTPUT);
// inisialisasi variabel ledKedip1 sebagai output/keluaran.
pinMode(ledKedip2,OUTPUT);
// inisialisasi variabel ledKedip2 sebagai output/keluaran.
}
void loop(){
//Fungsi ini akan dijalankan setelah setup (fungsi void setup ) selesai. Setelah dijalankan satu kali fungsi ini akan dijalankan lagi, dan lagi secara terus menerus sampai catu daya ( power ) dilepaskan.
Kedip1a();
//akan memanggil fungs Kedip1a() untuk dijalankan pada fugsi loop()
Kedip2a();
//akan memanggil fungs Kedip 2 a() untuk dijalankan pada fugsi loop()
}
void Kedip1a(){ //fungsi
digitalWrite(ledKedip1,HIGH);
delay(1000); // statement dari fungsi Kedip1a() dengan
digitalWrite(ledKedip1,LOW); delay sebesar 1000 milidetik
delay(1000);
}
void Kedip2a()//fungsi
{
digitalWrite(ledKedip2,HIGH);
delay(2000); // statement dari fungsi Kedip1a() dengan
digitalWrite(ledKedip2,LOW); delay sebesar 2000 milidetik
delay(2000);
}
Hasil :

Penjelasan :
Dari gambar diatas lampu LED akan berkedip dengan delay setiap kedipanya yaitu 3000 milidetik karena fungsi satu menggunakan delay(1000) dan fungsi dua menggunakan delay(2000), semua fungsi dipanggil di fungsi loop(), maka semua fungsi akan merasakan tunda selama 3000 mili detik.
2. Praktik 2 menggunakan fungsi milis()
const int ledKedip1 = 13;
const int ledKedip2 =12; //deklarasi variabel
unsigned long waktuSekarang= 0;
void setup() {
// Semua kode didalam kurung kurawal akan dijalankan hanya satu kali ketika program Arduino dijalankan untuk pertama kalinya.
pinMode(ledKedip1, OUTPUT);
// inisialisasi variabel ledKedip1 sebagai output/keluaran.
pinMode(ledKedip2,OUTPUT);
// inisialisasi variabel ledKedip2 sebagai output/keluaran.
}
void loop()
//Fungsi ini akan dijalankan setelah setup (fungsi void setup ) selesai. Setelah dijalankan satu kali fungsi ini akan dijalankan lagi, dan lagi secara terus menerus sampai catu daya ( power ) dilepaskan.
{
waktuSekarang=millis(); //fungsi untuk mengatasi waktu yang ngeblok
//fungsi millis() berfungsi untuk membaca waktu sejak Arduino dijalankan dalam satuan mikrodetik.
Kedip1(); //funggsi yang akan dipanggil kedalam fungsi loop()
Kedip2();
}
void Kedip1()
{
volatile static unsigned long waktuLalu1;
volatile static int kedip1State=HIGH; = //deklarasi variabel
static int interval1=1000;
if(waktuSekarang-waktuLalu1>interval1)
//untuk memeriksa apakah nilai dari variabel waktuSekarang dikurangi waktuLalu1 lebih besar dari nilai interval1
{
waktuLalu1=waktuSekarang;
if(kedip1State==LOW)
kedip1State=HIGH; //statement yang akan dikerjakan jika
else if bernilai true
kedip1State=LOW;
digitalWrite(ledKedip1,kedip1State);
}}
//statement diatas berisi sebuah penyeleksian dimana jika nilai dari variabel kedip1State samadengan low maka nilai variabel kedip1State akan diberi nilai High dan sebaliknya jika nilai if tidak bernilai true maka nilai variabel kedip1State akan diberi nilai Low
void Kedip2()
{
volatile static unsigned long waktuLalu2;
volatile static int kedipState2=HIGH; //deklarasi variabel
volatile unsigned long interval2=2000;
if(waktuSekarang-waktuLalu2>interval2)
//penyeleksian untuk mengecek nilai dari variabel waktuSekarang-waktuLalu2 apakah lebih besar dari nilai variabel2
{
waktuLalu2=waktuSekarang;
if(kedipState2==LOW)
kedipState2=HIGH; //statement yang dikerjakan
else
kedipState2=LOW;
digitalWrite(ledKedip2,kedipState2);
}
}
Hasil :

Penjelasan :
Dari gambar diatas lampu LED akan berkedip dengan delay ketika lampu LED bernilai High yaitu 2000 milidetik dan ketika lampu LED bernilai Low yaitu 1000 milidetik.
D. PEMBAHASAN LATIHAN :
const int ledKedip1 = 13;
const int ledKedip2 =12; //deklarasi variabel
unsigned long waktuSekarang= 0;
void setup() {
// Semua kode didalam kurung kurawal akan dijalankan hanya satu kali ketika program Arduino dijalankan untuk pertama kalinya.
pinMode(ledKedip1, OUTPUT);
// inisialisasi variabel ledKedip1 sebagai output/keluaran.
pinMode(ledKedip2,OUTPUT);
// inisialisasi variabel ledKedip2 sebagai output/keluaran.
Serial.begin(9600);
//menginisialisasi port serial dengan kecepatan 9600 bps
}
void loop()
interval1=Serial.read(); //untuk memasukkan data yang diinputkan pada masukan serial kedalam
interval2=Serial.read(); variabel
Serial.println("Kedip lampu 1 :”+ interval1); //untuk menampilkan hasil masukan kedalam serial
Serial.println("Kedip lampu 2 :”+ interval2); monitor
//Fungsi ini akan dijalankan setelah setup (fungsi void setup ) selesai. Setelah dijalankan satu kali fungsi ini akan dijalankan lagi, dan lagi secara terus menerus sampai catu daya ( power ) dilepaskan.
{
waktuSekarang=millis(); //fungsi untuk mengatasi waktu yang ngeblok
//fungsi millis() berfungsi untuk membaca waktu sejak Arduino dijalankan dalam satuan mikrodetik.
Kedip1(); //funggsi yang akan dipanggil kedalam fungsi loop()
Kedip2();
}
void Kedip1()
{
volatile static unsigned long waktuLalu1;
volatile static int kedip1State=HIGH; = //deklarasi variabel
static int interval1;
if(waktuSekarang-waktuLalu1>interval1)
//untuk memeriksa apakah nilai dari variabel waktuSekarang dikurangi waktuLalu1 lebih besar dari nilai interval1
{
waktuLalu1=waktuSekarang;
if(kedip1State==LOW)
kedip1State=HIGH; //statement yang akan dikerjakan jika
else if bernilai true
kedip1State=LOW;
digitalWrite(ledKedip1,kedip1State);
}}
//statement diatas berisi sebuah penyeleksian dimana jika nilai dari variabel kedip1State samadengan low maka nilai variabel kedip1State akan diberi nilai High dan sebaliknya jika nilai if tidak bernilai true maka nilai variabel kedip1State akan diberi nilai Low
void Kedip2()
{
volatile static unsigned long waktuLalu2;
volatile static int kedipState2=HIGH; //deklarasi variabel
volatile unsigned long interval2;
if(waktuSekarang-waktuLalu2>interval2)
//penyeleksian untuk mengecek nilai dari variabel waktuSekarang-waktuLalu2 apakah lebih besar dari nilai variabel2
{
waktuLalu2=waktuSekarang;
if(kedipState2==LOW)
kedipState2=HIGH; //statement yang dikerjakan
else
kedipState2=LOW;
digitalWrite(ledKedip2,kedipState2);
}
}
Hasil :


E. KESIMPULAN :
Dari praktikum tersebut dapat disimpulkan bahwa untuk mengatasi waktu tunda yang ngeblok kita dapat menggunakan fungsi milis() dimana fungsi milis() itu sendiri berfungsi untuk membaca waktu sejak Arduino dijalankan dalam satuan mikrodetik. Dengan menghitung interval antara waktu yang lalu dengan waktu sekarang akan didapatkan waktu tunda yang dikehendaki.

Jangan lupa baca juga artikel saya tentang Interupsi Eksternal pada Arduino

0 Response to "Cara mengatasi waktu tunda yang tidak ngeblok menggunakan fungsi milis()"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel