🚀 Mega Proyek IoT: Absen Otomatis dengan ESP32-CAM

Sistem absen otomatis yang menggabungkan ESP32-CAM + OLED/LCD + Sensor + LED indikator + Dashboard Online (Blynk/ThingSpeak/MQTT).

🎯 Tujuan: Siswa mampu membuat sistem IoT yang mendeteksi wajah untuk absensi, menampilkan status di layar, dan mengirim data real-time ke dashboard online.

🔧 Komponen yang Dibutuhkan

  • ESP32-CAM (AI-Thinker)
  • OLED 128x64 I2C atau LCD 16x2 I2C
  • Sensor PIR (opsional, untuk deteksi gerakan)
  • LED merah/hijau + resistor 220Ω
  • MicroSD Card (opsional, untuk menyimpan foto)
  • Kabel jumper, breadboard
  • WiFi Internet
  • Software: Arduino IDE + Library ESP32-CAM + DHT + OLED/LCD + Blynk + PubSubClient

1️⃣ Arsitektur Sistem

  1. ESP32-CAM menangkap wajah siswa.
  2. Face Recognition Library mengenali wajah.
  3. LED indikator merah/hijau menandakan absensi berhasil atau gagal.
  4. Layar OLED/LCD menampilkan nama siswa dan status absensi.
  5. Data absensi dikirim ke Blynk, ThingSpeak, dan/atau MQTT.
  6. Sensor PIR mendeteksi keberadaan siswa (opsional) sebelum capture wajah.

2️⃣ Contoh Kode ESP32 Mega Proyek

Kode berikut menggabungkan kamera, OLED, LED, sensor PIR, dan integrasi dashboard Blynk/ThingSpeak/MQTT:

#include "esp_camera.h"
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <BlynkSimpleEsp32.h>
#include <PubSubClient.h>

// ====================== WIFI & DASHBOARD ======================
const char* ssid = "NAMA_WIFI";
const char* password = "PASSWORD_WIFI";
char blynk_auth[] = "AUTH_TOKEN_BLYNK";
const char* mqtt_server = "broker.hivemq.com"; // MQTT broker

WiFiClient espClient;
PubSubClient client(espClient);

// ====================== OLED ======================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// ====================== Sensor & LED ======================
#define LED_GREEN 2
#define LED_RED 15
#define PIR_PIN 13
#define CAMERA_MODEL_AI_THINKER

void setup() {
  Serial.begin(115200);

  // WiFi
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(".");
  }
  Serial.println("WiFi Connected");

  // Blynk
  Blynk.begin(blynk_auth, ssid, password);

  // MQTT
  client.setServer(mqtt_server, 1883);

  // OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
    Serial.println("OLED init failed");
    while(1);
  }
  display.clearDisplay();
  display.display();

  // LED & PIR
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(PIR_PIN, INPUT);

  // Kamera init
  camera_config_t config;
  // PIN kamera AI-Thinker
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5; config.pin_d1 = 18; config.pin_d2 = 19; config.pin_d3 = 21;
  config.pin_d4 = 36; config.pin_d5 = 39; config.pin_d6 = 34; config.pin_d7 = 35;
  config.pin_xclk = 0; config.pin_pclk = 22; config.pin_vsync = 25; config.pin_href = 23;
  config.pin_sscb_sda = 26; config.pin_sscb_scl = 27; config.pin_pwdn = 32; config.pin_reset = -1;
  config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_VGA; config.jpeg_quality = 10; config.fb_count = 2;
  esp_camera_init(&config);
}

void loop() {
  Blynk.run();
  if(!client.connected()) reconnectMQTT();
  client.loop();

  // Deteksi siswa
  if(digitalRead(PIR_PIN) == HIGH){
    // Capture wajah dan lakukan face recognition
    bool wajah_terkenal = faceRecognition();

    // Tampilkan status di OLED
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,20);
    if(wajah_terkenal){
      display.println("ABSEN SUKSES");
      digitalWrite(LED_GREEN,HIGH);
      digitalWrite(LED_RED,LOW);
      sendToDashboard("SUKSES");
    } else {
      display.println("TIDAK TERDAFTAR");
      digitalWrite(LED_GREEN,LOW);
      digitalWrite(LED_RED,HIGH);
      sendToDashboard("GAGAL");
    }
    display.display();
    delay(3000);
    digitalWrite(LED_GREEN,LOW);
    digitalWrite(LED_RED,LOW);
  }
}

// ====================== Fungsi Face Recognition ======================
bool faceRecognition(){
  // Dummy: ganti dengan library ESP32 face recognition
  // Kembalikan true jika wajah dikenali
  return random(0,2); // simulasi: 50% sukses
}

// ====================== Fungsi Dashboard ======================
void sendToDashboard(String status){
  // Blynk
  Blynk.virtualWrite(V1, status);
  // MQTT
  client.publish("esp/absen", status.c_str());
  // ThingSpeak
  if(WiFi.status()==WL_CONNECTED){
    WiFiClient client_http;
    HTTPClient http;
    String url = "http://api.thingspeak.com/update?api_key=API_KEY&field1=" + status;
    http.begin(client_http, url);
    http.GET();
    http.end();
  }
}

// ====================== MQTT Reconnect ======================
void reconnectMQTT(){
  while(!client.connected()){
    Serial.print("Connecting MQTT...");
    if(client.connect("ESP32Absen")) client.subscribe("esp/led");
    else delay(2000);
  }
}

📝 Aktivitas Siswa

  1. Setup ESP32-CAM + OLED/LCD + LED + PIR sensor.
  2. Implementasikan face recognition menggunakan library ESP32 Face Recognition.
  3. Tambahkan dashboard Blynk untuk menampilkan status absensi real-time.
  4. Kirim data absensi ke ThingSpeak dan MQTT broker.
  5. Tambahkan LED indikator: hijau untuk wajah dikenal, merah untuk tidak dikenal.
  6. Uji sistem dengan beberapa wajah siswa dan catat akurasi deteksi.

📘 Penjelasan

  • ESP32-CAM → menangkap gambar siswa secara real-time.
  • Face Recognition → mengenali siswa dan memutuskan status absensi.
  • OLED/LCD → menampilkan status langsung di perangkat.
  • PIR sensor → opsional untuk mendeteksi keberadaan siswa sebelum capture.
  • Dashboard Online (Blynk/ThingSpeak/MQTT) → monitoring real-time dari smartphone atau PC.
  • LED indikator memberikan feedback visual cepat untuk absensi.

No comments:

Post a Comment