I'm working with an Adafruit Bluefruit Feather to build a device that collects data and then sends data to an iPhone, where it is read and processed. I've taken a look at countless examples that try to explain how to program the device but I seem to have a misunderstanding on how to connect the device via Bluetooth to the iPhone.
We based this code off of one of the Adafruit examples, and we tried to incorporate the Adafruit BLE Gatt library (https://learn.adafruit.com/introducing-adafruit-ble-bluetooth-low-energy-friend/ble-gatt), but it's not working and this is our first time working with Bluetooth. The iOS code we're using is from https://github.com/nebs/hello-bluetooth. We didn't make any changes to the swift code. Any advice is welcome. We've found a lot on sending data from an app to an arduino, but limited information on sending data from an arduino to an app. If you could let us know if we are on the right track, or if there is any changes that should be made in terms of sending data it would be greatly appreciated.
The following is what I've been working with thus far:
#include <Arduino.h>
#include <SPI.h>
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
#include <SoftwareSerial.h>
#endif
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"
#include "Adafruit_BLEGatt.h"
#define FACTORYRESET_ENABLE 1
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
Adafruit_BLEGatt gatt(ble);
void error(const __FlashStringHelper*err) {
Serial.println(err);
while (1);
}
int32_t gattServiceId;
int32_t gattNotifiableCharId;
int32_t gattWritableResponseCharId;
int32_t gattWritableNoResponseCharId;
int32_t gattReadableCharId;
int32_t jumperPresentID;
void setup(void){
while (!Serial); // required for Flora & Micro
delay(500);
boolean success;
Serial.begin(115200);
randomSeed(micros());
Serial.print(F("Initialising the Bluefruit LE module: "));
if ( !ble.begin(VERBOSE_MODE) ){
error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
}
Serial.println( F("OK!") );
if ( FACTORYRESET_ENABLE ){
Serial.println(F("Performing a factory reset: "));
if ( ! ble.factoryReset() ){
error(F("Couldn't factory reset"));
}
}
ble.echo(false);
Serial.println("Requesting Bluefruit info:");
ble.info();
Serial.println(F("Adding the Custom GATT Service definition: "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDSERVICE=UUID128=00-77-13-12-10-00-00-00-00-00-EE-BA-AD-DA-BE-CF"), &gattServiceId);
if (! success) {
error(F("Could not add Custom GATT service"));
}
Serial.println(F("Adding the Notifiable characteristic: "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-67-42-01-14-88-59-77-42-42-AB-BA-DA-DA-EE-CC,PROPERTIES=0x10,MIN_LEN=1, MAX_LEN=20, VALUE=-9999"), &gattNotifiableCharId);
if (! success) {
error(F("Could not add Custom Notifiable characteristic"));
}
Serial.println(F("Adding the Writable with Response characteristic: "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-68-42-02-00-77-12-10-13-42-CC-BA-DE-FA-EA-BB,PROPERTIES=0x04,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattWritableResponseCharId);
if (! success) {
error(F("Could not add Custom Writable with Response characteristic"));
}
Serial.println(F("Adding the Writable with No Response characteristic: "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-69-42-03-00-77-12-10-13-42-CC-BA-DE-FA-EA-BC,PROPERTIES=0x08,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattWritableNoResponseCharId);
if (! success) {
error(F("Could not add Custom Writable with No Response characteristic"));
}
Serial.println(F("Adding the Readable characteristic: "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID128=00-70-42-04-00-77-12-10-13-42-CC-BA-DE-FA-EA-BD,PROPERTIES=0x02,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN"), &gattReadableCharId);
if (! success) {
error(F("Could not add Custom Readable characteristic"));
}
Serial.print(F("Adding Custom GATT Service UUID to the advertising payload: "));
ble.sendCommandCheckOK( F("AT+GAPSETADVDATA=02-01-06-03-02-12-13") );
jumperPresentID = gatt.addCharacteristic(0x04, GATT_CHARS_PROPERTIES_INDICATE, 5, 5, 5);
/* Reset the device for the new service setting changes to take effect */
Serial.print(F("Performing a SW reset (service changes require a reset): "));
ble.reset();
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
digitalWrite(A1, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
}
void loop(void){
Serial.println("VOLTAGE");
int sensorValue = analogRead(A1);
float voltage = sensorValue * (3.3 / 1023.0);
delay(2000);
Serial.println(voltage);
if(voltage == 0){
Serial.println("ALERT");
}
if(analogRead(A1) == 0 || analogRead(A2) == 0 || analogRead(A3) == 0 || analogRead(A4) == 0 || analogRead(A5) == 0){
Serial.print("one is removed");
gatt.setChar(jumperPresentID, 0, 5);
}else{
gatt.setChar(jumperPresentID, 2, 5);
}
Serial.println(voltage);
delay(2000);
}
EDIT: I've added the output from the Arduino serial port
Adafruit Bluefruit AT Command Example ------------------------------------- Initialising the Bluefruit LE module: OK! Performing a factory reset: AT+FACTORYRESET
<- OK ATE=0
<- OK Requesting Bluefruit info: ---------------- BLESPIFRIEND nRF51822 QFACA10 5953B6F51A2BE44E 0.6.7 0.6.7 Sep 17 2015 S110 8.0.0, 0.2 ---------------- Adding the Custom GATT Service definition: AT+GATTADDSERVICE=UUID128=00-77-13-12-10-00-00-00-00-00-EE-BA-AD-DA-BE-CF
<- 1
<- OK Adding the Notifiable characteristic: AT+GATTADDCHAR=UUID128=00-67-42-01-14-88-59-77-42-42-AB-BA-DA-DA-EE-CC,PROPERTIES=0x10,MIN_LEN=1, MAX_LEN=20, VALUE=-9999
<- 1
<- OK Adding the Writable with Response characteristic: AT+GATTADDCHAR=UUID128=00-68-42-02-00-77-12-10-13-42-CC-BA-DE-FA-EA-BB,PROPERTIES=0x04,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN
<- 2
<- OK Adding the Writable with No Response characteristic: AT+GATTADDCHAR=UUID128=00-69-42-03-00-77-12-10-13-42-CC-BA-DE-FA-EA-BC,PROPERTIES=0x08,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN
<- 3
<- OK Adding the Readable characteristic: AT+GATTADDCHAR=UUID128=00-70-42-04-00-77-12-10-13-42-CC-BA-DE-FA-EA-BD,PROPERTIES=0x02,MIN_LEN=1, MAX_LEN=20, VALUE=GREEN
<- 4
<- OK Adding Custom GATT Service UUID to the advertising payload: AT+GAPSETADVDATA=02-01-06-03-02-12-13
<- OK AT+GATTADDCHAR=UUID=4,PROPERTIES=32,MIN_LEN=5,MAX_LEN=5,DATATYPE=5 Option Error: DATATYPE=5
<- ERROR Performing a SW reset (service changes require a reset): ATZ
<- OK VOLTAGE 0.97 AT+GATTCHAR=0,01-00-01-02-EE
<- ERROR 0.97 VOLTAGE 0.15 AT+GATTCHAR=0,01-00-01-02-EE
Posting this in case anyone encounters a similar issue -- I've done some research and ended up posting on the Adafruit forum as well and got an answer from their tech support. My error in this was more device/BLE specific. I was treating the device as a central instead of a peripheral.
I'm posting their definition since I think they explain it very well:
So instead of trying to send information from the device I need to try to work on pulling it with the Swift code. I'm still a little lost with the "how" part of it, but this is my understanding of the issue.