#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 🔹 OLED
Adafruit_SSD1306 lcd(128, 64, &Wire, -1);
// 🔹 WiFi (Wokwi)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// 🔹 MQTT
const char* mqtt_server = "broker.emqx.io";
// 🔹 Pins capteur A
#define TRIG_A 5
#define ECHO_A 18
// 🔹 Servo
#define SERVO_PIN 13
Servo myServo;
// 🔹 MQTT
WiFiClient espClient;
PubSubClient client(espClient);
// 🔹 Etat
bool lastState = false;
// 🔹 Fonction distance
long readDistance(int trig, int echo) {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
return pulseIn(echo, HIGH) * 0.034 / 2;
}
// 🔹 Affichage OLED
void displayOLED(String line1, String line2) {
lcd.clearDisplay();
lcd.setTextSize(1);
lcd.setTextColor(SSD1306_WHITE);
lcd.setCursor(0, 0);
lcd.println(line1);
lcd.setCursor(0, 16);
lcd.println(line2);
lcd.display();
}
// 🔹 WiFi
void setup_wifi() {
Serial.print("Connexion WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("\nWiFi connecté !");
}
// 🔹 MQTT callback
void callback(char* topic, byte* payload, unsigned int length) {
String msg = "";
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
Serial.print("MQTT reçu: ");
Serial.println(msg);
if (String(topic) == "parking/barriere/cmd") {
if (msg == "OPEN") {
myServo.write(90);
} else if (msg == "CLOSE") {
myServo.write(0);
}
}
}
// 🔹 MQTT reconnect
void reconnect() {
while (!client.connected()) {
Serial.print("Connexion MQTT...");
if (client.connect("ESP32ClientZainab")) {
Serial.println("OK");
client.subscribe("parking/barriere/cmd");
} else {
Serial.println("Erreur...");
delay(2000);
}
}
}
// 🔹 Setup
void setup() {
Serial.begin(115200);
pinMode(TRIG_A, OUTPUT);
pinMode(ECHO_A, INPUT);
// Servo
myServo.attach(SERVO_PIN);
myServo.write(0);
// OLED
if (!lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED non trouvé !");
while (true);
}
displayOLED("Smart Parking", "Initialisation...");
delay(2000);
// WiFi + MQTT
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// 🔹 Loop
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long distance = readDistance(TRIG_A, ECHO_A);
bool currentState = (distance < 10);
// 🔹 MQTT envoi si changement
if (currentState != lastState) {
if (currentState) {
client.publish("parking/placeA/status", "occupee");
Serial.println("Etat: OCCUPEE");
} else {
client.publish("parking/placeA/status", "libre");
Serial.println("Etat: LIBRE");
}
lastState = currentState;
}
// 🔹 OLED affichage
if (currentState) {
displayOLED("Place A:", "OCCUPEE");
} else {
displayOLED("Place A:", "LIBRE");
}
delay(500);
}