/* “Bounce” pada push button, atau yang dikenal juga sebagai
“switch bouncing” atau “contact bounce,” adalah fenomena yang
terjadi ketika sebuah saklar mekanis atau tombol sedang ditekan atau
dilepas. Ini mengacu pada fluktuasi cepat kontak listrik antara
terminal saklar selama transisi ini, yang menghasilkan beberapa
siklus buka-tutup dalam waktu yang sangat singkat. Ini bisa
menyebabkan masalah dalam sirkuit digital karena dapat
diinterpretasikan sebagai banyak tekanan tombol yang berbeda.
Oleh karena itu, sering kali diperlukan sebuah “debounce circuit”
atau program debounce dalam perangkat lunak untuk memastikan bahwa
hanya satu sinyal yang dihasilkan setiap kali tombol ditekan atau
dilepas.*/
/* Pada program ini membutuhkan program debounce untuk tombol
penggantian mode merkuri-rhodamin. program debounce hanya digunakan
pada tombol mode karena cara kerja tombol mode adalah mode akan
berubah tiap kali ditekan. berbeda dengan tombol PB yang digunakan
untuk mulai mengukur saat ditekan dan berhenti saat dilepas.*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define modeButton 2
#define PB 3
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
boolean mode = false;
void setup() {
pinMode(PB, INPUT_PULLUP);
pinMode(modeButton, INPUT_PULLUP);
lcd.init ();
lcd.setBacklight(HIGH);
//untuk contoh menghasilkan angka acak
randomSeed(analogRead(0));
}
void loop() {
// Baca kondisi tombol mode (HIGH/LOW)
int reading = digitalRead(modeButton);
// Jika kondisi tombol berubah dr kondisi terakhir
if (reading != lastButtonState) {
// maka reset debounce timer
lastDebounceTime = millis();
}
// Jika perubahan kondisi melebihi waktu delay, maka kondisinya benar2 kondisi karena tombol ditekan
if ((millis() - lastDebounceTime) > debounceDelay) {
// jika kondisi tombol berubah
if (reading != buttonState) {
// kondisi saat ini = kondisi tombol saat dibaca
buttonState = reading;
// jika tombol dilepas
if (buttonState == HIGH) {
// maka mode berkebalikan dari mode sebelumnya
mode = !mode;
if(mode==false)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Mode Merkuri ");
}
else
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Mode Rhodamin ");
}
}
}
}
// kondisi tombol mode terakhir = kondisi pembacaan saat ini
lastButtonState = reading;
if(digitalRead(PB)==LOW && mode==false)
{
//isi program membaca merkuri, untuk contoh ini diisi program led berkedip tiap 1 detik
lcd.setCursor(0,0);
lcd.print("Tingkat Merkuri:");
lcd.setCursor(0,1);
lcd.print(random(100));
}
else if(digitalRead(PB)==LOW && mode==true)
{
//isi program membaca rhodamin, untuk contoh ini diisi program led berkedip tiap 1 detik
lcd.setCursor(0,0);
lcd.print("Tingkat Rhodamin:");
lcd.setCursor(0,1);
lcd.print(random(100));
}
}