// === Identifiants Blynk (à personnaliser) ===
#define BLYNK_TEMPLATE_ID "TMPL2u4zhdMJr"
#define BLYNK_TEMPLATE_NAME "ControleAccesRFID"
#define BLYNK_AUTH_TOKEN "937S-o2leZSfAMP2XTmc74EmBG04n-hf"
#include <Arduino.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// === Réseau Wi-Fi Wokwi ===
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// === Broches physiques ===
#define BUZZER_PIN 14
#define GREEN_LED 26
#define RED_LED 27
#define RELAY_PIN 12
#define SERVO_PIN 13
Servo myServo;
// === Pins virtuels Blynk ===
#define VIRTUAL_INPUT V0 // Champ texte pour e-KTP
#define VIRTUAL_UNLOCK V1 // Bouton manuel
String receivedID = "";
// === SETUP ===
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RED_LED, LOW);
digitalWrite(RELAY_PIN, LOW);
myServo.attach(SERVO_PIN);
myServo.write(0); // Porte fermée
Serial.println("Système prêt avec Blynk !");
}
// === Lecture du champ texte V0 (e-KTP) ===
BLYNK_WRITE(VIRTUAL_INPUT) {
receivedID = param.asString();
receivedID.trim();
if (isValidFormat(receivedID)) {
if (receivedID.equals("12 34 56 78")) {
accessGranted();
} else {
accessDenied();
}
} else {
Serial.println(" Format invalide reçu !");
Blynk.virtualWrite(V0, "Format: XX XX XX XX");
}
}
// === Bouton manuel V1 ===
BLYNK_WRITE(VIRTUAL_UNLOCK) {
int state = param.asInt();
if (state == 1) {
accessGranted();
}
}
// === LOOP PRINCIPALE ===
void loop() {
Blynk.run();
}
// === Vérifie le format "XX XX XX XX" ===
bool isValidFormat(String input) {
if (input.length() == 11 && input.charAt(2) == ' ' && input.charAt(5) == ' ' && input.charAt(8) == ' ') {
for (int i = 0; i < input.length(); i++) {
if (i != 2 && i != 5 && i != 8 && !isDigit(input.charAt(i))) {
return false;
}
}
return true;
}
return false;
}
// === Accès autorisé ===
void accessGranted() {
Serial.println(" Accès autorisé !");
Blynk.logEvent("access_granted", "Ouverture autorisée via e-KTP ou bouton");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RELAY_PIN, HIGH);
myServo.write(40); // Ouvre la porte (angle 40° ou 90° selon servo)
delay(5000);
myServo.write(0); // Ferme
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(RELAY_PIN, LOW);
}
// === Accès refusé ===
void accessDenied() {
Serial.println("Accès refusé !");
Blynk.logEvent("access_denied", "e-KTP non reconnu");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(RED_LED, HIGH);
delay(5000);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RED_LED, LOW);
}