Blinking LED – Blinking LED tanpa delay( )

LED (Light Emitting Diode) adalah sebuah komponen diode yang dapat memancarkan cahaya. LED sudah umum dijumpai pada berbagai perangkat elektronik, mulai sebagai indikator power adaptor, hingga display papan iklan

TMN Studio – Electronics

Membuat LED blinking terlihat mudah di Arduino, kita menyalakan beberapa saat, kemudian mematikan, lalu terus siklus berulang-ulang. Akan tetapi, kondisi tunggu ini membuat Arduino berhenti mengeksekusi perintah lainnya. Jadi ketika fungsi delay( ) diekseskusi, maka terjadi kondisi tunggu ini sedangkan instruksi selanjutnya baru dapat diproses setelah interval delay terlampaui. Kita akan membuat blinking LED ketika itu instruksi lainnya sedang dieksekusi.

Berikut ini kode untuk blinking LED pada Arduino tanpa menggunakan fungsi delay():

// Variable for keeping the previous LED state
int previousLEDstate = LOW;
unsigned long lastTime = 0; // Last time the LED changed state
int interval = 200; // interval between the blinks in milliseconds
void setup() {
// Declare the pin for the LED as Output
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// Here we can write any code we want to execute continuously
// Read the current time
unsigned long currentTime = millis();
// Compare the current time with the last time
if (currentTime - lastTime >= interval) {
// First we set the previous time to the current time
lastTime = currentTime;
// Then we inverse the state of the LED
if (previousLEDstate == HIGH) {
digitalWrite(LED_BUILTIN, LOW);
previousLEDstate = LOW;
} else {
digitalWrite(LED_BUILTIN, HIGH);
previousLEDstate = HIGH;
}
}
}

Note:

Sebagian besar Arduino memiliki LED pada pin 13, namun sebagian tipe Arduino lain tidak selalu pada pin 13. Untuk lebih memastikan pin LED yang digunakan, maka kita menggunakan konstanta LED_BUILTIN. Hal ini telah didefinisikan dalam bahasa Arduino dan akan selalu setara dengan pin LED Arduino tipe apapun.

Perbedaan paling mencolok antara program blinking LED normal, dan program yang telah kita pelajari adalah pada program ini kita tidak menggunakan fungsi delay(). Fungsi delay() secara sederhana hanya menghentikan eksekusi kode hingga waktu yang diinginkan tercapai. Di sini kita menggunakan waktu internal Arduino; ketika waktu telah tercapai maka kita mengubah state.

Waktu internal sejak memulai Arduino dapat diakses dengan fungsi millis(), dimana akan mengembalikan waktu dalam milidetik - sejak program mulai dijalankan.

Pendekatan ini disebut juga non-blocking, karena tidak memblokir eksekusi kode. Sebaliknya, fungsi delay() sebagai blocking, digunakan untuk memblokir eksekusi kode hingga waktu tertentu telah tercapai.

Code Breaking

Kode mencatat jumlah waktu berlalu dan mengubah kondisi LED jika waktu telah tercapai. Kita membutuhkan sedikit variabel. Variabel previousLEDstate akan menyimpan kondisi LED terakhir. Variabel lastTime mencatat ketika kondisi LED berubah dari HIGH ke LOW atau LOW ke HIGH. Ketika kita mengubah pin menjadi HIGH, akan menghasilkan output 5V. Ketika pin dalam kondisi LOW, akan menghasilkan output 0V.

Variabel interval berguna untuk menyimpan interval dalam milidetik perubahan kondisi LED.

// Variable for keeping the previous LED state
int previousLEDstate = LOW;
unsigned long lastTime = 0; // Last time the LED changed state
int interval = 200; // interval between the blinks in milliseconds
Dalam fungsi setup(), kita mengatur pin LED sebagai output:
void setup() {
// Declare the pin for the LED as Output
pinMode(LED_BUILTIN, OUTPUT);
}

Bagian terpenting adalah fungsi loop(). Tahap pertama mencatat waktu sejak pertama kali Arduino mengeksekusi program. Fungsi millis() mengembalikan angka yang besar; variabel yang memperoleh data dari fungsi ini selalu dideklarasikan sebagai long atau unsigned long. Variabel unsigned hanya mengambil nilai positif saja dari nol hingga maksimum ruang yang dialokasikan. Misal, variabel dengan tipe normal long dapat memiliki rentang nilai dari - 2,147,483,648 hingga 2,147,483,648, sedangkan unsigned long memiliki rentang nilai dari 0 hingga 4,294,967,295.

unsigned long currentTime = millis();

Sekarang kita perlu melihat apakah waktu telah tercapai sejak waktu terakhir dimana kondisi LED berubah. Untuk hal ini, kita membandingkan waktu sebelumnya. Jika ada perbedaan antara waktu saat ini dan waktu terakhir lebih besar dari interval yang dideklarasikan, kita dapat mengeksekusi perubahan kondisi LED:

if (currentTime - lastTime >= interval)

Ketika interval telah terlampaui, kita akan mencatat waktu baru menjadi waktu sebelumnya. Dengan melakukan cara ini, kita me-reset waktu untuk dibandingkan kembali. Kemudian, kita mengecek kondisi LED sebelumnya dan mengatur LED ke kondisi sebaliknya. Jika LOW, maka kita mengatur LED mejadi kondisi HIGH dan jika HIGH, maka mengatur LED menjadi kondisi LOW. Variabel yang menyimpan kondisi LED sebelumnya, yakni previousLEDstate juga diatur dalam kondisi LED yang terkini:

lastTime = currentTime;
// Then we inverse the state of the LED
if (previousLEDstate == HIGH) {
digitalWrite(LED, LOW);
previousLEDstate = LOW;
} else {
digitalWrite(LED, HIGH);
previousLEDstate = HIGH;
}


Our Divisions

 

Our Partners

TMN Studio

Who's Online

We have 119 guests and no members online