• I'll try to add as much code and images as possible to see what might help figure this out.

    Here is my bare bones Arduino Code. It should receive the value from the Puck and then if it matches, send a value back.

    [#include](https://forum.espruino.com/search/?q=%23include) <Arduino.h>
    [#include](https://forum.espruino.com/search/?q=%23include) <SPI.h>
    [#include](https://forum.espruino.com/search/?q=%23include) "Adafruit_BLE.h"
    [#include](https://forum.espruino.com/search/?q=%23include) "Adafruit_BluefruitLE_SPI.h"
    [#include](https://forum.espruino.com/search/?q=%23include) "Adafruit_BluefruitLE_UART.h"
    [#include](https://forum.espruino.com/search/?q=%23include) "BluefruitConfig.h"
    
    [#if](https://forum.espruino.com/search/?q=%23if) SOFTWARE_SERIAL_AVAILABLE
      [#include](https://forum.espruino.com/search/?q=%23include) <SoftwareSerial.h>
    [#endif](https://forum.espruino.com/search/?q=%23endif)
    
    [#define](https://forum.espruino.com/search/?q=%23define) FACTORYRESET_ENABLE         1
    [#define](https://forum.espruino.com/search/?q=%23define) MINIMUM_FIRMWARE_VERSION    "0.6.6"
    [#define](https://forum.espruino.com/search/?q=%23define) MODE_LED_BEHAVIOUR          "MODE"
    [#define](https://forum.espruino.com/search/?q=%23define) LED_BUILTIN                 13
    
    Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
    
    void error(const __FlashStringHelper* err) {
      Serial.println(err);
      while (1);
    }
    
    int incomingByte = 0;
    String readString;
    
    void setup() {
      pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(9600);
      Serial.println();
    
      Serial.println("Setting beacon configuration details: ");
      Serial.println("---------------------------------------");
    
      if (!ble.begin(VERBOSE_MODE)) {
        error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
      }
    
      if (FACTORYRESET_ENABLE) {
        Serial.println(F("Performing a factory reset: "));
        if (!ble.factoryReset()) {
          error(F("Couldn't factory reset"));
        }
      }
    
      ble.echo(false);
      Serial.println("Requesting Bluefruit info:");
      ble.info();
      Serial.println();
    
      ble.verbose(false);
    
      Serial.println(F("Setting device name to 'Splitz Start Beacon'"));
      if (!ble.sendCommandCheckOK(F("AT+GAPDEVNAME=Splitz Start Beacon"))) {
        error(F("Could not set device name?"));
      }
    
      Serial.println(F("Switching to DATA mode!"));
      ble.setMode(BLUEFRUIT_MODE_DATA);
    
      while (!ble.isConnected()) {
        delay(500);
      }
    
      if (ble.isConnected()) {
        Serial.println(F("BLE device is connected."));
      }
    }
    
    void loop() {
      if (ble.available()) {
        char input[64];
        int len = ble.readBytesUntil('\n', input, sizeof(input)-1);
        input[len] = 0;
        
        Serial.print(F("Received: "));
        Serial.println(input);
    
        if (strcmp(input, "hi") == 0) {
          Serial.println(F("Sending reply: hello"));
          ble.println("hello");
          // Write to the characteristic
          ble.sendCommandCheckOK(("AT+GATTCHAR=1,hello"));
        }
      }
    }
    

    The first image is the Serial response.

    This is the code I have for the Puck.

    // Blink green for 100ms
    function blinkGreen() {
      LED2.write(true);
      setTimeout(function () { LED2.write(false); }, 100);
    }
    
    // Variables
    var feather = "ff:8d:05:ae:17:64 random";
    let gattServer;
    
    // UART Service UUID
    const UART_SERVICE_UUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
    // UART RX Characteristic UUID (for sending data to the Arduino)
    const UART_RX_CHARACTERISTIC_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E";
    // UART TX Characteristic UUID (for receiving data from the Arduino)
    const UART_TX_CHARACTERISTIC_UUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E";
    
    // Function to connect and send data
    function connectAndSend() {
      console.log("Trying to connect to Arduino Board.");
      NRF.requestDevice({ filters: [{ id: feather }], active: true })
        .then(function(device) {
          console.log("Connecting to device...");
          return device.gatt.connect();
        })
        .then(function(gatt) {
          console.log("Connected to GATT server");
          gattServer = gatt;
          return gatt.getPrimaryService(UART_SERVICE_UUID);
        })
        .then(function(service) {
          console.log("Got UART service");
          return service.getCharacteristic(UART_RX_CHARACTERISTIC_UUID);
        })
        .then(function(characteristic) {
          console.log("Got RX characteristic, sending 'hi'...");
          return characteristic.writeValue("hi");
        })
        .then(function() {
          console.log("Message sent successfully");
          blinkGreen();
          return gattServer.getPrimaryService(UART_SERVICE_UUID);
        })
        .then(function(service) {
          console.log("Setting up TX Service...");
          return service.getCharacteristic(UART_TX_CHARACTERISTIC_UUID);
        }).then(function(characteristic) {
          console.log("Setting up listener for incoming data");
          characteristic.on('characteristicvaluechanged', function(event) {
            console.log("RX: "+JSON.stringify(event.target.value.buffer));
          });
          return characteristic.startNotifications();
        })
        .catch(function(error) {
          console.log("Error: " + error);
        });
    }
    
    // Function to disconnect
    function disconnect() {
      if (gattServer && gattServer.connected) {
        gattServer.disconnect();
        console.log("Disconnected");
      }
    }
    
    // Button press to initiate connection and sending
    setWatch(connectAndSend, BTN, {edge:"rising", repeat:true, debounce:50});
    

    The 2nd image is the output I receive. Even if I move the TX handle to before the RX , I still get a CCCD error.

    I also just added log to the Primary, RX, and TX return so that we can see what is being returned.

    Trying to connect to Arduino Board.
    Connecting to device...
    Connected to GATT server
    Got UART service
    BluetoothRemoteGATTService: {
      "device": BluetoothDevice: {
        "id": "ff:8d:05:ae:17:64 random",
        "rssi": -61,
        "data": new Uint8Array([2, 1, 6, 2, 10, 0, 17, 6, 158, 202, 220, 36, 14, 229, 169, 224, 147, 243, 163, 181, 1, 0, 64, 110]).buffer,
        "services": [
          "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
         ],
        "gatt": BluetoothRemoteGATTServer: {
          "device":  ... ,
          "connected": true, "handle": 1 }
       },
      "uuid": "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
      "isPrimary": true, "start_handle": 31, "end_handle": 65535 }
     
    Got RX characteristic, sending 'hi'...
    BluetoothRemoteGATTCharacteristic: {
      "service": BluetoothRemoteGATTService: {
        "device": BluetoothDevice: {
          "id": "ff:8d:05:ae:17:64 random",
          "rssi": -61,
          "data": new Uint8Array([2, 1, 6, 2, 10, 0, 17, 6, 158, 202, 220, 36, 14, 229, 169, 224, 147, 243, 163, 181, 1, 0, 64, 110]).buffer,
          "services": [
    "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
           ],
          "gatt": BluetoothRemoteGATTServer: {
    "device":  ... ,
    "connected": true, "handle": 1 }
         },
        "uuid": "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
        "isPrimary": true, "start_handle": 31, "end_handle": 65535 },
      "uuid": "6e400002-b5a3-f393-e0a9-e50e24dcca9e",
      "handle_value": 37, "handle_decl": 36,
      "properties": { "broadcast": false, "read": false, "writeWithoutResponse": true, "write": true,
        "notify": false, "indicate": false, "authenticatedSignedWrites": false }
     }
     
    Setting up TX Service...
    BluetoothRemoteGATTCharacteristic: {
      "service": BluetoothRemoteGATTService: {
        "device": BluetoothDevice: {
          "id": "ff:8d:05:ae:17:64 random",
          "rssi": -61,
          "data": new Uint8Array([2, 1, 6, 2, 10, 0, 17, 6, 158, 202, 220, 36, 14, 229, 169, 224, 147, 243, 163, 181, 1, 0, 64, 110]).buffer,
          "services": [
    "6e400001-b5a3-f393-e0a9-e50e24dcca9e"
           ],
          "gatt": BluetoothRemoteGATTServer: {
    "device":  ... ,
    "connected": true, "handle": 1 }
         },
        "uuid": "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
        "isPrimary": true, "start_handle": 31, "end_handle": 65535 },
      "uuid": "6e400003-b5a3-f393-e0a9-e50e24dcca9e",
      "handle_value": 33, "handle_decl": 32,
      "properties": { "broadcast": false, "read": false, "writeWithoutResponse": false, "write": false,
        "notify": true, "indicate": false, "authenticatedSignedWrites": false }
     }
     
    Setting up listener for incoming data
    Error: CCCD Handle not found
    

    2 Attachments

    • Screenshot 2024-09-28 at 7.34.50.png
    • Screenshot 2024-09-28 at 7.30.54.png
About

Avatar for user158306 @user158306 started