HCSR04 Ultrasonic sensor exposed over BLE

Dependencies:   BLE_API HCSR04 mbed nRF51822

Files at this revision

API Documentation at this revision

Comitter:
janjongboom
Date:
Mon May 09 10:26:40 2016 +0000
Commit message:
HCSR04 ultrasonic sensor over BLE

Changed in this revision

BLE_API.lib Show annotated file Show diff for this revision Revisions of this file
HCSR04.lib Show annotated file Show diff for this revision Revisions of this file
UltrasonicService.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
nRF51822.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 470a1164da56 BLE_API.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLE_API.lib	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#66159681aa21
diff -r 000000000000 -r 470a1164da56 HCSR04.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HCSR04.lib	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/prabhuvd/code/HCSR04/#71da0dbf4400
diff -r 000000000000 -r 470a1164da56 UltrasonicService.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UltrasonicService.h	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,43 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#ifndef __BLE_ULTRA_SERVICE_H__
+#define __BLE_ULTRA_SERVICE_H__
+ 
+class UltrasonicService {
+public:
+    const static uint16_t SERVICE_UUID              = 0xA998;
+    const static uint16_t STATE_CHARACTERISTIC_UUID = 0xA999;
+ 
+    UltrasonicService(BLE &_ble) :
+        ble(_ble), state(STATE_CHARACTERISTIC_UUID, 0, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)
+    {
+        GattCharacteristic *charTable[] = {&state};
+        GattService         service(UltrasonicService::SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+        ble.gattServer().addService(service);
+    }
+ 
+    void updateState(uint32_t newState) {
+        ble.gattServer().write(state.getValueHandle(), (uint8_t *)&newState, sizeof(uint32_t));
+    }
+ 
+private:
+    BLE                                     &ble;
+    ReadOnlyGattCharacteristic<uint32_t>    state;
+};
+ 
+#endif /* #ifndef __BLE_ULTRA_SERVICE_H__ */
+ 
\ No newline at end of file
diff -r 000000000000 -r 470a1164da56 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,119 @@
+#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();
+    }
+}
diff -r 000000000000 -r 470a1164da56 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/aae6fcc7d9bb
\ No newline at end of file
diff -r 000000000000 -r 470a1164da56 nRF51822.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nRF51822.lib	Mon May 09 10:26:40 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#f7faad332abc