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:
Thu Dec 18 21:14:19 2014 +0000
Revision:
15:016434184568
Parent:
14:8ff3bfb6b19d
Initial Commit - Working Version

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
bthomsen 14:8ff3bfb6b19d 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
bthomsen 15:016434184568 31 #define LED2CMD "led2"
bthomsen 15:016434184568 32 #define CMD_LENGTH 4
bthomsen 13:291a8f177400 33
bthomsen 13:291a8f177400 34
bthomsen 13:291a8f177400 35 //char rxPayload[CMD_SIZE];
bthomsen 13:291a8f177400 36
bthomsen 13:291a8f177400 37 BLEDevice ble; // Create Bluetooth object
bthomsen 13:291a8f177400 38 DigitalOut led1(LED1); // Set the pin attached to LED1 as an output
bthomsen 15:016434184568 39 PwmOut led2(LED2); // Set the pin attached to LED2 as an output
yihui 0:e910d9bb040f 40
rgrover1 6:e0fc9072e853 41 UARTService *uartServicePtr;
yihui 0:e910d9bb040f 42
bthomsen 13:291a8f177400 43 /* BLE disconnected callback */
rgrover1 5:4bc41267a03a 44 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 45 {
Rohit Grover 2:e060367b9024 46 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 47 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 48 ble.startAdvertising();
Rohit Grover 2:e060367b9024 49 }
bthomsen 13:291a8f177400 50 /* BLE UART data received callback */
rgrover1 6:e0fc9072e853 51 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 52 {
bthomsen 13:291a8f177400 53 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { //If characters received over BLE
rgrover1 5:4bc41267a03a 54 uint16_t bytesRead = params->len;
rgrover1 5:4bc41267a03a 55 DEBUG("received %u bytes\n\r", bytesRead);
bthomsen 13:291a8f177400 56 DEBUG("Received string: '");
bthomsen 13:291a8f177400 57 DEBUG((const char *)params->data); //Note the size of data expands to the largest string received. Need to use bytesRead to resize.
bthomsen 13:291a8f177400 58 DEBUG("'\n\r");
bthomsen 15:016434184568 59 if (!strncmp(LED2CMD,(const char *)params->data,CMD_LENGTH-1)){
bthomsen 15:016434184568 60 float value;
bthomsen 15:016434184568 61 char cmd[CMD_LENGTH];
bthomsen 15:016434184568 62 sscanf((const char *)params->data, "%s %f", cmd, &value );
bthomsen 15:016434184568 63 led2 = value;
bthomsen 15:016434184568 64 DEBUG("Cmd: %s LED Level = %f\n\r", cmd, value);
bthomsen 15:016434184568 65 }
bthomsen 15:016434184568 66 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data,bytesRead); // Echo received characters back over BLE
yihui 0:e910d9bb040f 67 }
Rohit Grover 2:e060367b9024 68 }
yihui 0:e910d9bb040f 69
bthomsen 12:36a9f01cfa0a 70 /* Periodic Ticker callback */
Rohit Grover 2:e060367b9024 71 void periodicCallback(void)
Rohit Grover 2:e060367b9024 72 {
bthomsen 12:36a9f01cfa0a 73 led1 = !led1; // Toggle LED 1
Rohit Grover 2:e060367b9024 74 }
yihui 0:e910d9bb040f 75
yihui 0:e910d9bb040f 76 int main(void)
yihui 0:e910d9bb040f 77 {
Rohit Grover 2:e060367b9024 78 led1 = 1;
bthomsen 15:016434184568 79 led2 = 0.5;
bthomsen 12:36a9f01cfa0a 80 Ticker ticker; // Create period timer
bthomsen 12:36a9f01cfa0a 81 ticker.attach(periodicCallback, 1); // Attach ticker callback function with a period of 1 second
yihui 0:e910d9bb040f 82
Rohit Grover 2:e060367b9024 83 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 84 ble.init();
bthomsen 13:291a8f177400 85 ble.onDisconnection(disconnectionCallback); // Define callback function for BLE disconnection event
bthomsen 13:291a8f177400 86 ble.onDataWritten(onDataWritten); // Define callback function for BLE Data received event
yihui 0:e910d9bb040f 87
Rohit Grover 2:e060367b9024 88 /* setup advertising */
bthomsen 13:291a8f177400 89 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); // Indicate that Legacy Bluetooth in not supported
Rohit Grover 2:e060367b9024 90 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 91 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 6:e0fc9072e853 92 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
Rohit Grover 2:e060367b9024 93 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 94 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 95
bthomsen 13:291a8f177400 96 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000)); // Set advertising interval to 1 second
bthomsen 13:291a8f177400 97 ble.startAdvertising(); // Start advertising
yihui 0:e910d9bb040f 98
bthomsen 13:291a8f177400 99 UARTService uartService(ble); // Create BLE UART service
bthomsen 13:291a8f177400 100 uartServicePtr = &uartService; // Initalise pointer to point to UART Service
yihui 0:e910d9bb040f 101
Rohit Grover 2:e060367b9024 102 while (true) {
bthomsen 13:291a8f177400 103 ble.waitForEvent(); // Wait for BLE events
yihui 0:e910d9bb040f 104 }
yihui 0:e910d9bb040f 105 }