#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inisialisasi LCD I2C 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inisialisasi Keypad 4x4
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Deklarasi variabel
int setCount = 0;
int count = 0;
unsigned long lastPressTime = 0;
bool beep = false;
bool resetSetCount = false;
bool irLastState = HIGH; // Menyimpan status terakhir dari sensor IR
bool beepActive = true;
// Pin sensor IR dan speaker
const int irSensorPin = A0;
const int speakerPin = 10;
// Fungsi setup
void setup() {
pinMode(irSensorPin, INPUT);
pinMode(speakerPin, OUTPUT);
lcd.begin(16, 2); // Mengatur jumlah kolom dan baris pada LCD
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Set Count= ");
lcd.setCursor(0, 1);
lcd.print("Count= ");
}
// Fungsi loop
void loop() {
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
if (resetSetCount) {
setCount = 0;
resetSetCount = false;
}
setCount = (setCount * 10) + (key - '0');
updateLCD();
}
if (key == 'C') {
unsigned long currentTime = millis();
if (currentTime - lastPressTime < 5000) {
setCount = 0;
} else {
lastPressTime = currentTime;
}
updateLCD();
}
if (key == 'D') {
// Set nilai setCount
updateLCD();
}
if (key == 'A') {
unsigned long currentTime = millis();
if (currentTime - lastPressTime > 5000) {
count = 0;
} else {
lastPressTime = currentTime;
}
updateLCD();
}
if (key == 'B') {
// Pulihkan nilai count
count = setCount;
updateLCD();
}
if (key == '*') {
// Reset nilai setCount tanpa mengatur ulang nilai count
resetSetCount = true;
}
if (key == '#') {
beepActive = false;
noTone(speakerPin);
}
}
bool irValue = digitalRead(irSensorPin);
if (irValue == LOW && irLastState == HIGH) {
delay(100); // Debounce sensor IR
if (digitalRead(irSensorPin) == LOW) {
count++;
tone(speakerPin, 1000, 100);
updateLCD();
delay(500); // Berikan jeda agar tidak menghitung dua kali
}
}
irLastState = irValue;
if (count >= setCount && beepActive) {
if (!beep) {
tone(speakerPin, 1000); // Mulai bunyi bip
beep = true;
}
} else {
noTone(speakerPin);
beep = false;
}
}
// Fungsi untuk memperbarui tampilan LCD
void updateLCD() {
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(11, 0);
lcd.print(setCount);
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(count);
}