#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Ganti 0x27 dengan alamat yang ditemukan dari I2C Scanner jika berbeda
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int buttonPin = 2; // nomor pin pushbutton
const int ledPin = 13; // nomor pin LED
int buttonState = 0; // variabel untuk membaca status pushbutton
int lastButtonState = 0; // variabel untuk menyimpan status terakhir tombol
int buttonPressCount = 0; // variabel untuk menghitung jumlah tekan tombol
int setCount = 10; // jumlah tekan tombol yang diinginkan untuk mulai berkedip
bool ledBlinking = false; // status apakah LED sedang berkedip
unsigned long previousMillis = 0; // waktu sebelumnya
const long interval = 500; // interval untuk berkedip LED (ms)
const byte ROWS = 4; // jumlah baris pada keypad
const byte COLS = 4; // jumlah kolom pada keypad
// daftar karakter keypad
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// pin yang terhubung ke baris keypad
byte rowPins[ROWS] = {3, 4, 5, 6};
// pin yang terhubung ke kolom keypad
byte colPins[COLS] = {7, 8, 9, 10};
// membuat objek keypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS );
void setup() {
// inisialisasi LCD dengan jumlah kolom dan baris
lcd.begin(16, 2);
// Nyalakan backlight dan tampilkan pesan.
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Button Press Count:");
// inisialisasi pin pushbutton sebagai input dengan pull-up internal
pinMode(buttonPin, INPUT_PULLUP);
// inisialisasi pin LED sebagai output
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // matikan LED awalnya
}
void loop() {
// proses bacaan keypad
char customKey = customKeypad.getKey();
// jika tombol keypad ditekan
if (customKey != NO_KEY) {
// jika tombol A sampai D ditekan, atur nilai setCount
if (customKey >= 'A' && customKey <= 'D') {
switch (customKey) {
case 'A':
setCount = 5; // contoh: atur setCount menjadi 5 saat tombol A ditekan
break;
case 'B':
setCount = 10; // contoh: atur setCount menjadi 10 saat tombol B ditekan
break;
case 'C':
setCount = 15; // contoh: atur setCount menjadi 15 saat tombol C ditekan
break;
case 'D':
setCount = 20; // contoh: atur setCount menjadi 20 saat tombol D ditekan
break;
}
// tampilkan nilai setCount di LCD
lcd.setCursor(0, 1);
lcd.print("SetCount: ");
lcd.print(setCount);
// jika LED sedang berkedip dan setCount diubah menjadi lebih rendah dari count, matikan LED
if (ledBlinking && setCount < buttonPressCount) {
ledBlinking = false;
digitalWrite(ledPin, LOW);
}
}
}
// membaca status pushbutton
buttonState = digitalRead(buttonPin);
// cek apakah tombol ditekan (buttonState LOW) dan status sebelumnya HIGH (tombol dilepas sebelumnya)
if (buttonState == LOW && lastButtonState == HIGH) {
// increment jumlah tekan tombol
buttonPressCount++;
// update tampilan LCD dengan jumlah tekan tombol baru
lcd.setCursor(0, 1);
lcd.print("Count: ");
lcd.print(buttonPressCount);
// jika jumlah tekan tombol mencapai atau melebihi setCount dan LED belum berkedip, mulai berkedipkan LED
if (buttonPressCount >= setCount && !ledBlinking) {
ledBlinking = true;
digitalWrite(ledPin, HIGH); // nyalakan LED pertama kali
previousMillis = millis(); // simpan waktu saat ini
}
}
// simpan status tombol saat ini sebagai status terakhir untuk loop berikutnya
lastButtonState = buttonState;
// cek apakah LED sedang berkedip
if (ledBlinking) {
// periksa apakah sudah waktunya untuk mematikan atau menghidupkan kembali LED
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// atur ulang waktu sebelumnya
previousMillis = currentMillis;
// balikkan status LED
digitalWrite(ledPin, !digitalRead(ledPin));
}
}
// delay kecil untuk menghindari bouncing pada tombol
delay(50);
}