Hi Dave! I tested your code and I was able to get the reading. But problem is when using the same code with BLE & IMU together. In my code, I am sending IMU data over bluetooth to a mobile app and reading PIN_VBAT disconnects the device from mobile app. An example code would be like this
/**
This prorgam is written to collect IMU data from XIAO BLE Sense and send to EI Blue mobile app.
EI Blue mobile app uploads the data to Edge Impulse Studio.
Visit https://wiki.seeedstudio.com/XIAO-BLE-Sense-Bluetooth-Usage/ to setup Arduino IDE
Get EI Blue mobile app from https://github.com/just4give/ei-blue
*/
#include <ArduinoBLE.h>
#include <LSM6DS3.h>
#include <Wire.h>
#define BLENAME "EIBLUE"
#define SERVICE_UUID "4D7D1101-EE27-40B2-836C-17505C1044D7"
#define TX_PRED_CHAR_UUID "4D7D1106-EE27-40B2-836C-17505C1044D7"
#define TX_BAT_CHAR_UUID "4D7D1107-EE27-40B2-836C-17505C1044D7"
#define RX_CHAR_UUID "4D7D1108-EE27-40B2-836C-17505C1044D7"
#define SAMPLING_RATE 50 //Hz
#define DURATION 1 //seconds
BLEService bleService(SERVICE_UUID); // Bluetooth® Low Energy LED Service
// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEStringCharacteristic rxCharacteristic(RX_CHAR_UUID, BLEWrite, 1024);
BLEStringCharacteristic txPredCharacteristic(TX_PRED_CHAR_UUID, BLERead | BLENotify, 1024);
BLEStringCharacteristic txBatCharacteristic(TX_BAT_CHAR_UUID, BLERead | BLENotify, 1024);
LSM6DS3 myIMU(I2C_MODE, 0x6A); //I2C device address 0x6A
float aX, aY, aZ, gX, gY, gZ;
const float accelerationThreshold = 2.5; // threshold of significant in G's
const double vRef = 3.3; // Assumes 3.3V regulator output is ADC reference voltage
const unsigned int numReadings = 1024;
void setup() {
Serial.begin(115200);
pinMode(P0_14, OUTPUT);
digitalWrite(P0_14,LOW);
// set LED pin to output mode
pinMode(LEDB, OUTPUT);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
// begin initialization
if (!BLE.begin()) {
Serial.println("starting Bluetooth® Low Energy module failed!");
while (1);
}
// set advertised local name and service UUID:
BLE.setLocalName(BLENAME);
BLE.setDeviceName(BLENAME);
BLE.setAdvertisedService(bleService);
// add the characteristic to the service
bleService.addCharacteristic(txBatCharacteristic);
bleService.addCharacteristic(txPredCharacteristic);
bleService.addCharacteristic(rxCharacteristic);
// add service
BLE.addService(bleService);
BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler);
BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);
// start advertising
BLE.advertise();
Serial.println("BLE Peripheral");
if (myIMU.begin() != 0) {
Serial.println("Device error");
} else {
Serial.println("aX,aY,aZ,gX,gY,gZ");
}
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
Serial.print("Connected to central: ");
unsigned int adcCount = analogRead(PIN_VBAT);
double adcVoltage = (adcCount * vRef) / numReadings;
double vBat = adcVoltage*1510.0/510.0; // Voltage divider from Vbat to ADC
printf("adcCount = %3u = 0x%03X, adcVoltage = %.3fV, vBat = %.3f\n",
adcCount, adcCount, adcVoltage, vBat);
String data="";
data = String(myIMU.readFloatAccelX(), 3)+","+String(myIMU.readFloatAccelY(), 3)+","+String(myIMU.readFloatAccelZ(), 3);
txBatCharacteristic.writeValue(String(vBat));
txPredCharacteristic.writeValue(data.c_str());
delay(1000);
}
}
void blePeripheralConnectHandler(BLEDevice central) {
// central connected event handler
Serial.print("Connected event, central: ");
Serial.println(central.address());
digitalWrite(LEDB, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDR, HIGH);
}
void blePeripheralDisconnectHandler(BLEDevice central) {
// central disconnected event handler
Serial.print("Disconnected event, central: ");
Serial.println(central.address());
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDR, HIGH);
}