HCSR04 Ultrasonic sensor exposed over BLE
Dependencies: BLE_API HCSR04 mbed nRF51822
main.cpp
- Committer:
- janjongboom
- Date:
- 2016-05-09
- Revision:
- 0:470a1164da56
File content as of revision 0:470a1164da56:
#include "mbed.h" #include "ble/BLE.h" #include "UltrasonicService.h" #include "hcsr04.h" #define ULTRASONIC_UPDATE_INTERVAL 1.0f // in seconds #define LED_ON 0 #define LED_OFF 1 static DigitalOut alivenessLED(LED1, LED_OFF); // green static HCSR04 usensor(D0, D1); const static char DEVICE_NAME[] = "HPE_ULTRASONIC"; static const uint16_t uuid16_list[] = { UltrasonicService::SERVICE_UUID }; static UltrasonicService *uServicePtr; static Ticker ledTicker; static Ticker uTicker; static Timeout cbTimeout; void readDistanceCallback(void) { uint32_t dist = usensor.get_dist_cm(); uServicePtr->updateState(dist); // should add a stop function? usensor.stop(); } void readDistance(void) { usensor.start(); // need to like have it on for for 0.5s cbTimeout.attach(&readDistanceCallback, 0.5f); } void periodicCallback(void) { alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */ } void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { printf("Disconnected over BLE!\r\n"); BLE::Instance().gap().startAdvertising(); ledTicker.attach(periodicCallback, 1); uTicker.detach(); } void connectionCallback(const Gap::ConnectionCallbackParams_t * params) { printf("Connected over BLE!\r\n"); // blink a bit faster when connected ledTicker.attach(periodicCallback, 0.5); // only do ultrasonic readings whenever we're connected over BLE uTicker.attach(readDistance, ULTRASONIC_UPDATE_INTERVAL); } void onBleInitError(BLE &ble, ble_error_t error) { // blink fast when we encountered an error ledTicker.attach(periodicCallback, 0.2); } void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { BLE& ble = params->ble; ble_error_t error = params->error; if (error != BLE_ERROR_NONE) { /* In case of error, forward the error handling to onBleInitError */ onBleInitError(ble, error); return; } /* Ensure that it is the default instance of BLE */ if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } ble.gap().onDisconnection(disconnectionCallback); ble.gap().onConnection(connectionCallback); // Begin - If you add a new service, add it here! uServicePtr = new UltrasonicService(ble); // End - If you add a new service, add it here! ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().setAdvertisingInterval(1000); ble.gap().startAdvertising(); } int main(void) { // Blink the green LED! ledTicker.attach(periodicCallback, 1); BLE &ble = BLE::Instance(); ble.init(bleInitComplete); /* SpinWait for initialization to complete. This is necessary because the * BLE object is used in the main loop below. */ while (ble.hasInitialized() == false) { /* spin loop */ } while (true) { ble.waitForEvent(); } }