#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
// --- KONFIGURASI PIN ---
#define PIN_CS_SD 4 // Chip Select SD Card
#define PIN_TOMBOL 2 // Tombol (Simulasi RFID)
#define PIN_BUZZER 4 // Buzzer (Saya set ke Pin 4 sesuai request terakhir)
// Inisialisasi Komponen
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
File myFile;
void setup() {
Serial.begin(9600);
// Setup Pin
pinMode(PIN_TOMBOL, INPUT_PULLUP);
pinMode(PIN_BUZZER, OUTPUT);
// 1. Setup LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0,0); lcd.print("Booting System...");
delay(500);
// 2. Setup RTC (Jam)
if (!rtc.begin()) {
lcd.setCursor(0,1); lcd.print("RTC Error!");
while(1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// 3. Setup SD Card
Serial.print("Cek SD Card...");
if (!SD.begin(PIN_CS_SD)) {
lcd.setCursor(0,1); lcd.print("SD Card Gagal!");
return;
}
Serial.println("OK!");
// Buat Header File Excel
myFile = SD.open("absen.csv", FILE_WRITE);
if (myFile) {
if (myFile.size() == 0) {
myFile.println("TANGGAL,JAM,NAMA,STATUS");
}
myFile.close();
}
tampilanAwal();
}
void loop() {
// --- LOGIKA BARU (LANGSUNG RESPON) ---
// Cek apakah tombol ditekan (LOW)
if (digitalRead(PIN_TOMBOL) == LOW) {
// 1. LANGSUNG BUNYI & EKSEKUSI (Tanpa Delay Pengecekan)
tone(PIN_BUZZER, 2000);
// 2. Data Simulasi
String nama = "Ust. Budi";
DateTime now = rtc.now();
// 3. Tampilkan di LCD
lcd.clear();
lcd.setCursor(0,0); lcd.print("Ahlan wa Sahlan");
lcd.setCursor(0,1); lcd.print(nama);
// 4. Simpan ke SD Card
simpanData(now, nama);
delay(100); // Durasi bunyi buzzer
noTone(PIN_BUZZER); // Matikan buzzer
// 5. Tahan layar sebentar (biar terbaca)
delay(1500);
// 6. Balik ke menu awal
tampilanAwal();
// 7. KUNCI TOMBOL (Agar tidak absen berulang-ulang kalau ditahan)
// Selama tombol masih ditekan, program berhenti di baris ini
while(digitalRead(PIN_TOMBOL) == LOW) {
delay(10);
}
}
}
void tampilanAwal() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SIAP ABSENSI");
lcd.setCursor(0,1); lcd.print("Tempel Kartu...");
}
void simpanData(DateTime tgl, String nm) {
myFile = SD.open("absen.csv", FILE_WRITE);
if (myFile) {
myFile.print(tgl.year()); myFile.print("/");
myFile.print(tgl.month()); myFile.print("/");
myFile.print(tgl.day()); myFile.print(",");
myFile.print(tgl.hour()); myFile.print(":");
myFile.print(tgl.minute()); myFile.print(":");
myFile.print(tgl.second()); myFile.print(",");
myFile.print(nm); myFile.println(",HADIR");
myFile.close();
Serial.println("Sukses: " + nm);
} else {
Serial.println("Gagal SD Card!");
}
}