Skip to content

Instantly share code, notes, and snippets.

@gparuthi
Last active December 13, 2016 01:15
Show Gist options
  • Save gparuthi/2296cb6d8901a437ada5264aa53b3bd3 to your computer and use it in GitHub Desktop.
Save gparuthi/2296cb6d8901a437ada5264aa53b3bd3 to your computer and use it in GitHub Desktop.
BLE_SimpleChat example for Readbear BLE NANO adapted to send potentiometer.
#include <BLE_API.h>
#define DEVICE_NAME "PotentiometerToChat"
#define TXRX_BUF_LEN 20
#define DEVICE_ID 0xFF
BLE ble;
const int SOFT_POT_PIN = A3; // Pin connected to softpot wiper
const int GRAPH_LENGTH = 40; // Length of line graph
// The uuid of service and characteristics
static const uint8_t service1_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
static const uint8_t service1_chars1_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
static const uint8_t service1_chars2_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
uint8_t chars1_value[TXRX_BUF_LEN] = {0};
uint8_t chars2_value[TXRX_BUF_LEN] = {0};
// Create characteristic and service
GattCharacteristic characteristic1(service1_chars1_uuid, chars1_value, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE );
GattCharacteristic characteristic2(service1_chars2_uuid, chars2_value, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
GattCharacteristic *uartChars[] = {&characteristic1, &characteristic2};
GattService uartService(service1_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
void disconnectionCallBack(const Gap::DisconnectionCallbackParams_t *params) {
ble.startAdvertising();
}
void gattServerWriteCallBack(const GattWriteCallbackParams *Handler) {
uint8_t buf[TXRX_BUF_LEN];
uint16_t bytesRead, index;
Serial.println("Write Handle : ");
if (Handler->handle == characteristic1.getValueAttribute().getHandle()) {
ble.readCharacteristicValue(characteristic1.getValueAttribute().getHandle(), buf, &bytesRead);
for(index=0; index<bytesRead; index++)
{
Serial.print(buf[index], HEX);
}
// write_handle();
}
}
void setup() {
// put your setup code here, to run once
Serial.begin(9600);
Serial.println("Start ");
// ticker_task1.attach(sendMessage, 2);
ble.init();
ble.onDisconnection(disconnectionCallBack);
ble.onDataWritten(gattServerWriteCallBack);
// setup adv_data and srp_data
ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
(const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
(const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid_rev));
// set adv_type
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
// add service
ble.addService(uartService);
// set device name
ble.setDeviceName((const uint8_t *)DEVICE_NAME);
// set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
ble.setTxPower(4);
// set adv_interval, 100ms in multiples of 0.625ms.
ble.setAdvertisingInterval(160);
// set adv_timeout, in seconds
ble.setAdvertisingTimeout(0);
ble.startAdvertising();
Serial.println("start advertising ");
}
void loop() {
// put your main code here, to run repeatedly:
ble.waitForEvent();
// Read in the soft pot's ADC value
int softPotADC = analogRead(SOFT_POT_PIN);
// Map the 0-1023 value to 0-40. On testing the actual values are between 350 and 700
int softPotPosition = map(softPotADC, 350, 700, 0, GRAPH_LENGTH);
if (softPotPosition>0)
uint8_t buf[2] = {softPotPosition, (softPotPosition >> 8)}; ble.updateCharacteristicValue(characteristic2.getValueAttribute().getHandle(), buf, sizeof(buf) - 1 );
delay(500);
}

BLE Nano Tips

  • I found it hard to use interrupts
  • I use Arduino UNO to test things before putting the code to BLE Nano. This is because of the painful slow development with Nano, where compiling takes ages and then you have to remove it from USB to put it on Breadboard and back.
  • I was trying Evothings. Although buggy, it really helps with the debugging flow as it shows logs on javascript console.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment