#include #include #include #include #include // CONFIGURATION #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" #define RX_UUID "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" #define TX_UUID "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" #define NEOPIXEL_PIN D10 #define NUM_PIXELS 5 // GLOBAL OBJECTS Adafruit_NeoPixel pixel(NUM_PIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800); BLECharacteristic *txCharacteristic; bool deviceConnected = false; int currentLEDCount = 0; // FUNCTION DECLARED FIRST void updateLEDs(int count) { for(int i = 0; i < NUM_PIXELS; i++) { pixel.setPixelColor(i, pixel.Color(0, 0, 0)); } for(int i = 0; i < count; i++) { pixel.setPixelColor(i, pixel.Color(255, 0, 0)); } pixel.show(); Serial.print("LEDs lit: "); Serial.println(count); } // BLE CALLBACKS class ServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected = true; Serial.println("Phone connected!"); } void onDisconnect(BLEServer* pServer) { deviceConnected = false; Serial.println("Phone disconnected"); } }; class RXCallbacks: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *characteristic) { String value = characteristic->getValue(); Serial.print("Received: "); Serial.println(value); int ledCount = value.toInt(); if (ledCount < 0) ledCount = 0; if (ledCount > NUM_PIXELS) ledCount = NUM_PIXELS; currentLEDCount = ledCount; updateLEDs(currentLEDCount); char confirmMsg[20]; sprintf(confirmMsg, "LEDs: %d", currentLEDCount); txCharacteristic->setValue(confirmMsg); txCharacteristic->notify(); } }; // SETUP void setup() { Serial.begin(115200); pixel.begin(); pixel.setBrightness(50); pixel.show(); BLEDevice::init("XIAO_C3_BLE"); BLEServer *server = BLEDevice::createServer(); server->setCallbacks(new ServerCallbacks()); BLEService *service = server->createService(SERVICE_UUID); txCharacteristic = service->createCharacteristic( TX_UUID, BLECharacteristic::PROPERTY_NOTIFY ); txCharacteristic->addDescriptor(new BLE2902()); BLECharacteristic *rxCharacteristic = service->createCharacteristic( RX_UUID, BLECharacteristic::PROPERTY_WRITE ); rxCharacteristic->setCallbacks(new RXCallbacks()); service->start(); server->getAdvertising()->start(); Serial.println("BLE Ready! Connect to 'XIAO_C3_BLE'"); } // LOOP void loop() { delay(10); }