CT-1 TPQ Al-Munawwarah

firmware innoiti CT-1 TPQ Al-Munawwarah

mainCT1.ino INO FILE
#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 + "&timestamp=" + 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
}