ArduinoBLE connection issues between two Nano 33 IoT

I am trying to connect 2 of my Arduinos Nano 33 IoT over BLE, one running the "Battery monitor" example peripheral sketch (a peripheral just waiting for connection from central), the other one running the code below. The peripheral can be found by the central, but the call to peripheral.connect() always returns false for some reason.

I am wondering what that reason might be. I tried with different boards, without success. If I connect using an mobile app LightBlue, the connection to the peripheral works.

Central code:

#include <ArduinoBLE.h>

BLECharacteristic batteryCharacteristic;

void setup() {
  Serial.begin(9600);
  while(!Serial);
  Serial.println("asdf");
  pinMode(LED_BUILTIN, OUTPUT); 

  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }
  BLE.scanForUuid("180F");
}

void loop() {

  BLEDevice peripheral = BLE.available();
  
  if (peripheral) {
    Serial.print("peripheral found,  ");
    uint8_t battery = 10;
    if (peripheral.connect()) {
      Serial.println("connected");
      batteryCharacteristic = peripheral.characteristic("2A19");
      batteryCharacteristic.readValue(battery);
      Serial.println(battery);
    }
    else {
      Serial.println("connection not succesful");
      BLE.scanForUuid("180F");
    }
  }
}

Peripheral code (from the examples):

#include <ArduinoBLE.h>

 // BLE Battery Service
BLEService batteryService("180F");

// BLE Battery Level Characteristic
BLEUnsignedCharCharacteristic batteryLevelChar("2A19",  // standard 16-bit characteristic UUID
    BLERead | BLENotify); // remote clients will be able to get notifications if this characteristic changes

int oldBatteryLevel = 0;  // last battery level reading from analog input
long previousMillis = 0;  // last time the battery level was checked, in ms

void setup() {
  Serial.begin(9600);    // initialize serial communication
  while (!Serial);

  pinMode(LED_BUILTIN, OUTPUT); // initialize the built-in LED pin to indicate when a central is connected

  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");

    while (1);
  }

  /* Set a local name for the BLE device
     This name will appear in advertising packets
     and can be used by remote devices to identify this BLE device
     The name can be changed but maybe be truncated based on space left in advertisement packet
  */
  BLE.setLocalName("BatteryMonitor");
  BLE.setAdvertisedService(batteryService); // add the service UUID
  batteryService.addCharacteristic(batteryLevelChar); // add the battery level characteristic
  BLE.addService(batteryService); // Add the battery service
  batteryLevelChar.writeValue(oldBatteryLevel); // set initial value for this characteristic

  /* Start advertising BLE.  It will start continuously transmitting BLE
     advertising packets and will be visible to remote BLE central devices
     until it receives a new connection */

  // start advertising
  BLE.advertise();

  Serial.println("Bluetooth device active, waiting for connections...");
}

void loop() {
  // wait for a BLE central
  BLEDevice central = BLE.central();

  // if a central is connected to the peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's BT address:
    Serial.println(central.address());
    // turn on the LED to indicate the connection:
    digitalWrite(LED_BUILTIN, HIGH);

    // check the battery level every 200ms
    // while the central is connected:
    while (central.connected()) {
      long currentMillis = millis();
      // if 200ms have passed, check the battery level:
      if (currentMillis - previousMillis >= 200) {
        previousMillis = currentMillis;
        updateBatteryLevel();
      }
    }
    // when the central disconnects, turn off the LED:
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("Disconnected from central: ");
    Serial.println(central.address());
  }
}

void updateBatteryLevel() {
  /* Read the current voltage level on the A0 analog input pin.
     This is used here to simulate the charge level of a battery.
  */
  int battery = analogRead(A0);
  int batteryLevel = map(battery, 0, 1023, 0, 100);

  if (batteryLevel != oldBatteryLevel) {      // if the battery level has changed
    Serial.print("Battery Level % is now: "); // print it
    Serial.println(batteryLevel);
    batteryLevelChar.writeValue(batteryLevel);  // and update the battery level characteristic
    oldBatteryLevel = batteryLevel;           // save the level for next comparison
  }
}

Hello msvob,

Have you tried using the Peripheral Explorer code on the central board and seeing if it can discover and connect to the other board that way?

I was looking over the other example central codes and it seems they all use BLE.stopScan() before trying to connect which might help.

Hope that helps,
Matt

1 Like

You are right, you have to stop scanning before you connect, thanks a lot!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.