Broadcasts raw accelerometer values
Dependencies: BLE_API MMA8452_tag_private mbed nRF51822
Fork of tag_final by
main.cpp
- Committer:
- luisbc92
- Date:
- 2016-01-08
- Revision:
- 0:4c7b37b8faad
- Child:
- 1:1c14c1d3ce09
File content as of revision 0:4c7b37b8faad:
#include "mbed.h" #include "BLEDevice.h" #include "ADXL345.h" // The accelerometer sample rate defines how often advertising // packets need to be sent. Each packet can hold 9 samples. #define ACC_SAMPLE_RATE 9 // How many times to re-advertise the same packet. For example, // if for the given sample rate an advertising packet needs to // be sent every second, and ADV_RESEND_COUNT of 2 will send // 2 packets per second. #define ADV_RESEND_COUNT 10 BLEDevice ble; ADXL345 acc(P0_9, P0_11, P0_8, P0_10); DigitalOut led(P0_19); void accRead() { int data[3]; static int8_t buffer[28]; static uint8_t index = 0; static uint8_t count; acc.getOutput(data); // Fill buffer buffer[index] = (int8_t)(data[0] >> 8); buffer[index+1] = (int8_t)(data[1] >> 8); buffer[index+2] = (int8_t)(data[2] >> 8); index += 3; // If buffer is full (9 readings) update advertising packet if (index >= 27) { index = 0; // Reset buffer index count += 1; // Increase packet count buffer[27] = count; // Append packet count ble.clearScanResponse(); // Clear advertising packet and add data ble.accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t*)buffer, sizeof(buffer)); ble.setAdvertisingPayload(); led = 0; // Flash led wait(0.01); led = 1; } } int main(void) { // Turn off led led = 0; // Calculate advertising interval uint16_t adv_interval; adv_interval = (uint16_t)((9.0 / (float)ACC_SAMPLE_RATE) * 1000.0 / (float)ADV_RESEND_COUNT); // Initialize BLE uint8_t tagAddress[6]; uint8_t tagName[8]; ble.init(); // Initialize BLE stack ble.setTxPower(4); // Set power level (in dB) ble.setAddress(Gap::ADDR_TYPE_RANDOM_STATIC, NULL); // Static random address ble.getAddress(NULL, tagAddress); // Get random address from stack sprintf((char*)tagName, "TAG_%2X%2X", tagAddress[1], tagAddress[0]); ble.accumulateAdvertisingPayload( // Advertise as BLE GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.accumulateAdvertisingPayload( // Set name GapAdvertisingData::COMPLETE_LOCAL_NAME, tagName, sizeof(tagName)); ble.setAdvertisingInterval(adv_interval); // Advertising interval ble.startAdvertising(); // Start advertising // Setup ticker to read accelerometer acc.setPowerControl(0x00); // Standby for configuration acc.setDataFormatControl(0x05); // +-4g, left-justified, acc.setDataRate(ADXL345_12HZ5); // 12.5Hz Internal Sample Rate acc.setPowerControl(0x08); // Measurement mode Ticker acc_read; acc_read.attach(&accRead, (1.0 / (float)ACC_SAMPLE_RATE)); while(1) { ble.waitForEvent(); // Sleep } }