#include #include #include #define LED1 D3 #define LED2 D5 BLECharacteristic *pCharacteristic; bool deviceConnected = false; // UUIDs (must match the ones used in the app) #define SERVICE_UUID "12345678-1234-1234-1234-123456789abc" #define CHARACTERISTIC_UUID "abcdefab-1234-1234-1234-abcdefabcdef" // Connection callbacks class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected = true; Serial.println(">>> Device CONNECTED"); }; void onDisconnect(BLEServer* pServer) { deviceConnected = false; Serial.println(">>> Device DISCONNECTED"); // Restart advertising after disconnection BLEDevice::startAdvertising(); Serial.println("Restarting advertising..."); } }; // Data reception callback class MyCallbacks: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { String value = pCharacteristic->getValue(); if (value.length() > 0) { char cmd = value[0]; Serial.print("Received: "); Serial.println(cmd); switch(cmd) { case 'A': digitalWrite(LED1, HIGH); break; case 'B': digitalWrite(LED1, LOW); break; case 'C': digitalWrite(LED2, HIGH); break; case 'D': digitalWrite(LED2, LOW); break; } } } }; void setup() { Serial.begin(115200); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); // Initialize BLE BLEDevice::init("XIAO_LED"); Serial.println("=== BLE READY ==="); Serial.println("Device name: XIAO_LED"); Serial.print("MAC: "); Serial.println(BLEDevice::getAddress().toString().c_str()); Serial.println("Waiting for connection..."); // Create BLE server BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // Create BLE service BLEService *pService = pServer->createService(SERVICE_UUID); // Create BLE characteristic pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_WRITE ); pCharacteristic->setCallbacks(new MyCallbacks()); // Start service pService->start(); // Start advertising BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->start(); } void loop() { // Nothing required here }