2

I have the BLE Module Adafruit ItsyBitsy nRF52840 Express and I want to send sensor values from a Hallsensor to my computer. I was able to have the right data checking with the Serial monitor.

int adcin = A1;
int adcvalue = 0;
float mv_per_lsb = 1200.0F/4096.0F; // 10-bit ADC with 3.6V input range
double freq = 100;
uint32_t lastMicros = 0;  //variable to track sampling frequency 
double microseconds = 1000000.0;
double interval = microseconds/freq;

void setup() { Serial.begin(115200); // Set the analog reference to 3.0V (default = 3.6V) analogReference(AR_INTERNAL_1_2); // Set the resolution to 12-bit (0..4095) analogReadResolution(12); // Can be 8, 10, 12 or 14 // Let the ADC settle delay(1); }

void loop() {

// Get a fresh ADC value after intervall (1/freq) if (micros()-lastMicros >= interval) { adcvalue = analogRead(adcin); lastMicros = micros();

// Display the results
Serial.print(lastMicros);
Serial.print(" [");
Serial.print((float)adcvalue * mv_per_lsb);
Serial.println(" mV]");

} }

Then I tried to send these values through BLE connectin to my computer. So I knew I had to create a service and a characteristic for the GATT profile. But using the guide from adafruit was not really helpful. Right know I saw that with the following code I was able to see the module on my computer and read the characteristic I made. But it seems to just give me random Hex values rather than my sensor data.

#include <bluefruit.h>

BLEService myService = BLEService(0x187A); BLECharacteristic myChar = BLECharacteristic(0x184D);

BLEDis bledis; // DIS (Device Information Service) helper class instance

int adcin = A1; int adcvalue = 0; float mv_per_lsb = 1200.0F/4096.0F; // 10-bit ADC with 3.6V input range double freq = 100; uint32_t lastMicros = 0; //variable to track sampling frequency double microseconds = 1000000.0; double interval = microseconds/freq; float volt = 0;

void setup() { Serial.begin(115200);

//Setup for data acquisition // Set the analog reference to 3.0V (default = 3.6V) analogReference(AR_INTERNAL_1_2); // Set the resolution to 12-bit (0..4095) analogReadResolution(12); // Can be 8, 10, 12 or 14 // Let the ADC settle delay(1);

Serial.println("BLE data acquisition"); Serial.println("-----------------------\n");

// Initialise the Bluefruit module Serial.println("Initialise the Bluefruit nRF52 module"); Bluefruit.begin();

// Set the advertised device name (keep it short!) Serial.println("Setting Device Name to 'Adafruit_BLE'"); Bluefruit.setName("Adafruit_BLE");

// Set the connect/disconnect callback handlers Bluefruit.Periph.setConnectCallback(connect_callback); Bluefruit.Periph.setDisconnectCallback(disconnect_callback);

// Configure and Start the Device Information Service Serial.println("Configuring the Device Information Service"); bledis.setManufacturer("Adafruit Industries"); bledis.setModel("Bluefruit"); bledis.begin();

// Setup the BLEService and BLECharacteristic classes Serial.println("Configuring the custom Service"); setupSer();

// Setup the advertising packet(s) Serial.println("Setting up the advertising payload(s)"); startAdv();

Serial.println("Ready"); Serial.println("\nAdvertising"); }

void startAdv(void) { // Advertising packet Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); Bluefruit.Advertising.addTxPower();

// Include custom Service UUID Bluefruit.Advertising.addService(myService);

// Include Name Bluefruit.Advertising.addName();

Bluefruit.Advertising.restartOnDisconnect(true); Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
}

void setupSer(void) { myService.begin();

myChar.setProperties(CHR_PROPS_READ); myChar.setPermission(SECMODE_OPEN, SECMODE_OPEN); myChar.setFixedLen(4); myChar.begin(); }

void connect_callback(uint16_t conn_handle) { // Get the reference to current connection BLEConnection* connection = Bluefruit.Connection(conn_handle);

char central_name[32] = { 0 }; connection->getPeerName(central_name, sizeof(central_name));

Serial.print("Connected to "); Serial.println(central_name); }

void disconnect_callback(uint16_t conn_handle, uint8_t reason) { (void) conn_handle; (void) reason;

Serial.print("Disconnected, reason = 0x"); Serial.println(reason, HEX); Serial.println("Advertising!"); }

void loop() { // Get a fresh ADC value after intervall (1/freq) if (micros()-lastMicros >= interval) { adcvalue = analogRead(adcin); lastMicros = micros(); volt = (float)adcvalue * mv_per_lsb; // Display the results Serial.print(adcvalue); Serial.print(" ["); Serial.print(volt); Serial.println(" mV]"); myChar.write16(volt); } }

I really got confusing with how to write my sensor values to the characteristic.

Does anyone know how I can achieve that? Cheers

Hanuman
  • 21
  • 1

0 Answers0