htr

Dependencies:   mbed AdafruitST7735 BLE_API Adafruit_GFX nRF51822

Committer:
tekasijimo
Date:
Sun Aug 11 13:43:37 2019 +0000
Revision:
19:02bb67cb303c
derfthe

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tekasijimo 19:02bb67cb303c 1 /*
tekasijimo 19:02bb67cb303c 2 Port for WaveShare BLE400 Evothings good example for Nordic nRF51822-DK
tekasijimo 19:02bb67cb303c 3 As target for mbed-online used <Nordic nRF51822> (Large green board Nordic nRF51822-mKIT, actually deprecated on ~01/03/2019)
tekasijimo 19:02bb67cb303c 4 Briefly: Handle via Evothings BLE Application 4 LEDs and 2 Buttons(via notify messages).
tekasijimo 19:02bb67cb303c 5
tekasijimo 19:02bb67cb303c 6 This example original:
tekasijimo 19:02bb67cb303c 7 https://os.mbed.com/users/jensstruemper/code/Evothings-Updated/
tekasijimo 19:02bb67cb303c 8 Android application:
tekasijimo 19:02bb67cb303c 9 http://evothings.com/2.2/doc/examples/nordic-nRF51-ble.html
tekasijimo 19:02bb67cb303c 10 This application explanation:
tekasijimo 19:02bb67cb303c 11 How to turn a Nordic Semiconductor nRF51-DK into a discoverable beacon using mbed
tekasijimo 19:02bb67cb303c 12 https://evothings.com/how-to-turn-a-nordic-semiconductor-nrf51-dk-into-a-discoverable-beacon-using-mbed/
tekasijimo 19:02bb67cb303c 13
tekasijimo 19:02bb67cb303c 14 Author porting:
tekasijimo 19:02bb67cb303c 15 Ibragimov Maksim aka maxxir
tekasijimo 19:02bb67cb303c 16 Russia Togliatty
tekasijimo 19:02bb67cb303c 17 01/03/2019
tekasijimo 19:02bb67cb303c 18 */
tekasijimo 19:02bb67cb303c 19
tekasijimo 19:02bb67cb303c 20 /*
tekasijimo 19:02bb67cb303c 21 PS.
tekasijimo 19:02bb67cb303c 22 My Win7 CMD script string example to flash BLE400 via STLINK-V2 && OpenOCD
tekasijimo 19:02bb67cb303c 23 content from flash_ble400.bat:
tekasijimo 19:02bb67cb303c 24 E:\stm32_eclipse_neon\OpenOCD\bin\openocd.exe -d2 -f interface/stlink-v2.cfg ; -f target/nrf51_stlink.tcl -c "program %1 verify reset exit"; shutdown;
tekasijimo 19:02bb67cb303c 25
tekasijimo 19:02bb67cb303c 26 Flash example via console:
tekasijimo 19:02bb67cb303c 27 >flash_ble400.bat BLE_Evothings_NRF51822-BLE400.NRF51822.hex
tekasijimo 19:02bb67cb303c 28 */
tekasijimo 19:02bb67cb303c 29
tekasijimo 19:02bb67cb303c 30 /*
tekasijimo 19:02bb67cb303c 31 * nRF51-DK BLEDevice service/characteristic (read/write) using mbed.org
tekasijimo 19:02bb67cb303c 32 */
tekasijimo 19:02bb67cb303c 33
tekasijimo 19:02bb67cb303c 34 // uncomment if not interested in a console log
tekasijimo 19:02bb67cb303c 35 #define CONSOLE_LOG
tekasijimo 19:02bb67cb303c 36
tekasijimo 19:02bb67cb303c 37 #include "mbed.h"
tekasijimo 19:02bb67cb303c 38 #include "ble/BLE.h"
tekasijimo 19:02bb67cb303c 39
tekasijimo 19:02bb67cb303c 40 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 41
tekasijimo 19:02bb67cb303c 42 #ifdef CONSOLE_LOG
tekasijimo 19:02bb67cb303c 43 #define INFO(x, ...) printf(x, ##__VA_ARGS__);
tekasijimo 19:02bb67cb303c 44 #define INFO_NL(x, ...) printf(x "\r\n", ##__VA_ARGS__);
tekasijimo 19:02bb67cb303c 45 #else
tekasijimo 19:02bb67cb303c 46 #define INFO(x, ...)
tekasijimo 19:02bb67cb303c 47 #define INFO_NL(x, ...)
tekasijimo 19:02bb67cb303c 48 #endif
tekasijimo 19:02bb67cb303c 49
tekasijimo 19:02bb67cb303c 50 // a little routine to print a 128-bit UUID nicely
tekasijimo 19:02bb67cb303c 51 void INFO_UUID(const char *prefix, UUID uuid)
tekasijimo 19:02bb67cb303c 52 {
tekasijimo 19:02bb67cb303c 53 uint8_t *p = (uint8_t *)uuid.getBaseUUID();
tekasijimo 19:02bb67cb303c 54 INFO("%s: ", prefix);
tekasijimo 19:02bb67cb303c 55 for (int i=0; i<16; i++)
tekasijimo 19:02bb67cb303c 56 {
tekasijimo 19:02bb67cb303c 57 INFO("%02x", p[i]);
tekasijimo 19:02bb67cb303c 58 if ((i == 3) || (i == 5) || (i == 7) || (i == 9)) INFO("-");
tekasijimo 19:02bb67cb303c 59 }
tekasijimo 19:02bb67cb303c 60 INFO_NL("");
tekasijimo 19:02bb67cb303c 61 }
tekasijimo 19:02bb67cb303c 62
tekasijimo 19:02bb67cb303c 63 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 64
tekasijimo 19:02bb67cb303c 65 // name of the device
tekasijimo 19:02bb67cb303c 66 const static char DEVICE_NAME[] = "nRF51-BLE400"; //Edit here your name device, and also fix on Evothings APP <index.html> look ~ #136-#137 NRF51_ble.connect('nRF51-BLE400', // BLE name
tekasijimo 19:02bb67cb303c 67
tekasijimo 19:02bb67cb303c 68 // GATT service and characteristic UUIDs
tekasijimo 19:02bb67cb303c 69 const UUID nRF51_GATT_SERVICE = UUID((uint8_t *)"nRF51-DK "); //Decided not edit it too
tekasijimo 19:02bb67cb303c 70 const UUID nRF51_GATT_CHAR_BUTTON = UUID((uint8_t *)"nRF51-DK button "); //Better not edit this, or need fix on Evothings APP <nordic-nRF51-ble.js> look ~ #108 device.setNotification..
tekasijimo 19:02bb67cb303c 71 const UUID nRF51_GATT_CHAR_LED = UUID((uint8_t *)"nRF51-DK led "); //Better not edit this, or need fix on Evothings APP <nordic-nRF51-ble.js> look ~ #93 device.writeDataArray..
tekasijimo 19:02bb67cb303c 72
tekasijimo 19:02bb67cb303c 73 #define CHARACTERISTIC_BUTTON 0
tekasijimo 19:02bb67cb303c 74 #define CHARACTERISTIC_LED 1
tekasijimo 19:02bb67cb303c 75 #define CHARACTERISTIC_COUNT 2
tekasijimo 19:02bb67cb303c 76
tekasijimo 19:02bb67cb303c 77 // our bluetooth smart objects
tekasijimo 19:02bb67cb303c 78 BLE ble;
tekasijimo 19:02bb67cb303c 79 GattService *gatt_service;
tekasijimo 19:02bb67cb303c 80 GattCharacteristic *gatt_characteristics[CHARACTERISTIC_COUNT];
tekasijimo 19:02bb67cb303c 81 uint8_t gatt_char_value[CHARACTERISTIC_COUNT];
tekasijimo 19:02bb67cb303c 82
tekasijimo 19:02bb67cb303c 83 #ifdef CONSOLE_LOG
tekasijimo 19:02bb67cb303c 84 Serial pc(USBTX,USBRX);
tekasijimo 19:02bb67cb303c 85 #endif
tekasijimo 19:02bb67cb303c 86
tekasijimo 19:02bb67cb303c 87 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 88 // button handling
tekasijimo 19:02bb67cb303c 89 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 90
tekasijimo 19:02bb67cb303c 91 // define our digital in values we will be using for the characteristic
tekasijimo 19:02bb67cb303c 92 //WaveShare BLE400 digital inputs as Button inputs
tekasijimo 19:02bb67cb303c 93 DigitalIn button1(P0_16); //KEY1
tekasijimo 19:02bb67cb303c 94 DigitalIn button2(P0_17); //KEY2
tekasijimo 19:02bb67cb303c 95 //DigitalIn button3(P0_14); //Should not used for WaveShare BLE400
tekasijimo 19:02bb67cb303c 96 //DigitalIn button4(P0_15); //Should not used for WaveShare BLE400
tekasijimo 19:02bb67cb303c 97
tekasijimo 19:02bb67cb303c 98 uint8_t button_new_value = 0;
tekasijimo 19:02bb67cb303c 99 uint8_t button_old_value = button_new_value;
tekasijimo 19:02bb67cb303c 100
tekasijimo 19:02bb67cb303c 101 void monitorButtons()
tekasijimo 19:02bb67cb303c 102 {
tekasijimo 19:02bb67cb303c 103 // read in the buttons, mapped into nibble (0000 = all off, 1111 = all on)
tekasijimo 19:02bb67cb303c 104 button_new_value = 0;
tekasijimo 19:02bb67cb303c 105 button_new_value |= (button1.read() != 1); button_new_value <<= 1;
tekasijimo 19:02bb67cb303c 106 button_new_value |= (button2.read() != 1); button_new_value <<= 1;
tekasijimo 19:02bb67cb303c 107 //Should not used for WaveShare BLE400
tekasijimo 19:02bb67cb303c 108 /*
tekasijimo 19:02bb67cb303c 109 button_new_value |= (button3.read() != 1); button_new_value <<= 1;
tekasijimo 19:02bb67cb303c 110 button_new_value |= (button4.read() != 1);
tekasijimo 19:02bb67cb303c 111 */
tekasijimo 19:02bb67cb303c 112 // set the updated value of the characteristic if data has changed
tekasijimo 19:02bb67cb303c 113 if (button_new_value != button_old_value)
tekasijimo 19:02bb67cb303c 114 {
tekasijimo 19:02bb67cb303c 115 ble.updateCharacteristicValue(
tekasijimo 19:02bb67cb303c 116 gatt_characteristics[CHARACTERISTIC_BUTTON] -> getValueHandle(),
tekasijimo 19:02bb67cb303c 117 &button_new_value, sizeof(button_new_value));
tekasijimo 19:02bb67cb303c 118 button_old_value = button_new_value;
tekasijimo 19:02bb67cb303c 119
tekasijimo 19:02bb67cb303c 120 INFO_NL(" button state: [0x%02x]", button_new_value);
tekasijimo 19:02bb67cb303c 121 }
tekasijimo 19:02bb67cb303c 122 }
tekasijimo 19:02bb67cb303c 123
tekasijimo 19:02bb67cb303c 124 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 125 // LED handling
tekasijimo 19:02bb67cb303c 126 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 127 //WaveShare BLE400 digital outputs as LED outputs
tekasijimo 19:02bb67cb303c 128 DigitalOut led1(P0_18);
tekasijimo 19:02bb67cb303c 129 DigitalOut led2(P0_19);
tekasijimo 19:02bb67cb303c 130 DigitalOut led3(P0_20);
tekasijimo 19:02bb67cb303c 131 DigitalOut led4(P0_21);
tekasijimo 19:02bb67cb303c 132 DigitalOut led5(P0_22); //Used here to view BLE connect/disconnect
tekasijimo 19:02bb67cb303c 133
tekasijimo 19:02bb67cb303c 134 uint8_t led_value = 0;
tekasijimo 19:02bb67cb303c 135
tekasijimo 19:02bb67cb303c 136 //Adapted for WaveShare BLE400, LED_ON = HIGH (NRF51822-DK vice versa LED_ON = LOW)
tekasijimo 19:02bb67cb303c 137 void onLedDataWritten(const uint8_t* value, uint8_t length)
tekasijimo 19:02bb67cb303c 138 {
tekasijimo 19:02bb67cb303c 139 // we only care about a single byte
tekasijimo 19:02bb67cb303c 140 led_value = value[0];
tekasijimo 19:02bb67cb303c 141
tekasijimo 19:02bb67cb303c 142 // depending on the value coming through; set/unset LED's
tekasijimo 19:02bb67cb303c 143 if ((led_value & 0x01) != 0) led1.write(1); else led1.write(0);
tekasijimo 19:02bb67cb303c 144 if ((led_value & 0x02) != 0) led2.write(1); else led2.write(0);
tekasijimo 19:02bb67cb303c 145 if ((led_value & 0x04) != 0) led3.write(1); else led3.write(0);
tekasijimo 19:02bb67cb303c 146 if ((led_value & 0x08) != 0) led4.write(1); else led4.write(0);
tekasijimo 19:02bb67cb303c 147
tekasijimo 19:02bb67cb303c 148 INFO_NL(" led state: [0x%02x]", led_value);
tekasijimo 19:02bb67cb303c 149 }
tekasijimo 19:02bb67cb303c 150
tekasijimo 19:02bb67cb303c 151 //-------------------------------------------------------------------------
tekasijimo 19:02bb67cb303c 152
tekasijimo 19:02bb67cb303c 153 void onConnection(const Gap::ConnectionCallbackParams_t *params)
tekasijimo 19:02bb67cb303c 154 {
tekasijimo 19:02bb67cb303c 155 INFO_NL(">> connected");
tekasijimo 19:02bb67cb303c 156
tekasijimo 19:02bb67cb303c 157 // set the initial values of the characteristics (for every session)
tekasijimo 19:02bb67cb303c 158 //led_value = 0;
tekasijimo 19:02bb67cb303c 159 onLedDataWritten(&led_value, 1); // force LED's to be in off state
tekasijimo 19:02bb67cb303c 160 //LED5=ON on connection (for BLE400)
tekasijimo 19:02bb67cb303c 161 led5.write(1);
tekasijimo 19:02bb67cb303c 162 }
tekasijimo 19:02bb67cb303c 163
tekasijimo 19:02bb67cb303c 164 void onDataWritten(const GattWriteCallbackParams *context)
tekasijimo 19:02bb67cb303c 165 {
tekasijimo 19:02bb67cb303c 166 // was the characteristic being written to nRF51_GATT_CHAR_LED?
tekasijimo 19:02bb67cb303c 167 if (context -> handle ==
tekasijimo 19:02bb67cb303c 168 gatt_characteristics[CHARACTERISTIC_LED] -> getValueHandle())
tekasijimo 19:02bb67cb303c 169 {
tekasijimo 19:02bb67cb303c 170 onLedDataWritten(context -> data, context -> len);
tekasijimo 19:02bb67cb303c 171 }
tekasijimo 19:02bb67cb303c 172 }
tekasijimo 19:02bb67cb303c 173
tekasijimo 19:02bb67cb303c 174 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
tekasijimo 19:02bb67cb303c 175 {
tekasijimo 19:02bb67cb303c 176 INFO_NL(">> disconnected");
tekasijimo 19:02bb67cb303c 177 ble.gap().startAdvertising(); // restart advertising
tekasijimo 19:02bb67cb303c 178 INFO_NL(">> device advertising");
tekasijimo 19:02bb67cb303c 179 //LED5=OFF on diconnection (for BLE400)
tekasijimo 19:02bb67cb303c 180 led5.write(0);
tekasijimo 19:02bb67cb303c 181 }
tekasijimo 19:02bb67cb303c 182
tekasijimo 19:02bb67cb303c 183
tekasijimo 19:02bb67cb303c 184 int main()
tekasijimo 19:02bb67cb303c 185 {
tekasijimo 19:02bb67cb303c 186 #ifdef CONSOLE_LOG
tekasijimo 19:02bb67cb303c 187 // wait a second before trying to write something to console
tekasijimo 19:02bb67cb303c 188 wait(1);
tekasijimo 19:02bb67cb303c 189 #endif
tekasijimo 19:02bb67cb303c 190 INFO_NL(">> nRF51-BLE400 start");
tekasijimo 19:02bb67cb303c 191
tekasijimo 19:02bb67cb303c 192 // create our button characteristic (read, notify)
tekasijimo 19:02bb67cb303c 193 gatt_characteristics[CHARACTERISTIC_BUTTON] =
tekasijimo 19:02bb67cb303c 194 new GattCharacteristic(
tekasijimo 19:02bb67cb303c 195 nRF51_GATT_CHAR_BUTTON,
tekasijimo 19:02bb67cb303c 196 &gatt_char_value[CHARACTERISTIC_BUTTON], 1, 1,
tekasijimo 19:02bb67cb303c 197 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
tekasijimo 19:02bb67cb303c 198 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
tekasijimo 19:02bb67cb303c 199
tekasijimo 19:02bb67cb303c 200 // create our LED characteristic (read, write)
tekasijimo 19:02bb67cb303c 201 gatt_characteristics[CHARACTERISTIC_LED] =
tekasijimo 19:02bb67cb303c 202 new GattCharacteristic(
tekasijimo 19:02bb67cb303c 203 nRF51_GATT_CHAR_LED,
tekasijimo 19:02bb67cb303c 204 &gatt_char_value[CHARACTERISTIC_LED], 1, 1,
tekasijimo 19:02bb67cb303c 205 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |
tekasijimo 19:02bb67cb303c 206 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
tekasijimo 19:02bb67cb303c 207 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
tekasijimo 19:02bb67cb303c 208
tekasijimo 19:02bb67cb303c 209 // create our service, with both characteristics
tekasijimo 19:02bb67cb303c 210 gatt_service =
tekasijimo 19:02bb67cb303c 211 new GattService(nRF51_GATT_SERVICE,
tekasijimo 19:02bb67cb303c 212 gatt_characteristics, CHARACTERISTIC_COUNT);
tekasijimo 19:02bb67cb303c 213
tekasijimo 19:02bb67cb303c 214 // initialize our ble device
tekasijimo 19:02bb67cb303c 215 ble.init();
tekasijimo 19:02bb67cb303c 216 ble.gap().setDeviceName((uint8_t *)DEVICE_NAME);
tekasijimo 19:02bb67cb303c 217 INFO_NL(">> initialized device '%s'", DEVICE_NAME);
tekasijimo 19:02bb67cb303c 218
tekasijimo 19:02bb67cb303c 219 // configure our advertising type, payload and interval
tekasijimo 19:02bb67cb303c 220 ble.gap().accumulateAdvertisingPayload(
tekasijimo 19:02bb67cb303c 221 GapAdvertisingData::BREDR_NOT_SUPPORTED |
tekasijimo 19:02bb67cb303c 222 GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
tekasijimo 19:02bb67cb303c 223 ble.gap().accumulateAdvertisingPayload(
tekasijimo 19:02bb67cb303c 224 GapAdvertisingData::COMPLETE_LOCAL_NAME,
tekasijimo 19:02bb67cb303c 225 (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
tekasijimo 19:02bb67cb303c 226 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
tekasijimo 19:02bb67cb303c 227 ble.gap().setAdvertisingInterval(160); // 100ms
tekasijimo 19:02bb67cb303c 228 INFO_NL(">> configured advertising type, payload and interval");
tekasijimo 19:02bb67cb303c 229
tekasijimo 19:02bb67cb303c 230 // configure our callbacks
tekasijimo 19:02bb67cb303c 231 ble.gap().onDisconnection(disconnectionCallback);
tekasijimo 19:02bb67cb303c 232 ble.gap().onConnection(onConnection);
tekasijimo 19:02bb67cb303c 233 ble.onDataWritten(onDataWritten);
tekasijimo 19:02bb67cb303c 234 INFO_NL(">> registered for callbacks");
tekasijimo 19:02bb67cb303c 235
tekasijimo 19:02bb67cb303c 236 // add our gatt service with two characteristics
tekasijimo 19:02bb67cb303c 237 ble.addService(*gatt_service);
tekasijimo 19:02bb67cb303c 238 INFO_NL(">> added GATT service with two characteristics");
tekasijimo 19:02bb67cb303c 239
tekasijimo 19:02bb67cb303c 240 // show some debugging information about service/characteristics
tekasijimo 19:02bb67cb303c 241 INFO_UUID(" ", nRF51_GATT_SERVICE);
tekasijimo 19:02bb67cb303c 242 INFO_UUID(" :", nRF51_GATT_CHAR_BUTTON);
tekasijimo 19:02bb67cb303c 243 INFO_UUID(" :", nRF51_GATT_CHAR_LED);
tekasijimo 19:02bb67cb303c 244
tekasijimo 19:02bb67cb303c 245 // start advertising
tekasijimo 19:02bb67cb303c 246 ble.gap().startAdvertising();
tekasijimo 19:02bb67cb303c 247 INFO_NL(">> device advertising");
tekasijimo 19:02bb67cb303c 248
tekasijimo 19:02bb67cb303c 249 // start monitoring the buttons and posting new values
tekasijimo 19:02bb67cb303c 250 Ticker ticker;
tekasijimo 19:02bb67cb303c 251 ticker.attach(monitorButtons, 0.1); // every 10th of a second
tekasijimo 19:02bb67cb303c 252 INFO_NL(">> monitoring button state");
tekasijimo 19:02bb67cb303c 253
tekasijimo 19:02bb67cb303c 254 // let the device do its thing
tekasijimo 19:02bb67cb303c 255 INFO_NL(">> waiting for events ");
tekasijimo 19:02bb67cb303c 256 for (;;)
tekasijimo 19:02bb67cb303c 257 {
tekasijimo 19:02bb67cb303c 258 ble.waitForEvent();
tekasijimo 19:02bb67cb303c 259 }
tekasijimo 19:02bb67cb303c 260 }
tekasijimo 19:02bb67cb303c 261
tekasijimo 19:02bb67cb303c 262 //-------------------------------------------------------------------------