#include <SPI.h>
#include <MFRC522.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>
#define RST_PIN 5 // GPIO5
#define SS_PIN 21 // GPIO21
#define SERVO_PIN 22 // GPIO22
// Configuration WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.mqtt-dashboard.com";
// UIDs des cartes autorisées (remplacez par les vôtres)
byte authorizedUID1[4] = {0x12, 0x34, 0x56, 0x78};
byte authorizedUID2[4] = {0x9A, 0xBC, 0xDE, 0xF0};
WiFiClient espClient;
PubSubClient client(espClient);
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo servo;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connexion à ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connecté");
Serial.println("Adresse IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Tentative de connexion MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("connecté");
} else {
Serial.print("échec, rc=");
Serial.print(client.state());
Serial.println(" nouvelle tentative dans 5 secondes");
delay(5000);
}
}
}
bool isAuthorized(byte* uid, byte* uidLength) {
if (uidLength == 4) {
for (byte i = 0; i < 4; i++) {
if (uid[i] != authorizedUID1[i] && uid[i] != authorizedUID2[i]) {
return false;
}
}
return true;
}
return false;
}
void openDoor() {
Serial.println("Ouverture de la porte");
servo.write(90); // Position ouverte
delay(3000);
servo.write(0); // Position fermée
}
void sendAlert(String message) {
if (!client.connected()) {
reconnect();
}
client.publish("smartlock/alerts", message.c_str());
Serial.println("Alerte envoyée: " + message);
}
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
servo.attach(SERVO_PIN);
servo.write(0); // Porte fermée au démarrage
setup_wifi();
client.setServer(mqtt_server, 1883);
Serial.println("Système de serrure connectée prêt");
Serial.println("En attente d'une carte RFID...");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Vérifier si une nouvelle carte est présente
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
delay(50);
return;
}
// Afficher l'UID de la carte
Serial.print("UID de la carte: ");
String uidStr = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
uidStr += String(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();
// Vérifier si la carte est autorisée
if (isAuthorized(mfrc522.uid.uidByte, mfrc522.uid.size)) {
Serial.println("Accès autorisé");
openDoor();
// Envoyer le log d'accès
String accessMsg = "Accès autorisé - Carte: " + uidStr;
client.publish("smartlock/access", accessMsg.c_str());
} else {
Serial.println("Accès refusé");
String alertMsg = "Tentative d'accès non autorisée - Carte: " + uidStr;
sendAlert(alertMsg);
}
// Arrêter la lecture
mfrc522.PICC_HaltA();
}