#include #define LED_CENTRAL D10 #define BUTTON_CENTRAL D9 BLEClientService controlService(0x1234); BLEClientCharacteristic ledChar(0x5678); // Controla LED del peripheral BLEClientCharacteristic buttonChar(0x9ABC); // Lee botón del peripheral bool lastCentralButtonState = HIGH; bool isConnecting = false; bool charsReady = false; uint8_t lastRemoteButton = 0; void connect_callback(uint16_t conn_handle) { isConnecting = false; charsReady = false; if (!controlService.discover(conn_handle)) { Bluefruit.disconnect(conn_handle); return; } if (!ledChar.discover()) { Bluefruit.disconnect(conn_handle); return; } if (!buttonChar.discover()) { Bluefruit.disconnect(conn_handle); return; } charsReady = true; } void disconnect_callback(uint16_t conn_handle, uint8_t reason) { charsReady = false; digitalWrite(LED_CENTRAL, LOW); delay(300); Bluefruit.Scanner.start(0); } void scan_callback(ble_gap_evt_adv_report_t* report) { if (isConnecting) return; if (Bluefruit.Scanner.checkReportForService(report, controlService)) { isConnecting = true; Bluefruit.Scanner.stop(); Bluefruit.Central.connect(report); } else { Bluefruit.Scanner.resume(); } } void setup() { pinMode(LED_CENTRAL, OUTPUT); digitalWrite(LED_CENTRAL, LOW); pinMode(BUTTON_CENTRAL, INPUT_PULLUP); Bluefruit.begin(0, 1); Bluefruit.setTxPower(4); Bluefruit.setName("XIAO_CENTRAL"); Bluefruit.Central.setConnectCallback(connect_callback); Bluefruit.Central.setDisconnectCallback(disconnect_callback); controlService.begin(); ledChar.begin(); buttonChar.begin(); Bluefruit.Scanner.setRxCallback(scan_callback); Bluefruit.Scanner.restartOnDisconnect(true); Bluefruit.Scanner.setInterval(160, 80); Bluefruit.Scanner.useActiveScan(true); Bluefruit.Scanner.start(0); } void loop() { if (!charsReady || !Bluefruit.connected()) return; // Botón del central controla LED del peripheral bool currentCentralButtonState = digitalRead(BUTTON_CENTRAL); if (currentCentralButtonState != lastCentralButtonState) { delay(25); currentCentralButtonState = digitalRead(BUTTON_CENTRAL); if (currentCentralButtonState != lastCentralButtonState) { lastCentralButtonState = currentCentralButtonState; uint8_t pressed = (currentCentralButtonState == LOW) ? 1 : 0; ledChar.write8(pressed); } } // Botón del peripheral controla LED del central uint8_t remoteButton = 0; if (buttonChar.read(&remoteButton, 1)) { if (remoteButton != lastRemoteButton) { lastRemoteButton = remoteButton; digitalWrite(LED_CENTRAL, remoteButton ? HIGH : LOW); } } delay(20); }