![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
get the accelaration and judge the moving state then broadcast by BLE
Dependencies: AE_KXSD9 BLE_API mbed nRF51822
main.cpp
- Committer:
- MonroeLee
- Date:
- 2016-06-09
- Revision:
- 0:de01d2d04e9d
File content as of revision 0:de01d2d04e9d:
#include "mbed.h" #include "BLEDevice.h" #include "AE_KXSD9.h" #include "nRF51822n.h" #define ADDR_W 0x30 #define ADDR_R 0x31 #define DBG 1 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; * it will have an impact on code-size and power consumption. */ #if NEED_CONSOLE_OUTPUT Serial pc(USBTX, USBRX); #define DEBUG(...) { pc.printf(__VA_ARGS__); } #else #define DEBUG(...) /* nothing */ #endif /* #if NEED_CONSOLE_OUTPUT */ BLEDevice ble; //AE_KXSD9 kxsd9(PinName sda, PinName scl, int addr1, int addr2); /* KXSD9 */ AE_KXSD9 i2c(p22, p20, ADDR_W, ADDR_R); //sda, scl, addr_w, addr_r static const char DEVICENAME[] = "HRM1017"; static volatile bool triggerSensorPolling = false; const uint8_t KXSD9_service_uuid[] = { 0x31,0x27,0x00,0xE2,0xE7,0x98, 0x4D,0x5C, 0x8D,0xCF, 0x49,0x90,0x83,0x32,0xDF,0x9F }; const uint8_t KXSD9_Characteristic_uuid[] = { 0xFF,0xA2,0x8C,0xDE,0x65,0x25, 0x44,0x89, 0x80,0x1C, 0x1C,0x06,0x0C,0xAC,0x97,0x67 }; uint8_t thermTempPayload[sizeof(double)*4] = {0,0,0,0}; GattCharacteristic ControllerChar (KXSD9_Characteristic_uuid, thermTempPayload, (sizeof(double) * 4), (sizeof(double) * 4), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); GattCharacteristic *ControllerChars[] = { &ControllerChar, }; GattService KXSD9Service(KXSD9_service_uuid, ControllerChars, sizeof(ControllerChars) / sizeof(GattCharacteristic *)); static Gap::ConnectionParams_t connectionParams; void updateValue(); void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) // Mod { DEBUG("Disconnected handle %u, reason %u\n", handle, reason); DEBUG("Restarting the advertising process\n\r"); ble.startAdvertising(); } void onConnectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) //Mod { DEBUG("connected. Got handle %u\r\n", handle); connectionParams.slaveLatency = 1; if (ble.updateConnectionParams(handle, &connectionParams) != BLE_ERROR_NONE) { DEBUG("failed to update connection paramter\r\n"); } } void periodicCallback(void) { //oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */ /* Note that the periodicCallback() executes in interrupt context, so it is safer to do * heavy-weight sensor polling from the main thread. */ triggerSensorPolling = true; } /**************************************************************************/ /*! @brief Program entry point */ /**************************************************************************/ int main(void) { //pc.baud(115200); #if DBG pc.printf("Start\n\r"); #endif Ticker ticker; ticker.attach(periodicCallback, 1); i2c.init(); ble.init(); ble.onDisconnection(disconnectionCallback); ble.onConnection(onConnectionCallback); ble.getPreferredConnectionParams(&connectionParams); /* setup advertising */ ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)DEVICENAME, sizeof(DEVICENAME)); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)KXSD9_service_uuid, sizeof(KXSD9_service_uuid)); ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ ble.startAdvertising(); ble.addService(KXSD9Service); for(;;) { if (triggerSensorPolling) { triggerSensorPolling = false; updateValue(); } else { ble.waitForEvent(); } } } double Judge_state(double a[128]) { double state=0; int i; double sum0=0; double sum1=0; double avg=0; double M=0; int n=128; double LowChecker=1000;//区分静止和行走的界限 double HighChecker=10000;//区分行走和跑步的界限 for(i=0;i<n;i++) { sum0+=a[i]; } avg=sum0/n; for(i=0;i<n;i++) { sum1+=abs(a[i]-avg); } M=sum1/n; if(M>=0&&M<LowChecker) { state=1.0; } else if(M>=LowChecker&&M<HighChecker) { state=2.0; } else state=3.0; return state; } void updateValue(void){ double x = 0.0; double y = 0.0; double z = 0.0; double s=0; int i=0; double s_a; //合成的一维加速度 double a[128];//用于存放128个一维加速度取样值 i2c.read_xyz(&x, &y, &z); //pc.printf("%.3lf,%.3lf,%.3lf\r\n", x, y, z); s_a=sqrt(x*x+y*y+z*z); a[i]=s_a-55602; i=i+1; if(i==127) { s=Judge_state(a); i=0; //printf("Dx=:%lf\r\n",x); //printf("Dy=:%lf\r\n",y); //printf("Dz=:%lf\r\n",z); //printf("Dz=:%lf\r\n",s); } memcpy(thermTempPayload+sizeof(double)*0, &x, sizeof(x)); memcpy(thermTempPayload+sizeof(double)*1, &y, sizeof(y)); memcpy(thermTempPayload+sizeof(double)*2, &z, sizeof(z)); memcpy(thermTempPayload+sizeof(double)*3, &s, sizeof(s)); pc.printf("%.3lf,%.3lf,%.3lf,%.3lf\r\n", *(double*)&thermTempPayload[sizeof(double)*0], *(double*)&thermTempPayload[sizeof(double)*1], *(double*)&thermTempPayload[sizeof(double)*2], *(double*)&thermTempPayload[sizeof(double)*3]); ble.updateCharacteristicValue(ControllerChar.getValueAttribute().getHandle(), thermTempPayload, sizeof(thermTempPayload)); //Mod }