Pada Tutorial Sebelum nya, membaca button dengan digitalRead, kita telah mengetahui bahwa, pada rangkaian pullup button, ketika tombol di tekan maka Arduino PIN akan membaca logika 0 dan ketika di lepas (realese) maka akan berlogika High. Konsep sederhana ini memiliki kekurangan, karena ada proses delay. Ketika ada delay maka program akan blocking, tidak bisa mengerjakan apa apa ( Kecuali interupt, akan kita bahas insya Allah di materi selanjut nya)
Sebagai pengulangan berikut program membaca tombol dengan delay
byte btn_1 = 34;
bool data_btn1=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(btn_1, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
data_btn1 = digitalRead(btn_1);
Serial.print("btn 1: ");
Serial.println(data_btn1);
delay(1000);//blocking program
}
Ketika program sampai di delay(1000), maka Arduino menjadi MAGER karena tidak mengerjakan apa-apa, menunggu proses delay selesai, kemudian mengerjakan proses yang lain. Nah seperti apa cara mempercepat proses pembacaan button???, let’s cee togeder ^_^

Kondisi if pada Arduino
byte btn_1 = 34;
bool data_btn1=0;
#define ditekan 0
Pertama-tema kita akan membuat sebuah deklarasi global menggantikan 0 sebagai ditekan. 0 = ditekan
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(btn_1, INPUT);
}
Selanjut nya variable btn_1 ( GPIO34 ) kita fungsikan sebagai INPUT.
pada ESP32 GPIO34, GPIO36, GPIO35, GPIO39 hanya bisa di gunakan sebagai input mode, tidak bisa di gunakan sebagai output ( menyalakan LED)
Fungsi GPIO Tertentu
Selanjut nya membuat proses if pada fungsi loop
void loop() {
// put your main code here, to run repeatedly:
data_btn1 = digitalRead(btn_1);//baca GPIO34
if(data_btn1 == ditekan){
Serial.println("ditekan");
}else{
Serial.println("tombol di lepas");
}
}
Pada Proses di atas, ketika button di tekan maka variable data_btn1 akan berkondisi 0, jika dilepas maka kembali data_btn berkondisi 1.
Ketika kondisi 0 maka akan menjalankan Serial.println(“ditekan”); ketika di lepas maka akan menjalankan Serial.println(“tombol di lepas”);

disini proses pembacaan button sangat cepat, namun ada kelemahan karena sistem cara kerja button itu sendiri. Ketika button ditekkan maka akan mengerjakan Serial.println(“ditekan”) secara BERTUBI-TUBI DAN BERULANG-ULANG, dan Ketika dilepas makan akan Menjalankan Serial.println(“tombol di lepas”) secara membabi buta dan Berkali-kali. Nah bagaimana kah agar ketika di tekan Serial.println(“ditekan”); hanya dijalankan sekali-kali?
Hold Button Arduino
byte btn_1 = 34;
bool data_btn1=0;
#define ditekan 0
bool hold_btn1 = 0; // INI DITAMBAH
Kita Tambah sebuah variable dengan nama hold_btn1 dengan kondisi awal 0
void loop() {
// put your main code here, to run repeatedly:
data_btn1 = digitalRead(btn_1);//baca GPIO34
if (data_btn1 == ditekan) {
if (hold_btn1 == 0) {
Serial.println("ditekan");
hold_btn1 = 1;
}
} else {
hold_btn1 = 0;
}
}
Kondisi Awal hold_btn1 adalah 0, ketika di tekan maka akan menjadikan hold_btn1 menjadi nilai1. ketika tombol di lepas makan hold_btn1 kembali berlogika 0. Apakah perbedaan program di atas. Coba perhatikan di serial monitor. Pada program hold button ini, Serial.println(“ditekan”) hanya akan di jalankan sekali ketika tombol di tekan, sementara pada program tanpa hold button maka Serial.println(“ditekan”); akan di jalankan terus-menerus selama button di tekan.
program keseluruhan nya adalah sebagai berikut
byte btn_1 = 34;
bool data_btn1 = 0;
#define ditekan 0
bool hold_btn1 = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(btn_1, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
data_btn1 = digitalRead(btn_1);//baca GPIO34
if (data_btn1 == ditekan) {
if (hold_btn1 == 0) {
Serial.println("ditekan");
hold_btn1 = 1;
}
} else {
hold_btn1 = 0;
}
}
Semua tutorial ini menggunakan Trainner IoT kita, jika ada pertanyaan bisa whatsapp dengan tekan tombol di bawah ini,
