/*
Wokwi | projects
**Project Link:** https://wokwi.com/projects/475832647998116865?gh=1
Error message: sketch.ino:4:10
fvckdhmrrr_ — 9/21/26 at 11:48 PM
please help me
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
// --- KONFIGURASI PIN ---
#define RST_PIN 9
#define SS_PIN 10
#define TRIG_PIN 8
#define ECHO_PIN 7
#define BUTTON_EXIT_PIN 6
#define SERVO_PIN 3
#define BUZZER_PIN 5
#define RELAY_PIN 4
// --- INISIALISASI OBJEK ---
LiquidCrystal_I2C lcd(0x27, 16, 2); // Jika LCD tidak muncul teks, ganti 0x27 ke 0x3F
MFRC522 rfid(SS_PIN, RST_PIN);
Servo palangServo;
// --- UBAH DENGAN UID KARTU RFID KAMU ---
// Contoh UID bawaan tag/kartu RFID biru: "A1 B2 C3 D4" atau "53 12 8A 1A"
String masterCardUID = "A1 B2 C3 D4";
void setup() {
Serial.begin(9600);
SPI.begin(); // Inisialisasi bus SPI untuk RFID
rfid.PCD_Init(); // Inisialisasi MFRC522
lcd.init();
lcd.backlight();
palangServo.attach(SERVO_PIN);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUTTON_EXIT_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
// Kondisi Awal
palangServo.write(0); // Pintu tertutup
digitalWrite(RELAY_PIN, HIGH); // Relai OFF (Modul Relai Aktif-LOW)
digitalWrite(BUZZER_PIN, LOW); // Buzzer OFF
Serial.println("Hello");
tampilkanLcdAwal();
}
void loop() {
// 1. INPUT 1: Sensor Ultrasonik (Mendeteksi Kendaraan Datang)
long jarak = ukurJarakUltrasonik();
// OUTPUT 1: Relai menyala jika kendaraan dekat (< 15 cm)
if (jarak > 0 && jarak < 15) {
digitalWrite(RELAY_PIN, LOW); // Relai ON (Lampu sorot masuk menyala)
} else {
digitalWrite(RELAY_PIN, HIGH); // Relai OFF
}
// 2. INPUT 2: Push Button (Buka Gerbang Manual / Tombol Exit)
if (digitalRead(BUTTON_EXIT_PIN) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tombol Exit");
lcd.setCursor(0, 1);
lcd.print("Membuka Pintu...");
bipBuzzer(1, 100);
prosesBukaTutupPintu();
tampilkanLcdAwal();
}
// 3. INPUT 3: RFID Reader (Verifikasi Kartu Akses)
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String cardUID = "";
// Konversi byte UID ke string format heksadesimal
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) cardUID += "0";
cardUID += String(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) cardUID += " ";
}
cardUID.toUpperCase();
// Tampilkan UID di Serial Monitor untuk memudahkan pengecekan
Serial.print("UID Kartu Terbaca: ");
Serial.println(cardUID);
// Cek Akses Card
if (cardUID == masterCardUID) {
// AKSES DITERIMA
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses Diterima!");
lcd.setCursor(0, 1);
lcd.print("Silakan Masuk");
// OUTPUT 2 & 3: Buzzer & Servo
bipBuzzer(1, 150);
prosesBukaTutupPintu();
} else {
// AKSES DITOLAK
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses Ditolak!");
lcd.setCursor(0, 1);
lcd.print("Kartu Salah");
// OUTPUT 2: Buzzer Alarm (3 Bip Cepat)
bipBuzzer(3, 80);
delay(1000);
}
// Hentikan pembacaan kartu agar tidak loop terus menerus
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
tampilkanLcdAwal();
}
delay(50); // Delay singkat untuk stabilitas pembacaan
}
// --- FUNGSI TAMPILAN Awal ---
void tampilkanLcdAwal() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SMART GATEWAY ");
lcd.setCursor(0, 1);
lcd.print("Tempelkan Kartu");
}
// --- FUNGSI UKUR JARAK ULTRASONIK ---
long ukurJarakUltrasonik() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durasi = pulseIn(ECHO_PIN, HIGH, 25000); // Timeout 25ms agar program tidak macet jika tidak ada objek
if (durasi == 0) return 999; // Jika tidak ada pantulan
return durasi * 0.034 / 2; // Konversi ke cm
}
// --- FUNGSI EKSEKUSI PINTU (SERVO) ---
void prosesBukaTutupPintu() {
palangServo.write(90); // Output 3: Servo bergerak 90 derajat (Buka)
delay(3000); // Menunggu 3 detik
palangServo.write(0); // Servo kembali ke 0 derajat (Tutup)
}
// --- FUNGSI BUZZER ---
void bipBuzzer(int jumlah, int durasi) {
for (int i = 0; i < jumlah; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(durasi);
digitalWrite(BUZZER_PIN, LOW);
if (i < jumlah - 1) delay(durasi);
}
}Loading
mfrc522
mfrc522