#include #include #include #ifndef LED_BUILTIN #define LED_BUILTIN 15 // XIAO ESP32-C6 user LED (active-LOW) #endif #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" // Handle incoming writes from the app class LEDWriteCallback : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *ch) override { // Works whether getValue() is std::string or Arduino String String value = String(ch->getValue().c_str()); if (value.length() == 0) return; value.trim();zz value.toUpperCase(); if (value == "ON" || value == "1") { digitalWrite(LED_BUILTIN, LOW); // active-LOW: LOW = ON } else if (value == "OFF" || value == "0") { digitalWrite(LED_BUILTIN, HIGH); // HIGH = OFF } } }; void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); // start OFF (active-LOW LED) BLEDevice::init("XIAO_C6_BLE_LED"); BLEServer *server = BLEDevice::createServer(); BLEService *service = server->createService(SERVICE_UUID); BLECharacteristic *ch = service->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE ); ch->setCallbacks(new LEDWriteCallback()); ch->setValue("Connected."); service->start(); BLEAdvertising *adv = BLEDevice::getAdvertising(); adv->start(); } void loop() { /* nothing needed */ }