Page 1 of 1
Arduino ble example with Bluegiga 112
Posted: 22:37, 28 Jan 2015
by artlover5781
Hello All,
I would like to create an application for my ios device, using the Arduino ble example
https://github.com/evothings/evothings-examples/tree/master/examples/arduino-ble. From what I have read this example only works with readbear shield, I currently am using the tinyduino ble shield with a tinyduino which is an arduino compatible device and is programmed within the Arduino IDE. This Shield uses a bluegiga 112 chip, is there support for this within the app and does anyone know how I would make it work? the bleshield and its info can be found:
https://tiny-circuits.com/tiny-shield-bluetooth-low-energy.html and the code for the ble board will be found:
https://tiny-circuits.com/learn/tinyshield-ble2
Re: Arduino ble example with Bluegiga 112
Posted: 14:34, 31 Jan 2015
by ardiri
the following page would be a great start:
https://tiny-circuits.com/learn/tinyshield-ble2ultimately; once you have the communication handlers written for the arduino - you simply need to know the respective UUID's to connect to from the mobile device; you can use a third party tool to identify what these UUID's are and experiment from that perspective. LightBlue (
https://itunes.apple.com/us/app/lightbl ... 4780?mt=12) for Mac OSX works well - should be similar tools for Linux and Windows as well.
Re: Arduino ble example with Bluegiga 112
Posted: 16:37, 31 Jan 2015
by artlover5781
Hello Ardiri,
Thank you for your reply. I have already completed these steps. My ble shield connects to BLE discovery apllications like bluegiga etc. I have also found the respective service UUID and the TX RX UUID. The issue I am having is making the application work with my peripheral and the transmission of information between my arduino through BLE serial communication and the mobile application.
Re: Arduino ble example with Bluegiga 112
Posted: 17:00, 31 Jan 2015
by ardiri
have you changed the UUID's in the evothings example?
https://github.com/evothings/evothings- ... app/app.jsspecifically; lines 229, 233, 242 and 243? if the device supports serial communication over BLE this should be the only thing you need to do.
Re: Arduino ble example with Bluegiga 112
Posted: 18:31, 31 Jan 2015
by artlover5781
I am getting three sets of UUIDs from the BLE discovery applications:
Services UUID, TX UUID, RX UUID
I have changed the UUIDs in evothings app to my peripheral's UUIDS:
on lines 229, 234, 244 I have changed it to my services UUID what about line 247 what is the descriptor UUID?
Also I believe it might be an issue with my Arduino code, I am also experimenting with the chat example found
https://github.com/don/BluetoothSerial/tree/master/examples/Chat. I am able to get this example to connect to my peripheral along with deploying it to my mobile ios device. I am having trouble with this as well with the ardunio code. Along with the standard arduino code to get the BLE shield working I have added 2 sensors and an accelerometer. I would like for the sensor values to be transmitted to the phone. here is my arduino code.
Code: Select all
//include The BLE files
#include <SoftwareSerial.h>
#include "BGLib.h"
#define DEBUG
//END include The BLE files
//include The Accelerometer files
#include <Wire.h>
#include "BMA250.h"
BMA250 accel;
// END include The Accelerometer files
// ================================================================
// BLE STATE TRACKING (UNIVERSAL TO JUST ABOUT ANY BLE PROJECT)
// ================================================================
// BLE state machine definitions
#define BLE_STATE_STANDBY 0
#define BLE_STATE_SCANNING 1
#define BLE_STATE_ADVERTISING 2
#define BLE_STATE_CONNECTING 3
#define BLE_STATE_CONNECTED_MASTER 4
#define BLE_STATE_CONNECTED_SLAVE 5
// BLE state/link status tracker
uint8_t ble_state = BLE_STATE_STANDBY;
uint8_t ble_encrypted = 0; // 0 = not encrypted, otherwise = encrypted
uint8_t ble_bonding = 0xFF; // 0xFF = no bonding, otherwise = bonding handle
// ================================================================
// HARDWARE CONNECTIONS AND GATT STRUCTURE SETUP
// ================================================================
// NOTE: this assumes you are using one of the following firmwares:
// - BGLib_U1A1P_38400_noflow
// - BGLib_U1A1P_38400_noflow_wake16
// - BGLib_U1A1P_38400_noflow_wake16_hwake15
// If not, then you may need to change the pin assignments and/or
// GATT handles to match your firmware.
#define LED_PIN 13 // Arduino Uno LED pin
#define GATT_HANDLE_C_RX_DATA 17 // 0x11, supports "write" operation
#define GATT_HANDLE_C_TX_DATA 20 // 0x14, supports "read" and "indicate" operations
// use SoftwareSerial on pins D3/D4 for RX/TX (Arduino side)
SoftwareSerial bleSerialPort(3, 4);
// create BGLib object:
// - use SoftwareSerial por for module comms
// - use nothing for passthrough comms (0 = null pointer)
// - enable packet mode on API protocol since flow control is unavailable
BGLib ble112((HardwareSerial *)&bleSerialPort, 0, 1);
#define BGAPI_GET_RESPONSE(v, dType) dType *v = (dType *)ble112.getLastRXPayload()
// ================================================================
// ARDUINO APPLICATION SETUP AND LOOP FUNCTIONS
// ================================================================
void setup()
{
Serial.begin(115200);
Wire.begin();
accel.begin(BMA250_range_2g, BMA250_update_time_32ms);
// initialize status LED
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// set up internal status handlers (these are technically optional)
ble112.onBusy = onBusy;
ble112.onIdle = onIdle;
ble112.onTimeout = onTimeout;
// ONLY enable these if you are using the <wakeup_pin> parameter in your firmware's hardware.xml file
// BLE module must be woken up before sending any UART data
//ble112.onBeforeTXCommand = onBeforeTXCommand;
//ble112.onTXCommandComplete = onTXCommandComplete;
// set up BGLib event handlers
ble112.ble_evt_system_boot = my_ble_evt_system_boot;
ble112.ble_evt_connection_status = my_ble_evt_connection_status;
ble112.ble_evt_connection_disconnected = my_ble_evt_connection_disconnect;
ble112.ble_evt_attributes_value = my_ble_evt_attributes_value;
// open Arduino USB serial (and wait, if we're using Leonardo)
// use 38400 since it works at 8MHz as well as 16MHz
Serial.begin(38400);
while (!Serial);
// open BLE software serial port
bleSerialPort.begin(38400);
my_ble_evt_system_boot( NULL);
}
unsigned char buf[16] = {0};
unsigned char len = 0;
void loop()
{
// delay(1000);
// int sensorValue1 = analogRead(A0);
// delay(1000);
// int sensorValue2 = analogRead(A1);
//
// // print out the value you read:
// Serial.print("value1= " );
// Serial.print(sensorValue1);
//
// Serial.print(" value2 = " );
// Serial.println(sensorValue2);
// accel.read();
// //Print out the accelerometer data
// Serial.print("x: ");
// Serial.print(accel.X);
// Serial.print(", y: ");
// Serial.print(accel.Y);
// Serial.print(", z:");
// Serial.print(accel.Z);
// Serial.print(", t: ");
// Serial.print(accel.rawTemp/2 + 24);
// Serial.println("degC");
//
// delay(1000);
if (bleSerialPort.available()) {
int sensorValue1 = analogRead(A0);
int sensorValue2 = analogRead(A1);
bleSerialPort.write(sensorValue1);
bleSerialPort.write(sensorValue2);
}
//Send data to cordova app
//
// if ( bleSerialPort.available()) {
// Serial.write("Them: ");
// while ( bleSerialPort.available()) {
// Serial.write( bleSerialPort.read());
// }
// }
//
// while (Serial.available()) {
// unsigned char c = Serial.read();
// if (c == 0xA || c == 0xD) { // \n or \r
// sendData();
// } else {
// bufferData(c);
// }
// }
//}
//
//void bufferData(char c) {
// if (len < 16) {
// buf[len++] = c;
// } // TODO warn, or send data
//}
//
//void sendData() {
// Serial.write("Us: ");
// for (int i = 0; i < len; i++) {
// bleSerialPort.write(buf[i]);
// Serial.write(buf[i]);
// }
// bleSerialPort.write(0xA);
// Serial.write(0xA); // TODO test on windows
// len = 0;
// END Send data to cordova app
// keep polling for new data from BLE
ble112.checkActivity();
// blink Arduino LED based on state:
// - solid = STANDBY
// - 1 pulse per second = ADVERTISING
// - 2 pulses per second = CONNECTED_SLAVE
// - 3 pulses per second = CONNECTED_SLAVE with encryption
uint16_t slice = millis() % 1000;
if (ble_state == BLE_STATE_STANDBY) {
digitalWrite(LED_PIN, HIGH);
} else if (ble_state == BLE_STATE_ADVERTISING) {
digitalWrite(LED_PIN, slice < 100);
} else if (ble_state == BLE_STATE_CONNECTED_SLAVE) {
if (!ble_encrypted) {
digitalWrite(LED_PIN, slice < 100 || (slice > 200 && slice < 300));
} else {
digitalWrite(LED_PIN, slice < 100 || (slice > 200 && slice < 300) || (slice > 400 && slice < 500));
}
}
}
// ================================================================
// INTERNAL BGLIB CLASS CALLBACK FUNCTIONS
// ================================================================
// called when the module begins sending a command
void onBusy() {
// turn LED on when we're busy
//digitalWrite(LED_PIN, HIGH);
}
// called when the module receives a complete response or "system_boot" event
void onIdle() {
// turn LED off when we're no longer busy
//digitalWrite(LED_PIN, LOW);
}
// called when the parser does not read the expected response in the specified time limit
void onTimeout() {
// reset module (might be a bit drastic for a timeout condition though)
}
// called immediately before beginning UART TX of a command
void onBeforeTXCommand() {
// wake module up (assuming here that digital pin 5 is connected to the BLE wake-up pin)
// give a bit of a gap between parsing the wake-up event and allowing the command to go out
delayMicroseconds(1000);
}
// called immediately after finishing UART TX
void onTXCommandComplete() {
// allow module to return to sleep (assuming here that digital pin 5 is connected to the BLE wake-up pin)
// digitalWrite(BLE_WAKEUP_PIN, LOW);
}
// ================================================================
// APPLICATION EVENT HANDLER FUNCTIONS
// ================================================================
void my_ble_evt_system_boot(const ble_msg_system_boot_evt_t *msg) {
#ifdef DEBUG
Serial.print("###\tsystem_boot: { ");
Serial.print("major: "); Serial.print(msg -> major, HEX);
Serial.print(", minor: "); Serial.print(msg -> minor, HEX);
Serial.print(", patch: "); Serial.print(msg -> patch, HEX);
Serial.print(", build: "); Serial.print(msg -> build, HEX);
Serial.print(", ll_version: "); Serial.print(msg -> ll_version, HEX);
Serial.print(", protocol_version: "); Serial.print(msg -> protocol_version, HEX);
Serial.print(", hw: "); Serial.print(msg -> hw, HEX);
Serial.println(" }");
#endif
// system boot means module is in standby state
//ble_state = BLE_STATE_STANDBY;
// ^^^ skip above since we're going right back into advertising below
// set advertisement interval to 200-300ms, use all advertisement channels
// (note min/max parameters are in units of 625 uSec)
ble112.ble_cmd_gap_set_adv_parameters(320, 480, 7);
while (ble112.checkActivity(1000));
// USE THE FOLLOWING TO LET THE BLE STACK HANDLE YOUR ADVERTISEMENT PACKETS
// ========================================================================
// start advertising general discoverable / undirected connectable
// ble112.ble_cmd_gap_set_mode(BGLIB_GAP_GENERAL_DISCOVERABLE, BGLIB_GAP_UNDIRECTED_CONNECTABLE);
//while (ble112.checkActivity(1000));
// USE THE FOLLOWING TO HANDLE YOUR OWN CUSTOM ADVERTISEMENT PACKETS
// =================================================================
#if 1
// build custom advertisement data
// default BLE stack value: 0201061107e4ba94c3c9b7cdb09b487a438ae55a19
uint8 adv_data[] = {
0x02, // field length
BGLIB_GAP_AD_TYPE_FLAGS, // field type (0x01)
BGLIB_GAP_AD_FLAG_GENERAL_DISCOVERABLE | BGLIB_GAP_AD_FLAG_BREDR_NOT_SUPPORTED, // data (0x02 | 0x04 = 0x06)
0x11, // field length
BGLIB_GAP_AD_TYPE_SERVICES_128BIT_ALL, // field type (0x07)
0xe4, 0xba, 0x94, 0xc3, 0xc9, 0xb7, 0xcd, 0xb0, 0x9b, 0x48, 0x7a, 0x43, 0x8a, 0xe5, 0x5a, 0x19
};
// set custom advertisement data
ble112.ble_cmd_gap_set_adv_data(0, 0x15, adv_data);
while (ble112.checkActivity(1000));
// build custom scan response data (i.e. the Device Name value)
// default BLE stack value: 140942474c69622055314131502033382e344e4657
uint8 sr_data[] = {
0x14, // field length
BGLIB_GAP_AD_TYPE_LOCALNAME_COMPLETE, // field type
'M', 'y', ' ', 'A', 'r', 'd', 'u', 'i', 'n', 'o', ' ', '0', '0', ':', '0', '0', ':', '0', '0'
};
// get BLE MAC address
ble112.ble_cmd_system_address_get();
while (ble112.checkActivity(1000));
BGAPI_GET_RESPONSE(r0, ble_msg_system_address_get_rsp_t);
// assign last three bytes of MAC address to ad packet friendly name (instead of 00:00:00 above)
sr_data[13] = (r0 -> address.addr[2] / 0x10) + 48 + ((r0 -> address.addr[2] / 0x10) / 10 * 7); // MAC byte 4 10's digit
sr_data[14] = (r0 -> address.addr[2] & 0xF) + 48 + ((r0 -> address.addr[2] & 0xF ) / 10 * 7); // MAC byte 4 1's digit
sr_data[16] = (r0 -> address.addr[1] / 0x10) + 48 + ((r0 -> address.addr[1] / 0x10) / 10 * 7); // MAC byte 5 10's digit
sr_data[17] = (r0 -> address.addr[1] & 0xF) + 48 + ((r0 -> address.addr[1] & 0xF ) / 10 * 7); // MAC byte 5 1's digit
sr_data[19] = (r0 -> address.addr[0] / 0x10) + 48 + ((r0 -> address.addr[0] / 0x10) / 10 * 7); // MAC byte 6 10's digit
sr_data[20] = (r0 -> address.addr[0] & 0xF) + 48 + ((r0 -> address.addr[0] & 0xF ) / 10 * 7); // MAC byte 6 1's digit
// set custom scan response data (i.e. the Device Name value)
ble112.ble_cmd_gap_set_adv_data(1, 0x15, sr_data);
while (ble112.checkActivity(1000));
// put module into discoverable/connectable mode (with user-defined advertisement data)
ble112.ble_cmd_gap_set_mode(BGLIB_GAP_USER_DATA, BGLIB_GAP_UNDIRECTED_CONNECTABLE);
while (ble112.checkActivity(1000));
#endif
// set state to ADVERTISING
ble_state = BLE_STATE_ADVERTISING;
}
void my_ble_evt_connection_status(const ble_msg_connection_status_evt_t *msg) {
#ifdef DEBUG
Serial.print("###\tconnection_status: { ");
Serial.print("connection: "); Serial.print(msg -> connection, HEX);
Serial.print(", flags: "); Serial.print(msg -> flags, HEX);
Serial.print(", address: ");
// this is a "bd_addr" data type, which is a 6-byte uint8_t array
for (uint8_t i = 0; i < 6; i++) {
if (msg -> address.addr[i] < 16) Serial.write('0');
Serial.print(msg -> address.addr[i], HEX);
}
Serial.print(", address_type: "); Serial.print(msg -> address_type, HEX);
Serial.print(", conn_interval: "); Serial.print(msg -> conn_interval, HEX);
Serial.print(", timeout: "); Serial.print(msg -> timeout, HEX);
Serial.print(", latency: "); Serial.print(msg -> latency, HEX);
Serial.print(", bonding: "); Serial.print(msg -> bonding, HEX);
Serial.println(" }");
#endif
// "flags" bit description:
// - bit 0: connection_connected
// Indicates the connection exists to a remote device.
// - bit 1: connection_encrypted
// Indicates the connection is encrypted.
// - bit 2: connection_completed
// Indicates that a new connection has been created.
// - bit 3; connection_parameters_change
// Indicates that connection parameters have changed, and is set
// when parameters change due to a link layer operation.
// check for new connection established
if ((msg -> flags & 0x05) == 0x05) {
// track state change based on last known state, since we can connect two ways
if (ble_state == BLE_STATE_ADVERTISING) {
ble_state = BLE_STATE_CONNECTED_SLAVE;
} else {
ble_state = BLE_STATE_CONNECTED_MASTER;
}
}
// update "encrypted" status
ble_encrypted = msg -> flags & 0x02;
// update "bonded" status
ble_bonding = msg -> bonding;
}
void my_ble_evt_connection_disconnect(const struct ble_msg_connection_disconnected_evt_t *msg) {
#ifdef DEBUG
Serial.print("###\tconnection_disconnect: { ");
Serial.print("connection: "); Serial.print(msg -> connection, HEX);
Serial.print(", reason: "); Serial.print(msg -> reason, HEX);
Serial.println(" }");
#endif
// set state to DISCONNECTED
//ble_state = BLE_STATE_DISCONNECTED;
// ^^^ skip above since we're going right back into advertising below
// after disconnection, resume advertising as discoverable/connectable
//ble112.ble_cmd_gap_set_mode(BGLIB_GAP_GENERAL_DISCOVERABLE, BGLIB_GAP_UNDIRECTED_CONNECTABLE);
//while (ble112.checkActivity(1000));
// after disconnection, resume advertising as discoverable/connectable (with user-defined advertisement data)
ble112.ble_cmd_gap_set_mode(BGLIB_GAP_USER_DATA, BGLIB_GAP_UNDIRECTED_CONNECTABLE);
while (ble112.checkActivity(1000));
// set state to ADVERTISING
ble_state = BLE_STATE_ADVERTISING;
// clear "encrypted" and "bonding" info
ble_encrypted = 0;
ble_bonding = 0xFF;
}
void my_ble_evt_attributes_value(const struct ble_msg_attributes_value_evt_t *msg) {
#ifdef DEBUG
Serial.print("###\tattributes_value: { ");
Serial.print("connection: "); Serial.print(msg -> connection, HEX);
Serial.print(", reason: "); Serial.print(msg -> reason, HEX);
Serial.print(", handle: "); Serial.print(msg -> handle, HEX);
Serial.print(", offset: "); Serial.print(msg -> offset, HEX);
Serial.print(", value_len: "); Serial.print(msg -> value.len, HEX);
Serial.print(", value_data: ");
// this is a "uint8array" data type, which is a length byte and a uint8_t* pointer
for (uint8_t i = 0; i < msg -> value.len; i++) {
if (msg -> value.data[i] < 16) Serial.write('0');
Serial.print(msg -> value.data[i], HEX);
}
Serial.println(" }");
#endif
// check for data written to "c_rx_data" handle
if (msg -> handle == GATT_HANDLE_C_RX_DATA && msg -> value.len > 0) {
// set ping 8, 9, and 10 to three lower-most bits of first byte of RX data
// (nice for controlling RGB LED or something)
digitalWrite(8, msg -> value.data[0] & 0x01);
digitalWrite(9, msg -> value.data[0] & 0x02);
digitalWrite(10, msg -> value.data[0] & 0x04);
}
}
Re: Arduino ble example with Bluegiga 112
Posted: 10:33, 02 Feb 2015
by ardiri
i've got contact with the tinyduino guys and have requested a BLE module myself so we can look into this - i participated in their tinyscreen kickstarter and received some hardware via that.
Re: Arduino ble example with Bluegiga 112
Posted: 17:51, 02 Feb 2015
by artlover5781
YOU GUYS ARE AMAZING thank you!
Re: Arduino ble example with Bluegiga 112
Posted: 10:21, 17 May 2015
by Thea
Hallo together,
are there any news about this subject. I'm interested to do the same.
An evothings example with the Tinyduino BLE-Board would be Amazing.
Thank you!
Re: Arduino ble example with Bluegiga 112
Posted: 21:18, 01 Jun 2015
by Thea
Sorry for asking again.
But it would be so helpful to know if something is already planned, because i m absolutly new to app development.
I have some deadline, so otherwise i need to change my plans.
Please let me know if some Tinyduino Example is coming and if yes, around what time I can hope for it.
Thank you really much !