#include <WiFi.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
/\* ================= CONFIG ================= \*/
const char\* ssid = "Genista-Guests";
const char\* password = "Gen45-Band75!Gu23";
WiFiServer server(80);
/\* ================= BLE ================= \*/
#define SERVICE_UUID "12345678-1234-1234-1234-1234567890ab"
#define CHARACTERISTIC_UUID "abcd1234-5678-90ab-cdef-1234567890ab"
#define LED_PIN 2
BLECharacteristic\* pCharacteristic;
String lastBLEMessage = "Aucun message";
bool deviceConnected = false;
/\* ================= MOTOR ================= \*/
// ---- PINS ----
#define IN1 4
#define IN2 5
#define IN3 6
#define IN4 7
#define ENA 15
#define ENB 16
// ---- SPEED ----
int motorSpeed = 150;
/\* ===================================================== \*/
/\* MOTOR FUNCTIONS \*/
/\* ===================================================== \*/
void stopMotors() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
void avancer() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
}
void reculer() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
}
void tournerGauche() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
}
void tournerDroite() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, motorSpeed);
analogWrite(ENB, motorSpeed);
}
/\* ===================================================== \*/
/\* BLE CALLBACKS \*/
/\* ===================================================== \*/
class ServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer\* pServer) override {
deviceConnected = true;
Serial.println(">>> BLE CLIENT CONNECTE");
}
void onDisconnect(BLEServer\* pServer) override {
deviceConnected = false;
Serial.println(">>> BLE CLIENT DECONNECTE");
}
};
class CharacteristicCallbacks : public BLECharacteristicCallbacks {
void handleCommand(String value) {
if (value == "HELLO") {
pCharacteristic->setValue("Bonjour utilisateur 😎");
}
else if (value == "STATUS") {
pCharacteristic->setValue("WiFi OK | BLE OK");
}
else if (value == "LED_ON") {
digitalWrite(LED_PIN, HIGH);
pCharacteristic->setValue("LED ALLUMEE");
}
else if (value == "LED_OFF") {
digitalWrite(LED_PIN, LOW);
pCharacteristic->setValue("LED ETEINTE");
}
// 🔥 COMMANDES MOTEUR
else if (value == "F") {
avancer();
}
else if (value == "B") {
reculer();
}
else if (value == "L") {
tournerGauche();
}
else if (value == "R") {
tournerDroite();
}
else if (value == "STOP") {
stopMotors();
}
else {
pCharacteristic->setValue("Commande inconnue");
}
}
void onWrite(BLECharacteristic\* characteristic) override {
String value = characteristic->getValue();
Serial.print("Recu brut: \[");
Serial.print(value);
Serial.println("\]");
value.trim();
value.replace("\\x01", "");
value.replace("\\x02", "");
value.replace("\\x03", "");
value.replace("t0", "");
value.replace("T0", "");
value.trim();
value.toUpperCase();
Serial.print("Apres nettoyage: \[");
Serial.print(value);
Serial.println("\]");
lastBLEMessage = value;
handleCommand(value);
}
};
/\* ===================================================== \*/
/\* SETUP \*/
/\* ===================================================== \*/
void setup() {
Serial.begin(115200);
// MOTOR PINS
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(LED_PIN, OUTPUT);
/\* -------- WIFI -------- \*/
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connexion WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\\nWiFi Connecte !");
Serial.println(WiFi.localIP());
server.begin();
/\* -------- BLE -------- \*/
BLEDevice::init("ESP-32-PROJECT");
BLEServer\* pServer = BLEDevice::createServer();
pServer->setCallbacks(new ServerCallbacks());
BLEService\* pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pCharacteristic->setCallbacks(new CharacteristicCallbacks());
pCharacteristic->setValue("READY");
pService->start();
BLEAdvertising\* advertising = BLEDevice::getAdvertising();
advertising->addServiceUUID(SERVICE_UUID);
advertising->start();
Serial.println("BLE Service Pret !");
}
/\* ===================================================== \*/
/\* LOOP \*/
/\* ===================================================== \*/
void handleWebServer() {
WiFiClient client = server.available();
if (!client) return;
client.setTimeout(10);
client.readStringUntil('\\r');
client.flush();
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
client.println("<html><body>");
client.println("<h1>IoT Dashboard</h1>");
client.println("<p><b>Etat BLE :</b> ");
client.println(deviceConnected ? "Connecte" : "Deconnecte");
client.println("</p>");
client.println("<p><b>Dernier message BLE :</b> ");
client.println(lastBLEMessage);
client.println("</p>");
client.println("<p><b>IP :</b> ");
client.println(WiFi.localIP());
client.println("</p>");
client.println("</body></html>");
client.stop();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.reconnect();
}
handleWebServer();
delay(5);
}