Hi can you help me to finish my app.
I'm a beginner but I managed to connect to my esp32. I would like to change my angle with a slider :
But I can't do it.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>
#include <Adafruit_NeoPixel.h>
// UUIDs BLE
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID_OUVRIR "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define CHARACTERISTIC_UUID_FERMER "beb5483e-36e1-4688-b7f5-ea07361b26a9"
#define CHARACTERISTIC_UUID_ANGLE_MAX "beb5483e-36e1-4688-b7f5-ea07361b26ae" // Nouvelle caractéristique pour l'angle maximum
#define CHARACTERISTIC_UUID_TEMPS "beb5483e-36e1-4688-b7f5-ea07361b26aa"
#define CHARACTERISTIC_UUID_EFFET "beb5483e-36e1-4688-b7f5-ea07361b26ab"
#define CHARACTERISTIC_UUID_MODE_AUTO "beb5483e-36e1-4688-b7f5-ea07361b26ac" // Nouveau UUID pour mode auto
// Définition des pins
#define SERVO_PIN 13
#define LED_PIN 12
#define NUM_LEDS 8
// Variables d'état
bool irisOuverte = false;
unsigned long tempsOuverture = 2000;
unsigned long tempsFermeture = 2000;
String effetLED = "degrade";
// Mode automatique
bool modeAuto = false;
unsigned long lastChangeTime = 0;
bool isCycleOpen = true;
const unsigned long AUTO_OPEN_TIME = 8000; // 8s ouvert
const unsigned long AUTO_CLOSE_TIME = 3000; // 3s fermé
// Servo et LEDs
Servo irisServo;
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// Angle max initialisé à 180
int angleMax = 180;
// Fonction pour gérer la couleur des LEDs
void setStripColor(uint8_t r, uint8_t g, uint8_t b) {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(r, g, b));
}
strip.show();
}
// Fonctions d'ouverture/fermeture
void ouvrirIris() {
Serial.println("Ouverture de l'iris...");
irisServo.write(angleMax); // Utilise l'angle maximum défini
irisOuverte = true;
setStripColor(0, 255, 0); // Vert
}
void fermerIris() {
Serial.println("Fermeture de l'iris...");
irisServo.write(0); // Angle 0 pour fermer
irisOuverte = false;
setStripColor(255, 0, 0); // Rouge
}
// Callback BLE
class MyCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) override {
String rawValue = pCharacteristic->getValue().c_str();
String rawUUID = pCharacteristic->getUUID().toString().c_str();
if (rawUUID == CHARACTERISTIC_UUID_OUVRIR) {
if (rawValue == "ouvrir") ouvrirIris();
} else if (rawUUID == CHARACTERISTIC_UUID_FERMER) {
if (rawValue == "fermer") fermerIris();
} else if (rawUUID == CHARACTERISTIC_UUID_ANGLE_MAX) {
angleMax = rawValue.toInt();
Serial.println("Angle maximum mis à jour : " + String(angleMax));
} else if (rawUUID == CHARACTERISTIC_UUID_TEMPS) {
int separatorIndex = rawValue.indexOf('|');
if (separatorIndex != -1) {
tempsOuverture = rawValue.substring(0, separatorIndex).toInt();
tempsFermeture = rawValue.substring(separatorIndex + 1).toInt();
Serial.println("Temps mis à jour : Ouverture = " + String(tempsOuverture) + " ms, Fermeture = " + String(tempsFermeture) + " ms");
}
} else if (rawUUID == CHARACTERISTIC_UUID_EFFET) {
effetLED = rawValue;
Serial.println("Effet LED mis à jour : " + effetLED);
} else if (rawUUID == CHARACTERISTIC_UUID_MODE_AUTO) {
modeAuto = (rawValue == "on");
Serial.println("Mode automatique : " + String(modeAuto ? "Activé" : "Désactivé"));
}
}
};
void setup() {
Serial.begin(115200);
// Initialisation du Servo
irisServo.attach(SERVO_PIN);
// Initialisation LEDs WS2812
strip.begin();
strip.show();
strip.setBrightness(50);
// Initialisation BLE
BLEDevice::init("IrisController");
Serial.println("Adresse MAC ESP32 : " + String(BLEDevice::getAddress().toString().c_str()));
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
// Création des caractéristiques BLE
BLECharacteristic *pCharacteristicOuvrir = pService->createCharacteristic(
CHARACTERISTIC_UUID_OUVRIR, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicOuvrir->setCallbacks(new MyCallbacks());
BLECharacteristic *pCharacteristicFermer = pService->createCharacteristic(
CHARACTERISTIC_UUID_FERMER, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicFermer->setCallbacks(new MyCallbacks());
BLECharacteristic *pCharacteristicAngleMax = pService->createCharacteristic(
CHARACTERISTIC_UUID_ANGLE_MAX, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicAngleMax->setCallbacks(new MyCallbacks());
BLECharacteristic *pCharacteristicTemps = pService->createCharacteristic(
CHARACTERISTIC_UUID_TEMPS, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicTemps->setCallbacks(new MyCallbacks());
BLECharacteristic *pCharacteristicEffet = pService->createCharacteristic(
CHARACTERISTIC_UUID_EFFET, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicEffet->setCallbacks(new MyCallbacks());
BLECharacteristic *pCharacteristicModeAuto = pService->createCharacteristic(
CHARACTERISTIC_UUID_MODE_AUTO, BLECharacteristic::PROPERTY_WRITE);
pCharacteristicModeAuto->setCallbacks(new MyCallbacks());
// Démarrer le service BLE
pService->start();
pServer->getAdvertising()->start();
Serial.println("BLE prêt !");
}
void loop() {
if (modeAuto) {
unsigned long currentTime = millis();
if (isCycleOpen && (currentTime - lastChangeTime >= AUTO_OPEN_TIME)) {
fermerIris();
lastChangeTime = currentTime;
isCycleOpen = false;
}
else if (!isCycleOpen && (currentTime - lastChangeTime >= AUTO_CLOSE_TIME)) {
ouvrirIris();
lastChangeTime = currentTime;
isCycleOpen = true;
}
}
}
IRIS_SMR_GATE_BLE.aia (201.3 KB)