firmware innoiti CT-1 TPQ Al-Munawwarah
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi WiFi
const char* ssid = "CreativeNet";
const char* password = "Creanet123";
// URL server tujuan
const char* serverUrl = "http://zidcreative.com/simunawwarah/jurnalsantri/absensi/absensi.php";
// Konfigurasi RFID
#define RST_PIN 0
#define SS_PIN 2
#define BUZZER 16
#define LED_PIN 15 // LED ditambahkan
// Blok tempat NIS disimpan
#define NIS_BLOCK 5
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
MFRC522::StatusCode status;
// Konfigurasi NTP
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200, 60000); // GMT+7 (25200 detik)
void playIntro() {
digitalWrite(LED_PIN, HIGH); // LED menyala saat booting
tone(BUZZER, 1000, 200);
delay(200);
tone(BUZZER, 1200, 200);
delay(200);
tone(BUZZER, 1500, 300);
delay(300);
noTone(BUZZER);
digitalWrite(LED_PIN, LOW); // Matikan LED setelah booting selesai
}
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Koneksi ke WiFi...");
// Inisialisasi LED & Buzzer
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Mainkan suara intro
playIntro();
// Koneksi ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWiFi Terkoneksi!");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WiFi Terhubung!");
delay(2000);
// Inisialisasi key untuk autentikasi RFID
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; // Key default
// Inisialisasi NTP
timeClient.begin();
}
void playSuccessTone() {
tone(BUZZER, 1500, 200);
digitalWrite(LED_PIN, HIGH);
delay(100);
tone(BUZZER, 2000, 200);
delay(100);
digitalWrite(LED_PIN, LOW);
}
void playFailTone() {
tone(BUZZER, 600, 500);
digitalWrite(LED_PIN, HIGH);
delay(200);
tone(BUZZER, 800, 500);
delay(200);
digitalWrite(LED_PIN, LOW);
}
void loop() {
timeClient.update(); // Perbarui waktu dari server NTP
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Al-Munawwarah");
lcd.setCursor(0,1);
lcd.print(timeClient.getFormattedTime());
// Cek apakah ada kartu RFID yang terbaca
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
Serial.println("\nMembaca data RFID...");
// Autentikasi dan membaca blok 5 untuk mendapatkan NIS sebagai ID Jari
byte buffer[18]; // Buffer untuk menyimpan data dari blok
byte bufferSize = sizeof(buffer);
String id_jari = "Unknown"; // Default jika gagal membaca
String name = "Unknown"; // Default jika gagal membaca nama
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, NIS_BLOCK, &key, &(mfrc522.uid));
if (status == MFRC522::STATUS_OK) {
status = mfrc522.MIFARE_Read(NIS_BLOCK, buffer, &bufferSize);
if (status == MFRC522::STATUS_OK) {
id_jari = "";
for (byte i = 0; i < 16; i++) {
if (buffer[i] != 0x00) id_jari += (char)buffer[i]; // Ambil karakter yang valid
}
} else {
Serial.println("Gagal membaca NIS dari kartu");
}
} else {
Serial.println("Autentikasi gagal");
}
Serial.print("ID Jari (NIS): "); Serial.println(id_jari);
// Autentikasi dan membaca nama di blok 4
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid));
if (status == MFRC522::STATUS_OK) {
status = mfrc522.MIFARE_Read(4, buffer, &bufferSize);
if (status == MFRC522::STATUS_OK) {
name = "";
for (byte i = 0; i < 16; i++) {
if (buffer[i] != 0x00) name += (char)buffer[i]; // Ambil karakter yang valid
}
} else {
Serial.println("Gagal membaca nama dari kartu");
}
} else {
Serial.println("Autentikasi gagal membaca nama");
}
Serial.print("Nama: "); Serial.println(name);
// Jika data tidak valid (kosong atau tidak terbaca), tolak kartu
if (id_jari.length() == 0 || id_jari == "Unknown" || name.length() == 0 || name == "Unknown") {
Serial.println("Data tidak valid, absensi ditolak.");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Absensi Gagal!");
lcd.setCursor(0, 1);
lcd.print("Kartu Tidak Valid");
playFailTone(); // Nada gagal + LED berkedip
// Hentikan komunikasi dengan kartu
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
// Tunggu hingga kartu dilepas sebelum lanjut membaca
while (mfrc522.PICC_IsNewCardPresent()) {
delay(100);
}
return; // Hentikan proses lebih lanjut
}
// Kirim data ke server
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
HTTPClient http;
http.begin(client, serverUrl);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Buat payload untuk dikirim
String postData = "id_jari=" + id_jari + "&name=" + name + "×tamp=" + timeClient.getFormattedTime();
int httpResponseCode = http.POST(postData);
if (httpResponseCode > 0) {
Serial.print("Server Response: ");
Serial.println(http.getString());
lcd.clear();
lcd.setCursor(1,0);
lcd.print(name);
playSuccessTone(); // Nada sukses + LED berkedip
} else {
Serial.print("Error: ");
Serial.println(httpResponseCode);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Gagal Kirim!");
playFailTone(); // Nada gagal + LED berkedip
}
http.end();
}
// Hentikan komunikasi dengan kartu setelah selesai membaca
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
delay(2000); // Beri jeda sebelum membaca kartu berikutnya
}