Cara mengatasi waktu tunda yang tidak ngeblok menggunakan fungsi milis()
Monday, 3 September 2018
Add Comment
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 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. |
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 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. |
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() 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 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