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 22:43:40 2014 +0000
Revision:
13:291a8f177400
Parent:
12:36a9f01cfa0a
Child:
14:8ff3bfb6b19d
modified to control LED2 by sending commands over BLE; "led2 on" turns LED2 on; "led2 off" turns LED2 off;

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 13:291a8f177400 22 #define NEED_CONSOLE_OUTPUT 1 /* 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 13:291a8f177400 31 #define LED2OFF "led2 off"
bthomsen 13:291a8f177400 32 #define LED2ON "led2 on"
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 13:291a8f177400 39 DigitalOut 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 //strncpy(rxPayload, (const char *)params->data, bytesRead);
bthomsen 13:291a8f177400 57 DEBUG("Received string: '");
bthomsen 13:291a8f177400 58 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 59 DEBUG("'\n\r");
bthomsen 13:291a8f177400 60 if (!strncmp(LED2ON,(const char *)params->data,bytesRead)) led2 = 1; // If the received and command string are equal turn led2 on. Note strcmp returns 0 if strings are equal
bthomsen 13:291a8f177400 61 if (!strncmp(LED2OFF,(const char *)params->data,bytesRead)) led2 = 0; // If the received and command string are equal turn led2 off.
bthomsen 13:291a8f177400 62 //Toggle LED2 when data received
bthomsen 13:291a8f177400 63 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); // Echo received characters back over BLE
yihui 0:e910d9bb040f 64 }
Rohit Grover 2:e060367b9024 65 }
yihui 0:e910d9bb040f 66
bthomsen 12:36a9f01cfa0a 67 /* Periodic Ticker callback */
Rohit Grover 2:e060367b9024 68 void periodicCallback(void)
Rohit Grover 2:e060367b9024 69 {
bthomsen 12:36a9f01cfa0a 70 led1 = !led1; // Toggle LED 1
Rohit Grover 2:e060367b9024 71 }
yihui 0:e910d9bb040f 72
yihui 0:e910d9bb040f 73 int main(void)
yihui 0:e910d9bb040f 74 {
Rohit Grover 2:e060367b9024 75 led1 = 1;
bthomsen 13:291a8f177400 76 led2 = 0;
bthomsen 12:36a9f01cfa0a 77 Ticker ticker; // Create period timer
bthomsen 12:36a9f01cfa0a 78 ticker.attach(periodicCallback, 1); // Attach ticker callback function with a period of 1 second
yihui 0:e910d9bb040f 79
Rohit Grover 2:e060367b9024 80 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 81 ble.init();
bthomsen 13:291a8f177400 82 ble.onDisconnection(disconnectionCallback); // Define callback function for BLE disconnection event
bthomsen 13:291a8f177400 83 ble.onDataWritten(onDataWritten); // Define callback function for BLE Data received event
yihui 0:e910d9bb040f 84
Rohit Grover 2:e060367b9024 85 /* setup advertising */
bthomsen 13:291a8f177400 86 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); // Indicate that Legacy Bluetooth in not supported
Rohit Grover 2:e060367b9024 87 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 88 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 6:e0fc9072e853 89 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
Rohit Grover 2:e060367b9024 90 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 91 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 92
bthomsen 13:291a8f177400 93 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000)); // Set advertising interval to 1 second
bthomsen 13:291a8f177400 94 ble.startAdvertising(); // Start advertising
yihui 0:e910d9bb040f 95
bthomsen 13:291a8f177400 96 UARTService uartService(ble); // Create BLE UART service
bthomsen 13:291a8f177400 97 uartServicePtr = &uartService; // Initalise pointer to point to UART Service
yihui 0:e910d9bb040f 98
Rohit Grover 2:e060367b9024 99 while (true) {
bthomsen 13:291a8f177400 100 ble.waitForEvent(); // Wait for BLE events
yihui 0:e910d9bb040f 101 }
yihui 0:e910d9bb040f 102 }