#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define CS_RFID 10
#define CS_TF 8
#define RST_PIN 9
#define LED_PWM 3
#define LED_HB 5
MFRC522 rfid(CS_RFID, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
File logFile;
volatile bool bat_lemah = false;
void setup() {
pinMode(CS_RFID, OUTPUT);
pinMode(CS_TF, OUTPUT);
pinMode(LED_PWM, OUTPUT);
pinMode(LED_HB, OUTPUT);
digitalWrite(CS_RFID, HIGH);
digitalWrite(CS_TF, HIGH);
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif");
if (!SD.begin(CS_TF)) {
Serial.println("ERR: SD Init");
while (1);
}
// T2 Fast PWM
TCCR2A = (1 << COM2B1) | (1 << WGM21) | (1 << WGM20);
TCCR2B = (1 << CS22);
OCR2B = 15;
// T1 Overflow
TCCR1A = 0;
TCCR1B = (1 << CS12) | (1 << CS10);
TIMSK1 |= (1 << TOIE1);
// Analog Comp (1.1V Bandgap vs AIN1)
ACSR = (1 << ACBG) | (1 << ACIE) | (1 << ACIS1) | (1 << ACIS0);
sei();
}
ISR(TIMER1_OVF_vect) {
digitalWrite(LED_HB, !digitalRead(LED_HB));
}
ISR(ANALOG_COMP_vect) {
bat_lemah = (ACSR & (1 << ACO));
}
void loop() {
if (bat_lemah) {
OCR2B = 255;
lcd.setCursor(0, 1);
lcd.print("BAT: LEMAH! ");
} else {
OCR2B = 15;
lcd.setCursor(0, 1);
lcd.print("BAT: AMAN ");
}
digitalWrite(CS_TF, HIGH);
digitalWrite(CS_RFID, LOW);
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) return;
String uidStr = "";
for (byte i = 0; i < rfid.uid.size; i++) {
uidStr += String(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
uidStr += String(rfid.uid.uidByte[i], HEX);
}
uidStr.toUpperCase();
OCR2B = 255;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID: " + uidStr);
digitalWrite(CS_RFID, HIGH);
digitalWrite(CS_TF, LOW);
logFile = SD.open("log.txt", FILE_WRITE);
if (logFile) {
logFile.println(uidStr);
logFile.close();
Serial.println("LOG_OK: " + uidStr);
} else {
Serial.println("LOG_ERR");
}
delay(1000);
rfid.PICC_HaltA();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem Aktif");
}