#include <WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <MFRC522.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --- KONFIGURASI WIFI & MQTT ---
// Jika di Wokwi: ssid = "Wokwi-GUEST", password = ""
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io"; // INI YANG TADI ERROR (SUDAH DITAMBAHKAN)
// --- KONFIGURASI PIN ---
#define SCK_PIN 18
#define MISO_PIN 19
#define MOSI_PIN 23
#define SS_PIN 5
#define RST_PIN 15
#define LED_G 12
#define LED_R 14
#define SERVO_PIN 13
#define BUZZER_PIN 4
// Inisialisasi Objek
WiFiClient espClient;
PubSubClient client(espClient);
MFRC522 rfid(SS_PIN, RST_PIN);
Servo myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
String authorizedUID = "D3 4B 12 A2";
void setup_wifi() {
delay(10);
Serial.println("\nConnecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (String(topic) == "pintu/kontrol") {
if (message == "BUKA") {
aksesDiterima("Remote MQTTX");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32_SmartDoor_Client")) {
Serial.println("connected");
client.subscribe("pintu/kontrol");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883); // Sekarang variabel ini sudah terdaftar
client.setCallback(callback);
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);
rfid.PCD_Init();
myservo.attach(SERVO_PIN);
myservo.write(0);
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
lcd.init();
lcd.backlight();
displayReady();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
return;
}
String tag = "";
for (byte i = 0; i < rfid.uid.size; i++) {
tag.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
tag.concat(String(rfid.uid.uidByte[i], HEX));
}
tag.toUpperCase();
tag.trim();
if (tag == authorizedUID) {
client.publish("pintu/status", "Akses Diterima via RFID");
aksesDiterima("Kartu RFID");
} else {
client.publish("pintu/status", ("Akses Ditolak: " + tag).c_str());
aksesDitolak();
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
displayReady();
}
void aksesDiterima(String source) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses Diterima");
lcd.setCursor(0, 1);
lcd.print("Via: " + source);
tone(BUZZER_PIN, 523); delay(150);
tone(BUZZER_PIN, 659); delay(150);
tone(BUZZER_PIN, 784); delay(150);
noTone(BUZZER_PIN);
digitalWrite(LED_G, HIGH);
myservo.write(90);
delay(5000);
lcd.clear();
lcd.print("Pintu Terkunci");
tone(BUZZER_PIN, 784); delay(150);
tone(BUZZER_PIN, 523); delay(150);
noTone(BUZZER_PIN);
myservo.write(0);
digitalWrite(LED_G, LOW);
delay(1000);
}
void aksesDitolak() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Akses Ditolak!");
lcd.setCursor(0, 1);
lcd.print("Kartu Salah");
digitalWrite(LED_R, HIGH);
tone(BUZZER_PIN, 200); delay(500);
noTone(BUZZER_PIN);
delay(1000);
digitalWrite(LED_R, LOW);
}
void displayReady() {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("SMART DOOR");
lcd.setCursor(0, 1);
lcd.print("Tempelkan Kartu");
}Loading
mfrc522
mfrc522