Application for nRF51822 mbed KIT that controls the intensity of LED2 using the BLE UART Service. Works with the Android App BLE_mbed_Remote available here https://github.com/bennthomsen/BLE_mbed_Remote

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_UART_LEDControl_Echo by UCL IoT

This program demonstrates the use of the BLE UART Service to receive and send commands in order to remotely control the operation. In this example the intensity of LED2 can be remotely controlled.

The program accepts commands of the form "led2 0.1" over the BLE UART Service and uses these to set the duty cycle of the PWM Output that is connected to LED2 on the nRF51822 mbed KIT.

An Example Android App is available here https://github.com/bennthomsen/BLE_mbed_Remote. The complete source code and Android Studio Project files are available and can simply be pulled into Android Studio. The App implements sending of text, LED on off Button and a slider to control the LED brightness. At this stage setting the switch to off sets the PWM duty cycle to 0.0, however due to the PWMOut implementation in mbed the LED is not completely off at this point.

Committer:
bthomsen
Date:
Wed Dec 17 19:46:22 2014 +0000
Revision:
12:36a9f01cfa0a
Parent:
10:633cec718bf4
Child:
13:291a8f177400
Initial Commit: Added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:e910d9bb040f 1 /* mbed Microcontroller Library
yihui 0:e910d9bb040f 2 * Copyright (c) 2006-2013 ARM Limited
yihui 0:e910d9bb040f 3 *
yihui 0:e910d9bb040f 4 * Licensed under the Apache License, Version 2.0 (the "License");
yihui 0:e910d9bb040f 5 * you may not use this file except in compliance with the License.
yihui 0:e910d9bb040f 6 * You may obtain a copy of the License at
yihui 0:e910d9bb040f 7 *
yihui 0:e910d9bb040f 8 * http://www.apache.org/licenses/LICENSE-2.0
yihui 0:e910d9bb040f 9 *
yihui 0:e910d9bb040f 10 * Unless required by applicable law or agreed to in writing, software
yihui 0:e910d9bb040f 11 * distributed under the License is distributed on an "AS IS" BASIS,
yihui 0:e910d9bb040f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
yihui 0:e910d9bb040f 13 * See the License for the specific language governing permissions and
yihui 0:e910d9bb040f 14 * limitations under the License.
yihui 0:e910d9bb040f 15 */
yihui 0:e910d9bb040f 16
yihui 0:e910d9bb040f 17 #include "mbed.h"
Rohit Grover 2:e060367b9024 18 #include "BLEDevice.h"
yihui 0:e910d9bb040f 19
rgrover1 6:e0fc9072e853 20 #include "UARTService.h"
yihui 0:e910d9bb040f 21
rgrover1 6:e0fc9072e853 22 #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
Rohit Grover 2:e060367b9024 23 * it will have an impact on code-size and power consumption. */
yihui 0:e910d9bb040f 24
Rohit Grover 2:e060367b9024 25 #if NEED_CONSOLE_OUTPUT
rgrover1 6:e0fc9072e853 26 #define DEBUG(...) { printf(__VA_ARGS__); }
yihui 0:e910d9bb040f 27 #else
Rohit Grover 2:e060367b9024 28 #define DEBUG(...) /* nothing */
Rohit Grover 2:e060367b9024 29 #endif /* #if NEED_CONSOLE_OUTPUT */
yihui 0:e910d9bb040f 30
Rohit Grover 2:e060367b9024 31 BLEDevice ble;
Rohit Grover 2:e060367b9024 32 DigitalOut led1(LED1);
yihui 0:e910d9bb040f 33
rgrover1 6:e0fc9072e853 34 UARTService *uartServicePtr;
yihui 0:e910d9bb040f 35
rgrover1 5:4bc41267a03a 36 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 37 {
Rohit Grover 2:e060367b9024 38 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 39 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 40 ble.startAdvertising();
Rohit Grover 2:e060367b9024 41 }
yihui 0:e910d9bb040f 42
rgrover1 6:e0fc9072e853 43 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 44 {
rgrover1 6:e0fc9072e853 45 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
rgrover1 5:4bc41267a03a 46 uint16_t bytesRead = params->len;
rgrover1 5:4bc41267a03a 47 DEBUG("received %u bytes\n\r", bytesRead);
rgrover1 6:e0fc9072e853 48 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
yihui 0:e910d9bb040f 49 }
Rohit Grover 2:e060367b9024 50 }
yihui 0:e910d9bb040f 51
bthomsen 12:36a9f01cfa0a 52 /* Periodic Ticker callback */
Rohit Grover 2:e060367b9024 53 void periodicCallback(void)
Rohit Grover 2:e060367b9024 54 {
bthomsen 12:36a9f01cfa0a 55 led1 = !led1; // Toggle LED 1
Rohit Grover 2:e060367b9024 56 }
yihui 0:e910d9bb040f 57
yihui 0:e910d9bb040f 58 int main(void)
yihui 0:e910d9bb040f 59 {
Rohit Grover 2:e060367b9024 60 led1 = 1;
bthomsen 12:36a9f01cfa0a 61 Ticker ticker; // Create period timer
bthomsen 12:36a9f01cfa0a 62 ticker.attach(periodicCallback, 1); // Attach ticker callback function with a period of 1 second
yihui 0:e910d9bb040f 63
Rohit Grover 2:e060367b9024 64 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 65 ble.init();
Rohit Grover 2:e060367b9024 66 ble.onDisconnection(disconnectionCallback);
Rohit Grover 2:e060367b9024 67 ble.onDataWritten(onDataWritten);
yihui 0:e910d9bb040f 68
Rohit Grover 2:e060367b9024 69 /* setup advertising */
Rohit Grover 2:e060367b9024 70 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Rohit Grover 2:e060367b9024 71 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 72 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 6:e0fc9072e853 73 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
Rohit Grover 2:e060367b9024 74 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 75 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 76
rgrover1 10:633cec718bf4 77 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000));
Rohit Grover 2:e060367b9024 78 ble.startAdvertising();
yihui 0:e910d9bb040f 79
rgrover1 6:e0fc9072e853 80 UARTService uartService(ble);
rgrover1 6:e0fc9072e853 81 uartServicePtr = &uartService;
yihui 0:e910d9bb040f 82
Rohit Grover 2:e060367b9024 83 while (true) {
Rohit Grover 2:e060367b9024 84 ble.waitForEvent();
yihui 0:e910d9bb040f 85 }
yihui 0:e910d9bb040f 86 }