#include #include #include #include // -------------------- // Pin definition / Definición de pines // -------------------- #define BUTTON1 D4 #define BUTTON2 D6 // -------------------- // BLE UUIDs (custom service and characteristic) // UUIDs BLE (servicio y característica personalizados) // -------------------- #define SERVICE_UUID "12345678-1234-1234-1234-1234567890ab" #define CHARACTERISTIC_UUID "abcdefab-1234-1234-1234-abcdefabcdef" // Pointer to the BLE characteristic / Puntero a la característica BLE BLECharacteristic *pCharacteristic; // Flag to know if a device is connected / Flag para saber si hay dispositivo conectado bool deviceConnected = false; // Previous states for edge detection / Estados anteriores para detectar cambios int lastState1 = HIGH; int lastState2 = HIGH; // -------------------- // BLE connection callbacks / Callbacks de conexión BLE // -------------------- class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected = true; Serial.println("iPhone connected / iPhone conectado"); } void onDisconnect(BLEServer* pServer) { deviceConnected = false; Serial.println("iPhone disconnected / iPhone desconectado"); // Restart advertising so it can reconnect // Reiniciar advertising para permitir reconexión BLEDevice::startAdvertising(); Serial.println("Advertising restarted / Advertising reiniciado"); } }; // -------------------- // Function to send BLE message / Función para enviar mensaje BLE // -------------------- void sendBLEMessage(const char *message) { Serial.print("Sending: / Enviando: "); Serial.println(message); // Set the value of the characteristic // Asignar valor a la característica pCharacteristic->setValue(message); // Send notification if device is connected // Enviar notificación si hay dispositivo conectado if (deviceConnected) { pCharacteristic->notify(); } } // -------------------- // Setup / Configuración inicial // -------------------- void setup() { Serial.begin(115200); delay(1000); // Configure buttons with internal pull-up // Configurar botones con resistencia pull-up interna pinMode(BUTTON1, INPUT_PULLUP); pinMode(BUTTON2, INPUT_PULLUP); // -------------------- // BLE initialization / Inicialización BLE // -------------------- BLEDevice::init("XIAO-ESP32C6-BLE"); // Create BLE server / Crear servidor BLE BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // Create BLE service / Crear servicio BLE BLEService *pService = pServer->createService(SERVICE_UUID); // Create BLE characteristic with READ + NOTIFY // Crear característica BLE con READ + NOTIFY pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY ); // Add descriptor so phone can enable notifications // Añadir descriptor para que el móvil pueda activar notificaciones pCharacteristic->addDescriptor(new BLE2902()); // Initial value / Valor inicial pCharacteristic->setValue("Waiting..."); // Start service / Iniciar servicio pService->start(); // Start advertising / Iniciar advertising BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->start(); Serial.println("BLE ready / BLE listo"); Serial.println("Device name: XIAO-ESP32C6-BLE"); } // -------------------- // Loop / Bucle principal // -------------------- void loop() { // Read current button states // Leer estado actual de los botones int currentState1 = digitalRead(BUTTON1); int currentState2 = digitalRead(BUTTON2); // Detect press on Button 1 (HIGH → LOW) // Detectar pulsación en botón 1 (HIGH → LOW) if (lastState1 == HIGH && currentState1 == LOW) { sendBLEMessage("BUTTON 1"); delay(200); // simple debounce / anti-rebote } // Detect press on Button 2 (HIGH → LOW) // Detectar pulsación en botón 2 (HIGH → LOW) if (lastState2 == HIGH && currentState2 == LOW) { sendBLEMessage("BUTTON 2"); delay(200); // simple debounce / anti-rebote } // Update last states // Actualizar estados anteriores lastState1 = currentState1; lastState2 = currentState2; delay(20); }