#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// codice server
#define SERVICE_UUID "79c79196-51cb-4f67-9520-9bc63e6597c1"
#define CHARACTERISTIC_UUID "e3038128-ca03-4f22-9f0d-b6547426dc6a"
#define led_Sinistra 2
#define led_Destra 4
#define led_Su 5
#define led_Giu 13
#define led_Fuoco 12
#define led_Connessione 14 // sesto LED
BLEServer *pServer;
BLEService *pService;
BLECharacteristic *pCharacteristic;
bool connected = false;
unsigned long previousMillis = 0;
const long interval = 100; // Intervallo di lampeggiamento in millisecondi
bool ledState = false;
void setup()
{
Serial.begin(115200);
Serial.println("Avvio del Server BLE!");
BLEDevice::init("ESP32-BLE-Server");
pServer = BLEDevice::createServer();
pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pinMode(led_Sinistra, OUTPUT);
pinMode(led_Destra, OUTPUT);
pinMode(led_Su, OUTPUT);
pinMode(led_Giu, OUTPUT);
pinMode(led_Fuoco, OUTPUT);
pinMode(led_Connessione, OUTPUT); // sesto LED
pCharacteristic->setValue("In attesa del segnale!");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06);
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("Caratteristica definita! Ora puoi leggerla nel Client!");
}
void loop()
{
unsigned long currentMillis = millis();
if (connected)
{
// Accendi il sesto LED se connesso al client giusto con caratteristica corretta
digitalWrite(led_Connessione, HIGH);
}
else
{
// Lampeggia il sesto LED se non connesso al client giusto con caratteristica corretta
if (currentMillis - previousMillis >= interval)
{
// Inverti lo stato del LED
ledState = !ledState;
digitalWrite(led_Connessione, ledState ? HIGH : LOW);
// Aggiorna il tempo precedente
previousMillis = currentMillis;
}
}
std::string value = pCharacteristic->getValue();
Serial.print("Il nuovo valore della caratteristica è: ");
Serial.println(value.c_str());
if (value == "sinistra")
{
digitalWrite(led_Sinistra, HIGH);
}
else if (value == "destra")
{
digitalWrite(led_Destra, HIGH);
}
else if (value == "su")
{
digitalWrite(led_Su, HIGH);
}
else if (value == "giù")
{
digitalWrite(led_Giu, HIGH);
}
else if (value == "fuoco")
{
digitalWrite(led_Fuoco, HIGH);
}
digitalWrite(led_Sinistra, LOW);
digitalWrite(led_Destra, LOW);
digitalWrite(led_Su, LOW);
digitalWrite(led_Giu, LOW);
digitalWrite(led_Fuoco, LOW);
delay(10); // Aggiungi un piccolo ritardo per evitare letture troppo frequenti dalla caratteristica BLE
}