Adafruit Feather 32u4 Bluefruit LE Created by lady ada

Adafruit Feather 32u4 Bluefruit LE Created by lady ada
Adafruit Feather 32u4 Bluefruit LE
Created by lady ada
Last updated on 2016-04-29 03:27:16 PM EDT
Guide Contents
Guide Contents
Overview
Pinouts
Power Pins
Logic pins
Bluefruit LE Module + Indicator LEDs
Other Pins!
Assembly
Header Options!
Soldering in Plain Headers
Prepare the header strip:
Add the breakout board:
And Solder!
Soldering on Female Header
Tape In Place
Flip & Tack Solder
And Solder!
21
22
22
23
23
24
24
Power Management
Battery + USB Power
Power supplies
Measuring Battery
ENable pin
Arduino IDE Setup
Using with Arduino IDE
Install Drivers (Windows Only)
Blink
Manually bootloading
Ubuntu & Linux Issue Fix
Installing BLE Library
Install the Adafruit nRF51 BLE Library
Run first example
Uploading to the Feather Bluefruit LE
© Adafruit Industries
2
9
15
16
17
18
18
20
20
21
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
26
26
27
28
29
30
33
34
36
37
38
39
39
40
42
Page 2 of 173
Uploading to a brand new board/Upload failures
Run the sketch
AT command testing
Configuration!
Which board do you have?
Bluefruit Micro or Feather 32u4 Bluefruit
Feather M0 Bluefruit LE
Bluefruit LE SPI Friend
Bluefruit LE UART Friend or Flora BLE
Configure the Pins Used
Common settings:
Software UART
Hardware UART
Mode Pin
SPI Pins
Software SPI Pins
45
46
49
49
49
49
49
49
50
50
50
51
51
51
51
Select the Serial Bus
UART Based Boards (Bluefruit LE UART Friend & Flora BLE)
SPI Based Boards (Bluefruit LE SPI Friend)
BLEUart
Opening the Sketch
Configuration
Running the Sketch
HIDKeyboard
Opening the Sketch
Configuration
Running the Sketch
Bonding the HID Keyboard
Android
iOS
OS X
Controller
Opening the Sketch
Configuration
Running the Sketch
© Adafruit Industries
44
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
52
52
52
54
54
55
56
60
60
61
62
63
63
65
67
70
70
71
72
Page 3 of 173
Using Bluefruit LE Connect in Controller Mode
Streaming Sensor Data
Control Pad Module
Color Picker Module
HeartRateMonitor
Opening the Sketch
Configuration
If Using Hardware or Software UART
Running the Sketch
nRF Toolbox HRM Example
CoreBluetooth HRM Example
UriBeacon
Opening the Sketch
Configuration
Running the Sketch
HALP!
AT Commands
Test Command Mode '=?'
Write Command Mode '=xxx'
Execute Mode
Read Command Mode '?'
Standard AT
AT
ATI
ATZ
ATE
+++
General Purpose
AT+FACTORYRESET
AT+DFU
AT+HELP
Hardware
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
72
73
75
76
79
79
80
81
81
83
85
86
86
87
88
90
92
92
92
93
93
95
95
95
96
96
96
98
98
98
99
100
Page 4 of 173
AT+HWADC
AT+HWGETDIETEMP
AT+HWGPIO
AT+HWGPIOMODE
AT+HWI2CSCAN
AT+HWVBAT
AT+HWRANDOM
AT+HWMODELED
Beacon
AT+BLEBEACON
AT+BLEURIBEACON
AT+EDDYSTONEENABLE
AT+EDDYSTONEURL
AT+EDDYSTONECONFIGEN
BLE Generic
AT+BLEPOWERLEVEL
AT+BLEGETADDRTYPE
AT+BLEGETADDR
AT+BLEGETPEERADDR
AT+BLEGETRSSI
BLE Services
AT+BLEUARTTX
TX FIFO Buffer Handling
AT+BLEUARTRX
AT+BLEUARTFIFO
AT+BLEKEYBOARDEN
AT+BLEKEYBOARD
AT+BLEKEYBOARDCODE
Modifier Values
113
115
115
116
117
117
118
AT+BLEHIDEN
AT+BLEHIDMOUSEMOVE
AT+BLEHIDMOUSEBUTTON
AT+BLEHIDCONTROLKEY
© Adafruit Industries
100
100
100
101
102
103
103
103
105
105
107
108
108
109
110
110
111
111
111
112
113
113
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
119
119
120
120
Page 5 of 173
BLE GAP
AT+GAPGETCONN
AT+GAPDISCONNECT
AT+GAPDEVNAME
AT+GAPDELBONDS
AT+GAPINTERVALS
AT+GAPSTARTADV
AT+GAPSTOPADV
AT+GAPSETADVDATA
BLE GATT
AT+GATTCLEAR
AT+GATTADDSERVICE
AT+GATTADDCHAR
AT+GATTCHAR
AT+GATTLIST
Debug
AT+DBGMEMRD
AT+DBGNVMREAD
AT+DBGSTACKSIZE
AT+DBGSTACKDUMP
History
Version 0.6.7
Version 0.6.6
Version 0.6.5
Version 0.6.2
Version 0.5.0
Version 0.4.7
Version 0.3.0
Command Examples
Heart Rate Monitor Service
Python Script
146
SDEP (SPI Data Transport)
© Adafruit Industries
123
123
123
124
124
124
126
126
127
130
130
130
131
133
135
136
136
136
137
138
142
142
142
143
144
144
144
145
146
146
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
151
Page 6 of 173
SDEP Overview
SPI Setup
151
151
SPI Hardware Requirements
IRQ Pin
SDEP Packet and SPI Error Identifier
Sample Transaction
SDEP (Simple Data Exchange Protocol)
Endianness
Message Type Indicator
SDEP Data Transactions
Message Types
Command Messages
Response Messages
Alert Messages
151
151
152
152
152
153
153
153
153
153
154
155
Standard Alert IDs
156
Error Messages
156
Standard Error IDs
157
GATT Service Details
158
UART Service
158
UART Service
Characteristics
159
159
TX (0x0002)
RX (0x0003)
159
159
Software Resources
Bluefruit LE Client Apps and Libraries
Bluefruit LE Connect (http://adafru.it/f4G) (Android/Java)
Bluefruit LE Connect (http://adafru.it/f4H) (iOS/Swift)
Bluefruit Buddy (http://adafru.it/mCn) (OS X)
ABLE (http://adafru.it/ijB) (Cross Platform/Node+Electron)
Bluefruit LE Python Wrapper (http://adafru.it/fQF)
Debug Tools
160
160
161
162
163
163
AdaLink (http://adafru.it/fPq) (Python)
Adafruit nRF51822 Flasher (http://adafru.it/fVL) (Python)
BLE FAQ
163
164
165
Bluefruit LE Connect (Android)
Nordic nRF Toolbox
Adafruit_nRF51822_Flasher
DFU Bluefruit Updates
© Adafruit Industries
160
160
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
166
166
167
171
Page 7 of 173
Downloads
Schematic
Fabrication Print
© Adafruit Industries
172
172
172
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 8 of 173
Overview
Feather is the new development board from Adafruit, and like it's namesake it is thin, light, and lets
you fly! We designed Feather to be a new standard for portable microcontroller cores.
This is the Adafruit Feather 32u4 Bluefruit - our take on an 'all-in-one' Arduino-compatible +
Bluetooth Low Energy with built in USB and battery charging. Its an Adafruit Feather 32u4 with a BTLE
module, ready to rock! We have other boards in the Feather family, check'em out
here (http://adafru.it/jAQ)
Bluetooth Low Energy is the hottest new low-power, 2.4GHz spectrum wireless protocol. In particular,
its the only wireless protocol that you can use with iOS without needing special certification and it's
supported by all modern smart phones. This makes it excellent for use in portable projects that will
make use of an iOS or Android phone or tablet. It also is supported in Mac OS X and Windows 8+
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 9 of 173
At the Feather 32u4's heart is at ATmega32u4 clocked at 8 MHz and at 3.3V logic, a chip setup we've
had tons of experience with as it's the same as the Flora (http://adafru.it/dVl). This chip has 32K of
flash and 2K of RAM, with built in USB so not only does it have a USB-to-Serial program & debug
capability built in with no need for an FTDI-like chip, it can also act like a mouse, keyboard, USB MIDI
device, etc.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 10 of 173
To make it easy to use for portable projects, we added a connector for any of our 3.7V Lithium
polymer batteries and built in battery charging. You don't need a battery, it will run just fine straight
from the micro USB connector. But, if you do have a battery, you can take it on the go, then plug in the
USB to recharge. The Feather will automatically switch over to USB power when its available. We also
tied the battery thru a divider to an analog pin, so you can measure and monitor the battery voltage to
detect when you need a recharge.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 11 of 173
Here's some handy specs! Like all Feather 32u4's you get:
Measures 2.0" x 0.9" x 0.28" (51mm x 23mm x 8mm) without headers soldered in
Light as a (large?) feather - 5.7 grams
ATmega32u4 @ 8MHz with 3.3V logic/power
3.3V regulator with 500mA peak current output
USB native support, comes with USB bootloader and serial port debugging
You also get tons of pins - 20 GPIO pins
Hardware Serial, hardware I2C, hardware SPI support
8 x PWM pins
10 x analog inputs
Built in 100mA lipoly charger with charging status indicator LED
Pin #13 red LED for general purpose blinking
Power/enable pin
4 mounting holes
Reset button
The Feather 32u4 Bluefruit LE uses the extra space left over to add our excellent Bluefruit BTLE
module + two status indicator LEDs
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 12 of 173
The Power of Bluefruit LE
The Bluefruit LE module is an nRF51822 chipset from Nordic, programmed with multi-function code
that can do quite a lot! For most people, they'll be very happy to use the standard Nordic UART RX/TX
connection profile. In this profile, the Bluefruit acts as a data pipe, that can 'transparently' transmit
back and forth from your iOS or Android device. You can use our iOS
App (http://adafru.it/iCi) or Android App (http://adafru.it/f4G), or write your own to communicate with
the UART service (http://adafru.it/iCF).
The board is capable of much more than just sending strings over the air! Thanks to an easy to
learn AT command set (http://adafru.it/iCG), you have full control over how the device behaves,
including the ability to define and manipulate your own GATT Services and
Characteristics (http://adafru.it/iCH), or change the way that the device advertises itself for other
Bluetooth Low Energy devices to see. You can also use the AT commands to query the die
temperature, check the battery voltage, and more, check the connection RSSI or MAC address, and
tons more. Really, way too long to list here!
Use the Bluefruit App to get your project started
Using our Bluefruit iOS App (http://adafru.it/iCi) or Android App (http://adafru.it/f4G), you can quickly
get your project prototyped by using your iOS or Android phone/tablet as a controller. We have
a color picker (http://adafru.it/iCI), quaternion/accelerometer/gyro/magnetometer or location
(GPS) (http://adafru.it/iCI), and an 8-button control game pad (http://adafru.it/iCI). This data can be
read over BLE and piped into the ATmega32u4 chip for processing & control
You can do a lot more too!
The Bluefruit can also act like an HID Keyboard (http://adafru.it/iOA) (for devices that support
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 13 of 173
BLE HID)
Can become a BLE Heart Rate Monitor (http://adafru.it/iOB) (a standard profile for BLE) - you
just need to add the pulse-detection circuitry
Turn it into a UriBeacon (http://adafru.it/iOC), the Google standard for Bluetooth LE beacons.
Just power it and the 'Friend will bleep out a URL to any nearby devices with the UriBeacon app
installed.
Built in over-the-air bootloading capability so we can keep you updated with the hottest new
firmware (http://adafru.it/iOD). Use any Android or iOS device to get updates and install them.
This will update the native code on the BLE module, to add new wireless capabilities, not
program the ATmega chip.
Comes fully assembled and tested, with a USB bootloader that lets you quickly use it with the Arduino
IDE. We also toss in some header so you can solder it in and plug into a solderless
breadboard. Lipoly battery, MicroSD card and USB cable not included (but we do have lots of
options in the shop if you'd like!)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 14 of 173
Pinouts
The Feather 32u4 Bluefruit LE is chock-full of microcontroller goodness. There's also a lot of pins and
ports. We'll take you a tour of them now!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 15 of 173
The DFU pin is accidentally labeled GND on the bottom, sorry about that! it should be labeled
DFU, dont use it as a GND
Power Pins
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 16 of 173
GND - this is the common ground for all power and logic
BAT - this is the positive voltage to/from the JST jack for the optional Lipoly battery
USB - this is the positive voltage to/from the micro USB jack if connected
EN - this is the 3.3V regulator's enable pin. It's pulled up, so connect to ground to disable the
3.3V regulator
3V - this is the output from the 3.3V regulator, it can supply 500mA peak
Logic pins
This is the general purpose I/O pin set for the microcontroller. All logic is 3.3V
#0 / RX - GPIO #0, also receive (input) pin for Serial1 and Interrupt #2
#1 / TX - GPIO #1, also transmit (output) pin for Serial1 and Interrupt #3
#2 / SDA - GPIO #2, also the I2C (Wire) data pin. There's no pull up on this pin by default so
when using with I2C, you may need a 2.2K-10K pullup. Also Interrupt #1
#3 / SCL - GPIO #3, also the I2C (Wire) clock pin. There's no pull up on this pin by default so
when using with I2C, you may need a 2.2K-10K pullup. Can also do PWM output and act as
Interrupt #0.
#5 - GPIO #5, can also do PWM output
#6 - GPIO #6, can also do PWM output and analog input A7
#9 - GPIO #9, also analog input A9 and can do PWM output. This analog input is connected to a
voltage divider for the lipoly battery so be aware that this pin naturally 'sits' at around 2VDC due
to the resistor divider
#10 - GPIO #10, also analog input A10 and can do PWM output.
#11 - GPIO #11, can do PWM output.
#12 - GPIO #12, also analog input A11 and can do PWM output.
#13 - GPIO #13, can do PWM output and is connected to the red LED next to the USB jack
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 17 of 173
A0 thru A5 - These are each analog input as well as digital I/O pins.
SCK/MOSI/MISO - These are the hardware SPI pins, used by the Bluefruit LE module too!
You can use them as everyday GPIO pins if you don't activate the Bluefruit and keep the BLE
CS pin high. However, we really recommend keeping them free as they should be kept available
for the Bluefruit. If they are used, make sure its with a device that will kindly share the SPI bus!
Also used to reprogram the chip with an AVR programmer if you need.
Bluefruit LE Module + Indicator LEDs
Since not all pins can be brought out to breakouts, due to the small size of the Feather, we use these
to control the BLE module
#8 - used as the Bluefruit CS (chip select) pin
#7 - used as the Bluefruit IRQ (interrupt request) pin.
#4 - used as the Bluefruit Reset pin
Since these are not brought out there should be no risk of using them by accident!
Other Pins!
RST - this is the Reset pin, tie to ground to manually reset the AVR, as well as launch the
bootloader manually
ARef - the analog reference pin. Normally the reference voltage is the same as the chip logic
voltage (3.3V) but if you need an alternative analog reference, connect it to this pin and select
the external AREF in your firmware. Can't go higher than 3.3V!
DFU - this is the force-DFU (device firmware upgrade) pin for over-the-air updates to the
Bluefruit module. You probably don't need to use this but its available if you need to upgrade!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 18 of 173
Check out the DFU Bluefruit Upgrades page for how to use it. Otherwise, keep it
disconnected.
On the back we also have SWDIO/SWCLK/RST pins, these are used for programming the Bluefruit LE
module itself. You should not connect to these, unless you want to wipe out the Bluefruit LE module
firmware for some reason. The RST pin is the factory reset pin, which is also rarely used, but you can
use it to set the module back to the factory default settings if it gets really messed up.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 19 of 173
Assembly
We ship Feathers fully tested but without headers attached - this gives you the most flexibility on
choosing how to use and configure your Feather
Header Options!
Before you go gung-ho on soldering, there's a few options to consider!
The first option is soldering in plain male headers, this lets you plug in the
Feather into a solderless breadboard
Another option is to go with socket female headers. This won't let you plug
the Feather into a breadboard but it will let you attach featherwings very
easily
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 20 of 173
We also have 'slim' versions of the female headers, that are a little shorter
and give a more compact shape
Finally, there's the "Stacking Header" option. This one is sort of the best-ofboth-worlds. You get the ability to plug into a solderless breadboard and
plug a featherwing on top. But its a little bulky
Soldering in Plain Headers
Prepare the header strip:
Cut the strip to length if necessary. It will be easier to solder if
you insert it into a breadboard - long pins down
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 21 of 173
Add the breakout board:
Place the breakout board over the pins so that the short pins
poke through the breakout pads
And Solder!
Be sure to solder all pins for reliable electrical contact.
(For tips on soldering, be sure to check out our Guide to
Excellent Soldering (http://adafru.it/aTk)).
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 22 of 173
Solder the other strip as well.
You're done! Check your solder joints visually and continue onto
the next steps
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 23 of 173
Soldering on Female Header
Tape In Place
For sockets you'll want to tape them in place so when you flip
over the board they don't fall out
Flip & Tack Solder
After flipping over, solder one or two points on each strip, to
'tack' the header in place
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 24 of 173
And Solder!
Be sure to solder all pins for reliable electrical contact.
(For tips on soldering, be sure to check out our Guide to
Excellent Soldering (http://adafru.it/aTk)).
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 25 of 173
You're done! Check your solder joints visually and continue
onto the next steps
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 26 of 173
Power Management
Battery + USB Power
We wanted to make the Feather easy to power both when connected to a computer as well as via
battery. There's two ways to power a Feather. You can connect with a MicroUSB cable (just plug into
the jack) and the Feather will regulate the 5V USB down to 3.3V. You can also connect a 4.2/3.7V
Lithium Polymer (Lipo/Lipoly) or Lithium Ion (LiIon) battery to the JST jack. This will let the Feather run
on a rechargable battery. When the USB power is powered, it will automatically switch over to
USB for power, as well as start charging the battery (if attached) at 100mA. This happens
'hotswap' style so you can always keep the Lipoly connected as a 'backup' power that will only get
used when USB power is lost.
The JST connector polarity is matched to Adafruit LiPoly batteries. Using wrong polarity batteries
can destroy your Feather
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 27 of 173
The above shows the Micro USB jack (left), Lipoly JST jack (top left), as well as the 3.3V regulator and
changeover diode (just to the right of the JST jack) and the Lipoly charging circuitry (to the right of the
Reset button). There's also a CHG LED, which will light up while the battery is charging. This LED
might also flicker if the battery is not connected.
Power supplies
You have a lot of power supply options here! We bring out the BAT pin, which is tied to the lipoly JST
connector, as well as USB which is the +5V from USB if connected. We also have the 3V pin which has
the output from the 3.3V regulator. We use a 500mA peak SPX3819. While you can get 500mA from it,
you can't do it continuously from 5V as it will overheat the regulator. It's fine for, say, powering an
ESP8266 WiFi chip or XBee radio though, since the current draw is 'spiky' & sporadic.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 28 of 173
Measuring Battery
If you're running off of a battery, chances are you wanna know what the voltage is at! That way you
can tell when the battery needs recharging. Lipoly batteries are 'maxed out' at 4.2V and stick around
3.7V for much of the battery life, then slowly sink down to 3.2V or so before the protection circuitry cuts
it off. By measuring the voltage you can quickly tell when you're heading below 3.7V
To make this easy we stuck a double-100K resistor divider on the BAT pin, and connected it to D9
(a.k.a analog #9 A9). You can read this pin's voltage, then double it, to get the battery voltage.
#define VBATPIN A9
float measuredvbat = analogRead(VBATPIN);
measuredvbat *= 2; // we divided by 2, so multiply back
measuredvbat *= 3.3; // Multiply by 3.3V, our reference voltage
measuredvbat /= 1024; // convert to voltage
Serial.print("VBat: " ); Serial.println(measuredvbat);
This voltage will 'float' at 4.2V when no battery is plugged in, due to the lipoly charger output, so its not
a good way to detect if a battery is plugged in or not (there is no simple way to detect if a battery is
plugged in)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 29 of 173
ENable pin
If you'd like to turn off the 3.3V regulator, you can do that with the EN(able) pin. Simply tie this pin to
Ground and it will disable the 3V regulator. The BAT and USB pins will still be powered
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 30 of 173
Arduino IDE Setup
The first thing you will need to do is to download the latest release of the Arduino IDE. You will need
to be using version 1.6.4 or higher for this guide.
Arduino IDE v1.6.4+ Download
http://adafru.it/f1P
After you have downloaded and installed v1.6.4, you will need to start the IDE and navigate to the
Preferences menu. You can access it from the File menu in Windows or Linux, or the Arduino menu
on OS X.
A dialog will pop up just like the one shown below.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 31 of 173
We will be adding a URL to the new Additional Boards Manager URLs option. The list of URLs is
comma separated, and you will only have to add each URL once. New Adafruit boards and updates to
existing boards will automatically be picked up by the Board Manager each time it is opened. The
URLs point to index files that the Board Manager uses to build the list of available & installed boards.
To find the most up to date list of URLs you can add, you can visit the list of third party board URLs on
the Arduino IDE wiki (http://adafru.it/f7U). We will only need to add one URL to the IDE in this example,
but you can add multiple URLS by separating them with commas. Copy and paste the link below
into the Additional Boards Manager URLs option in the Arduino IDE preferences.
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 32 of 173
Make sure you remove the apt.adafruit.com proxy setting from the Arduino preferences if you
have previously added it.
Here's a short description of each of the Adafruit supplied packages that will be available in the Board
Manager when you add the URL:
Adafruit AVR Boards - Includes support for Flora, Gemma, Feather 32u4, Trinket, & Trinket
Pro.
Adafruit SAMD Boards - Includes support for Feather M0
Arduino Leonardo & Micro MIDI-USB - This adds MIDI over USB support for the Flora,
Feather 32u4, Micro and Leonardo using the arcore project (http://adafru.it/eSI).
Click OK to save the new preference settings. Next we will look at installing boards with the Board
Manager.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 33 of 173
Using with Arduino IDE
Since the Feather 32u4 uses an ATmega32u4 chip running at 8 MHz, you can pretty easily get it
working with the Arduino IDE. Many libraries (including the popular ones like NeoPixels and display)
work great with the '32u4 and 8 MHz clock speed.
Now that you have added the appropriate URLs to the Arduino IDE preferences, you can open the
Boards Manager by navigating to the Tools->Board menu.
Once the Board Manager opens, click on the category drop down menu on the top left hand side of
the window and select Contributed. You will then be able to select and install the boards supplied by
the URLs added to the prefrences. In the example below, we are installing support for Adafruit AVR
Boards, but the same applies to all boards installed with the Board Manager.
Next, quit and reopen the Arduino IDE to ensure that all of the boards are properly installed. You
should now be able to select and upload to the new boards listed in the Tools->Board menu.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 34 of 173
Install Drivers (Windows Only)
When you plug in the Feather, you'll need to possibly install a driver
Click below to download our Driver Installer
Download Adafruit Drivers Installer
http://adafru.it/mai
Download and run the installer
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 35 of 173
Run the installer! Since we bundle the SiLabs and FTDI drivers as well, you'll need to click through the
license
Select which drivers you want to install:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 36 of 173
Click Install to do the installin'
Blink
Now you can upload your first blink sketch!
Plug in the Feather 32u4 and wait for it to be recognized by the OS (just takes a few seconds). It will
create a serial/COM port, you can now select it from the dropdown, it'll even be 'indicated' as Feather
32u4!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 37 of 173
Now load up the Blink example
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000);
// wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000);
// wait for a second
}
And click upload! That's it, you will be able to see the LED blink rate change as you adapt the delay()
calls.
Manually bootloading
If you ever get in a 'weird' spot with the bootloader, or you have uploaded code that crashes and
doesn't auto-reboot into the bootloader, click the RST button to get back into the bootloader. The red
LED will pulse, so you know that its in bootloader mode. Do the reset button press right as the Arduino
IDE says its attempting to upload the sketch, when you see the Yellow Arrow lit and the Uploading...
text in the status bar.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 38 of 173
Don't click the reset button before uploading, unlike other bootloaders you want this one to run at the
time Arduino is trying to upload
Ubuntu & Linux Issue Fix
Note if you're using Ubuntu 15.04 (or perhaps other more recent Linux distributions) there is an issue
with the modem manager service which causes the Bluefruit LE micro to be difficult to program. If you
run into errors like "device or resource busy", "bad file descriptor", or "port is busy" when attempting to
program then you are hitting this issue. (http://adafru.it/fP6)
The fix for this issue is to make sure Adafruit's custom udev rules are applied to your system. One of
these rules is made to configure modem manager not to touch the Bluefruit Micro board and will fix the
programming difficulty issue. Follow the steps for installing Adafruit's udev rules on this
page. (http://adafru.it/iOE)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 39 of 173
Installing BLE Library
Install the Adafruit nRF51 BLE Library
In order to try out our demos, you'll need to download the Adafruit BLE library for the nRF51 based
modules such as this one (a.k.a. Adafruit_BluefruitLE_nRF51)
You can check out the code here at github, (http://adafru.it/f4V) but its likely easier to just download by
clicking:
Download the Adafruit nRF51 BluefruitLE Library
http://adafru.it/f4W
Rename the uncompressed folder Adafruit_BluefruitLE_nRF51 and check that the
Adafruit_BluefruitLE_nRF51 folder contains Adafruit_BLE.cpp and Adafruit_BLE.h (as well as a
bunch of other files)
Place the Adafruit_BluefruitLE_nRF51 library folder your arduinosketchfolder/libraries/ folder.
You may need to create the libraries subfolder if its your first library. Restart the IDE.
We also have a great tutorial on Arduino library installation at:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use (http://adafru.it/aYM)
After restarting, check that you see the library folder with examples:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 40 of 173
Run first example
Lets begin with the beginner project, which we can use to do basic tests. To open the ATCommand
sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder in the Arduino IDE and
select atcommand:
This will open up a new instance of the example in the IDE, as shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 41 of 173
Don't upload the sketch yet! You will have to begin by changing the configuration.
Go to the second tab labeled BluefruitConfig.h and find these lines
// SHARED SPI SETTINGS
// ---------------------------------------------------------------------------------------------// The following macros declare the pins to use for HW and SW SPI communication.
// SCK, MISO and MOSI should be connected to the HW SPI pins on the Uno when
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 42 of 173
// using HW SPI. This should be used with nRF51822 based Bluefruit LE modules
// that use SPI (Bluefruit LE SPI Friend).
// ---------------------------------------------------------------------------------------------#define BLUEFRUIT_SPI_CS
8
#define BLUEFRUIT_SPI_IRQ
#define BLUEFRUIT_SPI_RST
7
6
// Optional but recommended, set to -1 if unused
And change the last line to:
#define BLUEFRUIT_SPI_RST
4 // Optional but recommended, set to -1 if unused
(The Bluefruit Feather has the reset on digital #4 not #6)
Now go back to the main tab atcommand and look for this line of code
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
Make sure that the second line is uncommented (it should be)
OK now you can upload to the Bluefruit Feather!
If you're using Ubuntu 15.04 or other Linux distributions and run into errors attempting to upload
a program to the board, scroll up to the Ubuntu and Linux issue fix in the previous section
Uploading to the Feather Bluefruit LE
It's pretty easy to upload, first up make sure you have Adafruit Feather 32u4 selected on the boards
dropdown as above. Also, in the Ports menu, look for the port labeled as such:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 43 of 173
Now click the upload button on the Arduino IDE (or File Menu -> Upload)
If all is good you will see Done Uploading in the status bar
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 44 of 173
Uploading to a brand new board/Upload failures
If you are uploading for the first time to a new board, or if upload fails, pres the RESET mini button on
the Feather 32u4 Bluefruit when you see the Yellow Arrow lit and the Uploading... text in the status
bar. When you see the red LED pulsing on and off, you know the bootloader is running.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 45 of 173
Don't click the reset button before uploading, unlike other bootloaders you want this one to run at the
time Arduino is trying to upload
Run the sketch
OK check again that the correct port is selected
Then open up the Serial console. You will see the following:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 46 of 173
This sketch starts by doing a factory reset, then querying the BLE radio for details. These details will
be useful if you are debugging the radio. If you see the information as above, you're working! (Note
that the dates and version numbers may vary)
AT command testing
Now you can try out some AT commands - check the rest of the learn guide for a full list. We'll just
start with AT+HWGETDIETEMP which will return the approximate ambient temperature of the BLE
chipset
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 47 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 48 of 173
OK now you know how to upload/test/communicate with your Feather 32u4 Bluefruit. Next up we have
a bunch of tutorials who can follow for checking out the bluetooth le radio and apps.
For all the following examples, we share the same code between various modules so don't forget to
make sure you have the RESET pin set to 4 in BluefruitConfig.h for each sketch before
uploading, and that Hardware SPI mode is selected by checking for
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 49 of 173
Configuration!
Before you start uploading any of the example sketches, you'll need to CONFIGURE the Bluefruit
interface - there's a lot of options so pay close attention!
Which board do you have?
There's a few products under the Bluefruit name:
If you are using the Bluefruit LE Shield then you have an SPI-connected
NRF51822 module. You can use this with Atmega328 (Arduino UNO or
compatible), ATmega32u4 (Arduino Leonardo, compatible) or ATSAMD21
(Arduino Zero, compatible) and possibly others.
Your pinouts are Hardware SPI, CS = 8, IRQ = 7, RST = 4
Bluefruit Micro or Feather 32u4
Bluefruit
If you have a Bluefruit Micro or Feather 32u4 Bluefruit LE then you have an
ATmega32u4 chip with Hardware SPI, CS = 8, IRQ = 7, RST = 4
Feather M0 Bluefruit LE
If you have a Feather M0 Bluefruit LE then you have an ATSAMD21 chip with
Hardware SPI, CS = 8, IRQ = 7, RST = 4
Bluefruit LE SPI Friend
If you have a stand-alone module, you have a bit of flexibility with wiring however
we strongly recommend Hardware SPI, CS = 8, IRQ = 7, RST = 4
You can use this with just about any microcontroller with 5 or 6 pins
Bluefruit LE UART Friend or Flora BLE
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 50 of 173
If you have a stand-alone UART module you have some flexibility with wiring.
However we suggest hardware UART if possible. You will likely need to use the
flow control CTS pin if you are not using hardware UART. There's also a MODE
pin
You can use this with just about any microcontroller with at least 3 pins, but best
used with a Hardware Serial/UART capable chip!
Configure the Pins Used
You'll want to check the Bluefruit Config to set up the pins you'll be using for UART or SPI
Each example sketch has a secondary tab with configuration details. You'll want to edit and save the
sketch to your own documents folder once set up.
Common settings:
You can set up how much RAM to set aside for a communication buffer and whether you want to have
full debug output. Debug output is 'noisy' on the serial console but is handy since you can see all
communication between the micro and the BLE
// ---------------------------------------------------------------------------------------------// These settings are used in both SW UART, HW UART and SPI mode
// ----------------------------------------------------------------------------------------------
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 51 of 173
#define BUFSIZE
128 // Size of the read buffer for incoming data
#define VERBOSE_MODE
true // If set to 'true' enables debug output
Software UART
If you are using Software UART, you can set up which pins are going to be used for RX, TX, and CTS
flow control. Some microcontrollers are limited on which pins can be used! Check the SoftwareSerial
library documentation for more details
// SOFTWARE UART SETTINGS
#define BLUEFRUIT_SWUART_RXD_PIN
9
// Required for software serial!
#define BLUEFRUIT_SWUART_TXD_PIN
10 // Required for software serial!
#define BLUEFRUIT_UART_CTS_PIN
11 // Required for software serial!
#define BLUEFRUIT_UART_RTS_PIN
-1 // Optional, set to -1 if unused
Hardware UART
If you have Hardware Serial, there's a 'name' for it, usually Serial1 - you can set that up here:
// HARDWARE UART SETTINGS
#ifdef Serial1 // this makes it not complain on compilation if there's no Serial1
#define BLUEFRUIT_HWSERIAL_NAME
#endif
Serial1
Mode Pin
For both hardware and software serial, you will likely want to define the MODE pin. There's a few
sketches that dont use it, instead depending on commands to set/unset the mode. Its best to use the
MODE pin if you have a GPIO to spare!
#define BLUEFRUIT_UART_MODE_PIN
12
// Set to -1 if unused
SPI Pins
For both Hardware and Software SPI, you'll want to set the CS (chip select) line, IRQ (interrupt
request) line and if you have a pin to spare, RST (Reset)
// SHARED SPI SETTINGS
#define BLUEFRUIT_SPI_CS
#define BLUEFRUIT_SPI_IRQ
8
7
#define BLUEFRUIT_SPI_RST
4
© Adafruit Industries
// Optional but recommended, set to -1 if unused
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 52 of 173
Software SPI Pins
If you don't have a hardware SPI port available, you can use any three pins...its a tad slower but very
flexible
// SOFTWARE SPI SETTINGS
#define BLUEFRUIT_SPI_SCK
#define BLUEFRUIT_SPI_MISO
13
12
#define BLUEFRUIT_SPI_MOSI
11
Refer to the table above to determine whether you have SPI or UART controlled Bluefruits!
Select the Serial Bus
Once you've configured your pin setup in the BluefruitConfig.h file, you can now check and adapt the
example sketch.
The Adafruit_BluefruitLE_nRF51 library supports four different serial bus options, depending on the
HW you are using: SPI both hardware and software type, and UART both hardware and software type.
UART Based Boards (Bluefruit LE UART Friend
& Flora BLE)
This is for Bluefruit LE UART Friend & Flora BLE boards. You can use either software serial or
hardware serial. Hardware serial is higher quality, and less risky with respect to losing data. However,
you may not have hardware serial available! Software serial does work just fine with flow-control and
we do have that available at the cost of a single GPIO pin.
For software serial (Arduino Uno, Adafruit Metro) you should uncomment the software serial
contructor below, and make sure the other three options (hardware serial & SPI) are commented out.
// Create the bluefruit object, either software serial...uncomment these lines
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);
Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
For boards that require hardware serial (Adafruit Flora, etc.), uncomment the hardware serial
constructor, and make sure the other three options are commented out
/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, BLUEFRUIT_UART_MODE_PIN);
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 53 of 173
SPI Based Boards (Bluefruit LE SPI Friend)
For SPI based boards, you should uncomment the hardware SPI constructor below, making sure the
other constructors are commented out:
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
If for some reason you can't use HW SPI, you can switch to software mode to bit-bang the SPI
transfers via the following constructor:
/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 54 of 173
BLEUart
The BLEUart example sketch allows you to send and receive text data between the Arduino and a
connected Bluetooth Low Energy Central device on the other end (such as you mobile phone using
the Adafruit Bluefruit LE Connect application for Android (http://adafru.it/f4G) or
iOS (http://adafru.it/f4H) in UART mode).
Opening the Sketch
To open the ATCommand sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder
in the Arduino IDE and select bleuart_cmdmode:
This will open up a new instance of the example in the IDE, as shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 55 of 173
Configuration
Check the Configuration! page earlier to set up the sketch for Software/Hardware UART or
Software/Hardware SPI. The default is hardware SPI
If using software or hardware Serial UART:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 56 of 173
This tutorial does not need to use the MODE pin, make sure you have the mode switch in
CMD mode if you do not configure & connect a MODE pin
Don't forget to also connect the CTS pin on the Bluefruit to ground if you are not using it!
(The Flora has this already done)
Running the Sketch
Once you upload the sketch to your board (via the arrow-shaped upload icon), and the upload process
has finished, open up the Serial Monitor via Tools > Serial Monitor, and make sure that the baud rate
in the lower right-hand corner is set to 115200:
Once you see the request, use the App to connect to the Bluefruit LE module in UART mode so you
get the text box on your phone
Any text that you type in the box at the top of the Serial Monitor will be sent to the connected phone,
and any data sent from the phone will be displayed in the serial monitor:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 57 of 173
You can see the incoming string here in the Adafruit Bluefruit LE Connect app below (iOS in this case):
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 58 of 173
The response text ('Why hello, Arduino!') can be seen below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 59 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 60 of 173
HIDKeyboard
The HIDKeyboard example shows you how you can use the built-in HID keyboard AT commands to
send keyboard data to any BLE-enabled Android or iOS phone, or other device that supports BLE HID
peripherals.
Opening the Sketch
To open the ATCommand sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder
in the Arduino IDE and select hidkeyboard:
This will open up a new instance of the example in the IDE, as shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 61 of 173
Configuration
Check the Configuration! page earlier to set up the sketch for Software/Hardware UART or
Software/Hardware SPI. The default is hardware SPI
If using software or hardware Serial UART:
This tutorial does not need to use the MODE pin, make sure you have the mode switch in
CMD mode!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 62 of 173
Don't forget to also connect the CTS pin on the Bluefruit to ground if you are not using it!
(The Flora has this already done)
Running the Sketch
Once you upload the sketch to your board (via the arrow-shaped upload icon), and the upload process
has finished, open up the Serial Monitor via Tools > Serial Monitor, and make sure that the baud rate
in the lower right-hand corner is set to 115200:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 63 of 173
To send keyboard data, type anything into the textbox at the top of the Serial Monitor and click
the Send button.
Bonding the HID Keyboard
Before you can use the HID keyboard, you will need to 'bond' it to your phone or PC. The bonding
process establishes a permanent connection between the two devices, meaning that as soon as your
phone or PC sees the Bluefruit LE module again it will automatically connect.
The exact procedures for bonding the keyboard will varying from one platform to another.
When you no longer need a bond, or wish to bond the Bluefruit LE module to another device, be
sure to delete the bonding information on the phone or PC, otherwise you may not be able to
connect on a new device!
Android
To bond the keyboard on a Bluetooth Low Energy enabled Android device, go to the Settings
application and click the Bluetooth icon.
These screenshots are based on Android 5.0 running on a Nexus 7 2013. The exact appearance
may vary depending on your device and OS version.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 64 of 173
Inside the Bluetooth setting panel you should see the Bluefruit LE module advertising itself
as Bluefruit Keyboard under the 'Available devices' list:
Tapping the device will start the bonding process, which should end with the Bluefruit Keyboard device
being moved to a new 'Paired devices' list with 'Connected' written underneath the device name:
To delete the bonding information, click the gear icon to the right of the device name and the click
the Forget button:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 65 of 173
iOS
To bond the keyboard on an iOS device, go to the Settings application on your phone, and click
the Bluetooth menu item.
The keyboard should appear under the OTHER DEVICES list:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 66 of 173
Once the bonding process is complete the device will be moved to the MY DEVICES category, and
you can start to use the Bluefruit LE module as a keyboard:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 67 of 173
To unbond the device, click the 'info' icon and then select the Forget this Device option in the menu:
OS X
To bond the keyboard on an OS X device, go to the Bluetooth Preferences window and click the Pair
button beside the Bluefruit Keyboard device generated by this example sketch:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 68 of 173
To unbond the device once it has been paired, click the small 'x' icon beside Bluefruit Keyboard:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 69 of 173
... and then click the Remove button when the confirmation dialogue box pops up:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 70 of 173
Controller
The Controller sketch allows you to turn your BLE-enabled iOS or Android device in a hand-held
controller or an external data source, taking advantage of the wealth of sensors on your phone or
tablet.
You can take accelerometer or quaternion data from your phone, and push it out to your Arduino via
BLE, or get the latest GPS co-ordinates for your device without having to purchase (or power!) any
external HW.
Opening the Sketch
To open the Controller sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder in
the Arduino IDE and select controller:
This will open up a new instance of the example in the IDE, as shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 71 of 173
Configuration
Check the Configuration! page earlier to set up the sketch for Software/Hardware UART or
Software/Hardware SPI. The default is hardware SPI
If using software or hardware Serial UART:
This tutorial will also be easier to use if you wire up the MODE pin, you can use any pin but our
tutorial has pin 12 by default. You can change this to any pin. If you do not set the MODE pin
then make sure you have the mode switch in CMD mode
If you are using a Flora or otherwise don't want to wire up the Mode pin, set the
BLUEFRUIT_UART_MODE_PIN to -1 in the configuration tab so that the sketch will use the +++
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 72 of 173
method to switch between Command and Data mode!
Don't forget to also connect the CTS pin on the Bluefruit to ground if you are not using it!
(The Flora has this already done)
Running the Sketch
Once you upload the sketch to your board (via the arrow-shaped upload icon), and the upload process
has finished, open up the Serial Monitor via Tools > Serial Monitor, and make sure that the baud rate
in the lower right-hand corner is set to 115200:
Using Bluefruit LE Connect in Controller
Mode
Once the sketch is running you can open Adafruit's Bluefruit LE Connect application (available for
Android (http://adafru.it/f4G) or iOS (http://adafru.it/f4H)) and use the Controller application to interact
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 73 of 173
with the sketch. (If you're new to Bluefruit LE Connect, have a look at our dedicated Bluefruit LE
Connect learning guide (http://adafru.it/iCm).)
On the welcome screen, select the Adafruit Bluefruit LE device from the list of BLE devices in range:
Then from the activity list select Controller:
This will bring up a list of data points you can send from your phone or tablet to your Bluefruit LE
module, by enabling or disabling the appropriate sensor(s).
Streaming Sensor Data
You can take Quaternion (absolute orientation), Accelerometer, Gyroscope, Magnetometer or GPS
Location data from your phone and send it directly to your Arduino from the Controller activity.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 74 of 173
By enabling the Accelerometer field, for example, you should see accelerometer data update in the
app:
The data is parsed in the example sketch and output to the Serial Monitor as follows:
Accel 0.20 -0.51 -0.76
Accel 0.22 -0.50 -0.83
Accel 0.25 -0.51 -0.83
Accel 0.21 -0.47 -0.76
Accel 0.27 -0.48 -0.82
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 75 of 173
Note that even though we only print 2 decimal points, the values are received from the App as a full 4byte floating point.
Control Pad Module
You can also use the Control Pad Module to capture button presses and releases by selecting the
appropriate menu item:
This will bring up the Control Pad panel, shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 76 of 173
Button presses and releases will all be logged to the Serial Monitor with the ID of the button used:
Button 8 pressed
Button 8 released
Button 3 pressed
Button 3 released
Color Picker Module
You can also send RGB color data via the Color Picker module, which presents the following color
selection dialogue:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 77 of 173
This will give you Hexadecimal color data in the following format:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 78 of 173
RGB #A42FFF
You can combine the color picker and controller sample sketches to make color-configurable
animations triggered by buttons in the mobile app-- very handy for wearables! Download this
combined sample code (configured for Feather but easy to adapt to FLORA, BLE Micro, etc.) to get
started:
feather_bluefruit_neopixel_animation_controller.zip
http://adafru.it/kzF
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 79 of 173
HeartRateMonitor
The HeartRateMonitor example allows you to define a new GATT Service and associated GATT
Characteristics, and update the characteristic values using standard AT commands.
Opening the Sketch
To open the ATCommand sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder
in the Arduino IDE and select heartratemonitor:
This will open up a new instance of the example in the IDE, as shown below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 80 of 173
Configuration
Check the Configuration! page earlier to set up the sketch for Software/Hardware UART or
Software/Hardware SPI. The default is hardware SPI
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 81 of 173
If Using Hardware or Software UART
This tutorial does not need to use the MODE pin, make sure you have the mode switch in CMD
mode if you do not configure & connect a MODE pin
This demo uses some long data transfer strings, so we recommend defining and connecting both CTS
and RTS to pins, even if you are using hardware serial.
If you are using a Flora or just dont want to connect CTS or RTS, set the pin #define's to -1 and Don't
forget to also connect the CTS pin on the Bluefruit to ground! (The Flora has this already done)
If you are using RTS and CTS, you can remove this line below, which will slow down the data
transmission
// this line is particularly required for Flora, but is a good idea
// anyways for the super long lines ahead!
ble.setInterCharWriteDelay(5); // 5 ms
Running the Sketch
Once you upload the sketch to your board (via the arrow-shaped upload icon), and the upload process
has finished, open up the Serial Monitor via Tools > Serial Monitor, and make sure that the baud rate
in the lower right-hand corner is set to 115200:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 82 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 83 of 173
If you open up an application on your mobile device or laptop that support the standard Heart Rate
Monitor Service (http://adafru.it/f4I), you should be able to see the heart rate being updated in sync
with the changes seen in the Serial Monitor:
nRF Toolbox HRM Example
The image below is a screenshot from the free nRF Toolbox (http://adafru.it/e9M) application from
Nordic on Android (also available on iOS (http://adafru.it/f4J)), showing the incoming Heart Rate
Monitor data:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 84 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 85 of 173
CoreBluetooth HRM Example
The image below is from a freely available CoreBluetooth sample application (http://adafru.it/f4K) from
Apple showing how to work with Bluetooth Low Energy services and characteristics:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 86 of 173
UriBeacon
The UriBeacon example shows you how to use the built-in UriBeacon AT commands to configure the
Bluefruit LE module as a UriBeacon advertiser, following Google's Physical Web
UriBeacon (http://adafru.it/edk) specification.
Opening the Sketch
To open the ATCommand sketch, click on the File > Examples > Adafruit_BluefruitLE_nRF51 folder
in the Arduino IDE and select uribeacon:
This will open up a new instance of the example in the IDE, as shown below. You can edit the URL
that the beacon will point to, from the default http://www.adafruit.com or just upload as is to test
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 87 of 173
Configuration
Check the Configuration! page earlier to set up the sketch for Software/Hardware UART or
Software/Hardware SPI. The default is hardware SPI
If using software or hardware Serial UART:
This tutorial does not need to use the MODE pin, make sure you have the mode switch in
CMD mode if you do not configure & connect a MODE pin
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 88 of 173
Don't forget to also connect the CTS pin on the Bluefruit to ground if you are not using it!
(The Flora has this already done)
Running the Sketch
Once you upload the sketch to your board (via the arrow-shaped upload icon), and the upload process
has finished, open up the Serial Monitor via Tools > Serial Monitor, and make sure that the baud rate
in the lower right-hand corner is set to 115200:
At this point you can open the Physical Web Application for Android (http://adafru.it/edi) or for
iOS (http://adafru.it/edj), and you should see a link advertising Adafruit's website:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 89 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 90 of 173
HALP!
When using the Bluefruit Micro or a Bluefruit LE with Flora/Due/Leonardo/Micro the examples dont
run?
We add a special line to setup() to make it so the Arduino will halt until it sees you've connected over
the Serial console. This makes debugging great but makes it so you cannot run the program
disconnected from a computer.
Solution? Once you are done debugging, remove these two lines from setup()
while (!Serial);
delay(500);
I can't seem to "Find" the Bluefruit LE!
Getting something like this?
For UART/Serial Bluefruits:
Check you have the MODE switch in CMD and the MODE pin not wired to anything if it isnt
used!
If you are trying to control the MODE from your micro, make sure you set the MODE pin in the
sketch
Make sure you have RXI and TXO wired right! They are often swapped by accident
Make sure CTS is tied to GND if you are using hardware serial and not using CTS
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 91 of 173
Check the MODE red LED, is it blinking? If its blinking continuously, you might be in DFU mode,
power cycle the module!
If you are using Hardware Serial/Software Serial make sure you know which one and have that
set up
If using SPI Bluefruit:
Make sure you have all 5 (or 6) wires connected properly.
If using hardware SPI, you need to make sure you're connected to the hardware SPI port, which
differs depending on the main chipset.
If using Bluefruit Micro:
Make sure you change the RESET pin to #4 in any Config file. Also be sure you are using
hardware SPI to connect!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 92 of 173
AT Commands
The Bluefruit LE modules use a Hayes AT-style command set (http://adafru.it/ebJ)to configure the
device.
The advantage of an AT style command set is that it's easy to use in machine to machine
communication, while still being somewhat user friendly for humans.
Test Command Mode '=?'
'Test' mode is used to check whether or not the specified command exists on the system or not.
Certain firmware versions or configurations may or may not include a specific command, and you can
determine if the command is present by taking the command name and appending '=?' to it, as shown
below
AT+BLESTARTADV=?
If the command is present, the device will reply with 'OK'. If the command is not present, the device
will reply with 'ERROR'.
AT+BLESTARTADV=?
OK\r\n
AT+MISSINGCMD=?
ERROR\r\n
Write Command Mode '=xxx'
'Write' mode is used to assign specific value(s) to the command, such as changing the radio's transmit
power level using the command we used above.
To write a value to the command, simple append an '=' sign to the command followed by
any paramater(s) you wish to write (other than a lone '?' character which will be interpretted as tet
mode):
AT+BLEPOWERLEVEL=-8
If the write was successful, you will generally get an 'OK' response on a new line, as shown below:
AT+BLEPOWERLEVEL=-8
OK\r\n
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 93 of 173
If there was a problem with the command (such as an invalid parameter) you will get an 'ERROR'
response on a new line, as shown below:
AT+BLEPOWERLEVEL=3
ERROR\r\n
Note: This particular error was generated because '3' is not a valid value for the
AT+BLEPOWERLEVEL command. Entering '-4', '0' or '4' would succeed since these are all valid
values for this command.
Execute Mode
'Execute' mode will cause the specific command to 'run', if possible, and will be used when the
command name is entered with no additional parameters.
AT+FACTORYRESET
You might use execute mode to perform a factory reset, for example, by executing the
AT+FACTORYRESET command as follows:
AT+FACTORYRESET
OK\r\n
NOTE: Many commands that are means to be read will perform the same action whether they are
sent to the command parser in 'execute' or 'read' mode. For example, the following commands will
produce identical results:
AT+BLEGETPOWERLEVEL
-4\r\n
OK\r\n
AT+BLEGETPOWERLEVEL?
-4\r\n
OK\r\n
If the command doesn't support execute mode, the response will normally be 'ERROR' on a new line.
Read Command Mode '?'
'Read' mode is used to read the current value of a command.
Not every command supports read mode, but you generally use this to retrieve information like the
current transmit power level for the radio by appending a '?' to the command, as shown below:
AT+BLEPOWERLEVEL?
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 94 of 173
If the command doesn't support read mode or if there was a problem with the request, you will
normally get an 'ERROR' response.
If the command read was successful, you will normally get the read results followed by 'OK' on a new
line, as shown below:
AT+BLEPOWERLEVEL?
-4\r\n
OK\r\n
Note: For simple commands, 'Read' mode and 'Execute' mode behave identically.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 95 of 173
Standard AT
The following standard Hayes/AT commands are available on Bluefruit LE modules:
AT
Acts as a ping to check if we are in command mode. If we are in command mode, we should receive
the 'OK' response.
Codebase Revision: 0.3.0
Parameters: None
Output: None
AT
OK
ATI
Displays basic information about the Bluefruit module.
Codebase Revision: 0.3.0
Parameters: None
Output: Displays the following values:
Board Name
Microcontroller/Radio SoC Name
Unique Serial Number
Core Bluefruit Codebase Revision
Project Firmware Revision
Firmware Build Date
Softdevice, Softdevice Version, Bootloader Version (0.5.0+)
ATI
BLEFRIEND
nRF51822 QFAAG00
FB462DF92A2C8656
0.5.0
0.5.0
Feb 24 2015
S110 7.1.0, 0.0
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 96 of 173
OK
Updates:
Version 0.4.7+ of the firmware adds the chip revision after the chip name if it can be detected
(ex. 'nRF51822 QFAAG00').
Version 0.5.0+ of the firmware adds a new 7th record containing the softdevice, softdevice
version and bootloader version (ex. 'S110 7.1.0, 0.0').
ATZ
Performs a system reset.
Codebase Revision: 0.3.0
Parameters: None
Output: None
ATZ
OK
ATE
Enables or disables echo of input characters with the AT parser
Codebase Revision: 0.3.0
Parameters: '1' = enable echo, '0' = disable echo
Output: None
# Disable echo support
ATE=0
OK
#Enable echo support
ATE=1
OK
+++
Dynamically switches between DATA and COMMAND mode without changing the physical CMD/UART
select switch.
When you are in COMMAND mode, entering '+++\n' or '+++\r\n' will cause the module to switch to
DATA mode, and anything typed into the console will go direct to the BLUE UART service.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 97 of 173
To switch from DATA mode back to COMMAND mode, simply enter '+++\n' or '+++\r\n' again (be sure
to include the new line character!), and a new 'OK' response will be displayed letting you know that
you are back in COMMAND mode (see the two 'OK' entries in the sample code below).
Codebase Revision: 0.4.7
Parameters: None
Output: None
Note that +++ can also be used on the mobile device to send and receive AT command on iOS or
Android, though this should always be used with care.
ATI
BLEFRIEND
nRF51822 QFAAG00
B122AAC33F3D2296
0.4.6
0.4.6
Dec 22 2014
OK
+++
OK
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 98 of 173
General Purpose
The following general purpose commands are available on all Bluefruit LE modules:
AT+FACTORYRESET
Clears any user config data from non-volatile memory and performs a factory reset before resetting
the Bluefruit module.
Codebase Revision: 0.3.0
Parameters: None
Output: None
AT+FACTORYRESET
OK
As of version 0.5.0+ of the firmware, you can perform a factory reset by holding the DFU button
down for 10s until the blue CONNECTED LED lights up, and then releasing the button.
AT+DFU
Forces the module into DFU mode, allowing over the air firmware updates using a dedicated DFU app
on iOS or Android.
Codebase Revision: 0.3.0
Parameters: None
Output: None
The AT parser will no longer responsd after the AT+DFU command is entered, since normal
program execution effectively halts and a full system reset is performed to start the bootloader
code
AT+DFU
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 99 of 173
AT+HELP
Displays a comma-separated list of all AT parser commands available on the system.
Codebase Version: 0.3.0
Parameters: None
Output: A comma-separated list of all AT parser commands available on the system.
The sample code below may not match future firmware releases and is provided for illustration
purposes only
AT+HELP
AT+FACTORYRESET,AT+DFU,ATZ,ATI,ATE,AT+DBGMEMRD,AT+DBGNVMRD,AT+HWLEDPOLARITY,AT+HWLE
D,AT+HWGETDIETEMP,AT+HWMODEPINPOLARITY,AT+HWMODEPIN,AT+HWGPIOMODE,AT+HWGPIO,AT+HWI
2CSCAN,AT+HWADC,AT+HWVBAT,AT+HWPWM,AT+HWPWRDN,AT+BLEPOWERLEVEL,AT+BLEGETADDRTYP
E,AT+BLEGETADDR,AT+BLEBEACON,AT+BLEGETRSSI,AT+GAPGETCONN,AT+GAPDISCONNECT,AT+GAPDE
VNAME,AT+GAPDELBONDS,AT+GAPINTERVALS,AT+GAPSTARTADV,AT+GAPSTOPADV,AT+GAPAUTOADV,AT
+GAPSETADVDATA,AT+BLEUARTTX,AT+BLEUARTRX,AT+GATTADDSERVICE,AT+GATTADDCHAR,AT+GATTC
HAR,AT+GATTLIST,AT+GATTCLEAR,AT+HELP
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 100 of 173
Hardware
The following commands allow you to interact with the low level HW on the Bluefruit LE module, such
as reading or toggling the GPIO pins, performing an ADC conversion ,etc.:
AT+HWADC
Performs an ADC conversion on the specified ADC pin
Codebase Revision: 0.3.0
Parameters: The ADC channel (0..7)
Output: The results of the ADC conversion
AT+HWADC=0
178
OK
AT+HWGETDIETEMP
Gets the temperature in degree celcius of the BLE module's die. This can be used for debug
purposes (higher die temperature generally means higher current consumption), but does not
corresponds to ambient temperature and can nto be used as a replacement for a normal temperature
sensor.
Codebase Revision: 0.3.0
Parameters: None
Output: The die temperature in degrees celcius
AT+HWGETDIETEMP
32.25
OK
AT+HWGPIO
Gets or sets the value of the specified GPIO pin (depending on the pin's mode).
Codebase Revision: 0.3.0
Parameters: The parameters for this command change depending on the pin mode.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 101 of 173
OUTPUT MODE: The following comma-separated parameters can be used when updating a pin that
is set as an output:
Pin numbers
Pin state, where:
0 = clear the pin (logic low/GND)
1 = set the pin (logic high/VCC)
INPUT MODE: To read the current state of an input pin or a pin that has been configured as an
output, enter the pin number as a single parameter.
Output: The pin state if you are reading an input or checking the state of an input pin (meaning only 1
parameter is supplied, the pin number), where:
0 means the pin is logic low/GND
1 means the pin is logic high/VCC
Trying to set the value of a pin that has not been configured as an output will produce an
'ERROR' response.
Some pins are reserved for specific functions on Bluefruit modules and can not be used as GPIO.
If you try to make use of a reserved pin number an 'ERROR' response will be generated.
# Set pin 14 HIGH
AT+HWGPIO=14,1
OK
# Set pin 14 LOW
AT+HWGPIO=14,0
OK
# Read the current state of pin 14
AT+HWGPIO=14
0
OK
# Try to update a pin that is not set as an output
AT+HWGPIOMODE=14,0
OK
AT+HWGPIO=14,1
ERROR
AT+HWGPIOMODE
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 102 of 173
AT+HWGPIOMODE
This will set the mode for the specified GPIO pin (input, output, etc.).
Codebase Revision: 0.3.0
Parameters: This command one or two values (comma-separated in the case of two parameters
being used):
The pin number
The new GPIO mode, where:
0 = Input
1 = Output
2 = Input with pullup enabled
3 = Input with pulldown enabled
Output: If a single parameters is passed (the GPIO pin number) the current pin mode will be returned.
Some pins are reserved for specific functions on Bluefruit modules and can not be used as GPIO.
If you try to make use of a reserved pin number an 'ERROR' response will be generated.
# Configure pin 14 as an output
AT+HWGPIOMODE=14,0
OK
# Get the current mode for pin 14
AT+HWPGIOMODE=14
0
OK
AT+HWI2CSCAN
Scans the I2C bus to try to detect any connected I2C devices, and returns the address of devices that
were found during the scan process.
Codebase Revision: 0.3.0
Parameters: None
Output: A comma-separated list of any I2C address that were found while scanning the valid address
range on the I2C bus, or nothing is no devices were found.
# I2C scan with two devices detected
AT+HWI2CSCAN
0x23,0x35
OK
# I2C scan with no devices detected
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 103 of 173
AT+HWI2CSCAN
OK
AT+HWVBAT
Returns the main power supply voltage level in millivolts
Codebase Revision: 0.3.0
Parameters: None
Output: The VBAT level in millivolts
AT+HWVBAT
3248
OK
AT+HWRANDOM
Generates a random 32-bit number using the HW random number generator on the nRF51822
(based on white noise).
Codebase Revision: 0.4.7
Parameters: None
Output: A random 32-bit hexadecimal value (ex. '0x12345678')
AT+HWRANDOM
0x769ED823
OK
AT+HWMODELED
Allows you to override the default behaviour of the MODE led (which indicates the operating mode by
default).
Codebase Revision: 0.6.6
Parameters: LED operating mode, which can be one of the following values:
disable or DISABLE or 0 - Disable the MODE LED entirely to save power
mode or MODE or 1 - Default behaviour, indicates the current operating mode
hwuart or HWUART or 2 - Toggles the LED on any activity on the HW UART bus (TX or RX)
bleuart or BLEUART or 3 - Toggles the LED on any activity on the BLE UART Service (TX or
RX characteristic)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 104 of 173
spi or SPI or 4 - Toggles the LED on any SPI activity
manual or MANUAL or 5 - Manually sets the state of the MODE LED via a second commaseparated parameter, which can be on, off, or toggle.
Output: If run with no parameters, returns an upper-case string representing the current MODE LED
operating mode from the fields above
# Get the curent MODE LED setting
AT+HWMODELED
MODE
OK
# Change the MODE LED to indicate BLE UART activity
AT+HWMODELED=BLEUART
OK
# Manually toggle the MODE LED
AT+HWMODELED=MANUAL,TOGGLE
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 105 of 173
Beacon
Adafruit's Bluefruit LE modules currently support the following 'Beacon' technologies:
Beacon (Apple) via AT+BLEBEACON
UriBeacon (Google) via AT+BLEURIBEACON (deprecated)
Eddystone (Google) via AT+EDDYSTONE*
Modules can be configured to act as 'Beacons' using the following commands:
AT+BLEBEACON
Codebase Revision: 0.3.0
Parameters: The following comma-separated parameters are required to enable beacon mode:
Bluetooth Manufacturer ID (uint16_t)
128-bit UUID
Major Value (uint16_t)
Minor Value (uint16_t)
RSSI @ 1m (int8_t)
Output: None
# Enable Apple iBeacon emulation
# Manufacturer ID = 0x004C
AT+BLEBEACON=0x004C,01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0,0x0000,0x0000,-59
OK
# Reset to change the advertising data
ATZ
OK
# Enable Nordic Beacon emulation
# Manufacturer ID = 0x0059
AT+BLEBEACON=0x0059,01-12-23-34-45-56-67-78-89-9A-AB-BC-CD-DE-EF-F0,0x0000,0x0000,-59
OK
# Reset to change the advertising data
ATZ
OK
AT+BLEBEACON will cause the beacon data to be stored in non-volatile config memory on the
Bluefruit LE module, and these values will be persisted across system resets and power cycles.
To remove or clear the beacon data you need to enter the 'AT+FACTORYRESET' command in
command mode.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 106 of 173
Entering Nordic Beacon emulation using the sample code above, you can see the simulated beacon in
Nordic's 'Beacon Config' tool below:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 107 of 173
AT+BLEURIBEACON
Converts the specified URI into a UriBeacon (http://adafru.it/edk) advertising packet, and configures
the module to advertise as a UriBeacon (part of Google's Physical Web (http://adafru.it/ehZ) project).
To view the UriBeacon URIs you can use one of the following mobile applications:
Android 4.3+: Physical Web (http://adafru.it/edi) on the Google Play Store
iOS: Physical Web (http://adafru.it/edj) in Apple's App Store
Codebase Revision: 0.4.7
Parameters: The URI to encode (ex. http://www.adafruit.com/blog (http://adafru.it/ei0))
Output: None of a valid URI was entered (length is acceptable, etc.).
AT+BLEURIBEACON=http://www.adafruit.com/blog
OK
# Reset to change the advertising data
ATZ
OK
If the supplied URI is too long you will get the following output:
AT+BLEURIBEACON=http://www.adafruit.com/this/uri/is/too/long
URL is too long
ERROR
If the URI that you are trying to encode is too long, try using a shortening service like bit.ly, and
encode the shortened URI.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 108 of 173
UriBeacon should be considered deprecated as a standard, and EddyStone should be used for
any future development. No further development will happen in the Bluefruit LE firmware around
UriBeacon.
AT+EDDYSTONEENABLE
This command will enable Eddystone (http://adafru.it/fSA) support on the Bluefruit LE module.
Eddystone support must be enabled before the other related commands can be used.
Codebase Revision: 0.6.6
Parameters: 1 or 0 (1 = enable, 0 = disable)
Output: The current state of Eddystone support if no parameters are provided (1 = enabled, 0 =
disabled)
# Enable Eddystone support
AT+EDDYSTONEENABLE=1
OK
# Check the current Eddystone status on the module
AT+EDDYSTONEENABLE
1
OK
AT+EDDYSTONEURL
This command will set the URL for the Eddystone-URL (http://adafru.it/fSB) protocol.
Codebase Revision: 0.6.6
Parameters:
The URL to encode (mandatory)
An optional second parameter indicates whether to continue advertising the Eddystone URL
even when the peripheral is connected to a central device
Firmware 0.6.7 added an optional third parameter for the RSSI at 0 meters value. This should
be measured by the end user by checking the RSSI value on the receiving device at 1m and
then adding 41 to that value (to compensate for the signal strength loss over 1m), so an RSSI of
-62 at 1m would mean that you should enter -21 as the RSSI at 0m. Default value is -18dBm.
Output: Firmware <= 0.6.6: none. With firmware >= 0.6.7 running this command with no parameters
will return the current URL.
# Set the Eddystone URL to adafruit
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 109 of 173
AT+EDDYSTONEURL=http://www.adafruit.com
OK
# Set the Eddystone URL to adafruit and advertise it even when connected
AT+EDDYSTONEURL=http://www.adafruit.com,1
OK
AT+EDDYSTONECONFIGEN
This command causes the Bluefruit LE module to enable the Eddystone URL config service for the
specified number of seconds.
This command should be used in combination with the Physical Web application from Google,
available for Android (http://adafru.it/edi) or iOS (http://adafru.it/edj). Run this command then select
the 'Edit URL' option from the app to change the destination URL over the air.
Codebase Revision: 0.6.6
Parameters: The number of seconds to advertised the config service UUID
Output: None
# Start advertising the Eddystone config service for 5 minutes (300s)
AT+EDDYSTONECONFIGEN=300
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 110 of 173
BLE Generic
The following general purpose BLE commands are available on Bluefruit LE modules:
AT+BLEPOWERLEVEL
Gets or sets the current transmit power level for the module's radio (higher transmit power equals
better range, lower transmit power equals better battery life).
Codebase Revision: 0.3.0
Parameters: The TX power level (in dBm), which can be one of the following values (from lowest to
higher transmit power):
-40
-20
-16
-12
-8
-4
0
4
Output: The current transmit power level (in dBm)
The updated power level will take affect as soon as the command is entered. If the device isn't
connected to another device, advertising will stop momentarily and then restart once the new
power level has taken affect.
# Get the current TX power level (in dBm)
AT+BLEPOWERLEVEL
0
OK
# Set the TX power level to 4dBm (maximum value)
AT+BLEPOWERLEVEL=4
OK
# Set the TX power level to -12dBm (better battery life)
AT+BLEPOWERLEVEL=-12
OK
# Set the TX power level to an invalid value
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 111 of 173
AT+BLEPOWERLEVEL=-3
ERROR
AT+BLEGETADDRTYPE
Gets the address type (for the 48-bit BLE device address).
Normally this will be '1' (random), which means that the module uses a 48-bit address that was
randomly generated during the manufacturing process and written to the die by the manufacturer.
Random does not mean that the device address is randomly generated every time, only that a onetime random number is used.
Codebase Revision: 0.3.0
Parameters: None
Output: The address type, which can be one of the following values:
0 = public
1 = random
AT+BLEGETADDRTYPE
1
OK
AT+BLEGETADDR
Gets the 48-bit BLE device address.
Codebase Revision: 0.3.0
Parameters: None
Output: The 48-bit BLE device address in the following format: 'AA:BB:CC:DD:EE:FF'
AT+BLEGETADDR
E4:C6:C7:31:95:11
OK
AT+BLEGETPEERADDR
Gets the 48-bit address of the peer (central) device we are connected to.
Codebase Revision: 0.6.5
Parameters: None
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 112 of 173
Output: The 48-bit address of the connected central device in hex format. The command will
return ERROR if we are not connected to a central device.
Please note that the address returned by the central device is almost always a random value that
will change over time, and this value should generally not be trusted. This command is provided
for certain edge cases, but is not useful in most day to day scenarios.
AT+BLEGETPEERADDR
48:B2:26:E6:C1:1D
OK
AT+BLEGETRSSI
Gets the RSSI value (Received Signal Strength Indicator), which can be used to estimate the reliability
of data transmission between two devices (the lower the number the better).
Codebase Revision: 0.3.0
Parameters: None
Output: The RSSI level (in dBm) if we are connected to a device, otherwise '0'
# Connected to an external device
AT+BLEGETRSSI
-46
OK
# Not connected to an external device
AT+BLEGETRSSI
0
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 113 of 173
BLE Services
The following commands allow you to interact with various GATT services present on Bluefruit LE
modules when running in Command Mode.
AT+BLEUARTTX
This command will transmit the specified text message out via the UART
Service (http://adafru.it/iCn) while you are running in Command Mode.
Codebase Revision: 0.3.0
Parameters: The message payload to transmit. The payload can be up to 240 characters (since AT
command strings are limited to a maximum of 256 bytes total).
Output: This command will produce an ERROR message if you are not connected to a central
device, or if the internal TX FIFO on the Bluefruit LE module is full.
As of firmware release 0.6.2 and higher, AT+BLEUARTTX can accept a limited set of escape code
sequences:
\r = carriage return
\n = new line
\t = tab
\b = backspace
\\ = backward slash
As of firmware release 0.6.7 and higher, AT+BLEUARTTX can accept the following escape code
sequence since AT+BLEUARTTX=? has a specific meaning to the AT parser:
\? = transmits a single question mark
You must be connected to another device for this command to execute
# Send a string when connected to another device
AT+BLEUARTTX=THIS IS A TEST
OK
# Send a string when not connected
AT+BLEUARTTX=THIS IS A TEST
ERROR
TX FIFO Buffer Handling
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 114 of 173
Starting with firmware version 0.6.7, when the TX FIFO buffer is full a 200ms blocking delay will be
used to see if any free space becomes available in the FIFO before returning ERROR. The
exact process is detailed in the flow chart below:
Note: The TX FIFO full check will happen for each GATT transaction (of up to 20 bytes of data
each), so large data transfers may have multiple 200ms wait states.
You can use the AT+BLEUARTFIFO=TX (http://adafru.it/id3) command to check the size of the TX
FIFO before sending data to ensure that you have enough free space available in the buffer.
The TX FIFO has the following size, depending on the firmware version used:
Firmware <=0.6.6: 160 characters wide
Firmware >=0.6.7: 1024 characters wide
It IS possible with large data transfers that part of the payload can be transmitted, and the
command can still produce an ERROR if the FIFO doesn't empty in time in the middle of the
payload transfer (since data is transmitted in maximum 20 byte chunks). If you need to ensure
reliable data transfer, you should always check the TX FIFO size before sending data, which you
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 115 of 173
can do using the AT+BLEUARTFIFO command. If not enough space is available for the entire
payload, add a SW delay until enough space is available. Any single AT+BLEUARTTX command
can fit into the FIFO, but multiple large instances of this command may cause the FIFO to fill up
mid transfer.
AT+BLEUARTRX
This command will dump the UART service (http://adafru.it/iCn)'s RX buffer to the display if any data
has been received from from the UART service while running in Command Mode. The data will be
removed from the buffer once it is displayed using this command.
Any characters left in the buffer when switching back to Data Mode will cause the buffered characters
to be displayed as soon as the mode switch is complete (within the limits of available buffer space,
which is 1024 bytes on current black 32KB SRAM devices, or 160 bytes for the blue first generation
BLEFriend board based on 16KB SRAM parts).
Codebase Revision: 0.3.0
Parameters: None
Output: The RX buffer's content if any data is available, otherwise nothing.
You can also use the AT+BLEUARTFIFO=RX command to check if any incoming data is
available or not.
# Command results when data is available
AT+BLEUARTRX
Sent from Android
OK
# Command results when no data is available
AT+BLEUARTRX
OK
AT+BLEUARTFIFO
This command will return the free space available in the BLE UART TX and RX FIFOs. If you are
transmitting large chunks of data, you may want to check if you have enough free space in the TX
FIFO before sending, keeping in mind that individual GATT packets can contain up to 20 user bytes
each.
Codebase Revision: 0.6.7
Parameters: Running this command with no parameters will return two comma-separated values
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 116 of 173
indicating the free space in the TX buffer, following by the RX buffer. To request a specific buffer, you
can execute the command with either a "TX" or "RX" value (For example: "AT+BLEUARTFIFO=TX").
Output: The free space remaining in the TX and RX FIFO buffer if no parameter is present, otherwise
the free space remaining in the specified FIFO buffer.
AT+BLEUARTFIFO
1024,1024
OK
AT+BLEUARTFIFO=TX
1024
OK
AT+BLEUARTFIFO=RX
1024
OK
AT+BLEKEYBOARDEN
This command will enable GATT over HID (GoH) keyboard support, which allows you to emulate a
keyboard on supported iOS and Android devices. By default HID keyboard support is disabled, so you
need to set BLEKEYBOARDEN to 1 and then perform a system reset before the keyboard will be
enumerated and appear in the Bluetooth preferences on your phone, where if can be bonded as a
BLE keyboard.
Codebase Revision: 0.5.0
Parameters: 1 or 0 (1 = enable, 0 = disable)
Output: None
As of firmware version 0.6.6 this command is now an alias for AT+BLEHIDEN
You must perform a system reset (ATZ) before the changes take effect!
Before you can use your HID over GATT keyboard, you will need to bond your mobile device with
the Bluefruit LE module in the Bluetooth preferences panel.
# Enable BLE keyboard support then reset
AT+BLEKEYBOARDEN=1
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 117 of 173
OK
ATZ
OK
# Disable BLE keyboard support then reset
AT+BLEKEYBOARDEN=0
OK
ATZ
OK
AT+BLEKEYBOARD
Sends text data over the BLE keyboard interface (if it has previously been enabled via
AT+BLEKEYBOARDEN).
Any valid alpha-numeric character can be sent, and the following escape sequences are also
supported:
\r - Carriage Return
\n - Line Feed
\b - Backspace
\t - Tab
\\ - Backslash
As of version 0.6.7 you can also use the following escape code when sending a single character
('AT+BLEKEYBOARD=?' has another meaning for the AT parser):
\? - Question mark
Codebase Revision: 0.5.0
Parameters: The text string (optionally including escape characters) to transmit
Output: None
# Send a URI with a new line ending to execute in Chrome, etc.
AT+BLEKEYBOARD=http://www.adafruit.com\r\n
OK
# Send a single question mark (special use case, 0.6.7+)
AT+BLEKEYBOARD=\?
OK
AT+BLEKEYBOARDCODE
Sends a raw hex sequence of USB HID keycodes to the BLE keyboard interface including key
modifiers and up to six alpha-numeric characters.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 118 of 173
This command accepts the following ascii-encoded HEX payload, matching the way HID over GATT
sends keyboard data:
Byte 0: Modifier
Byte 1: Reserved (should always be 00)
Bytes 2..7: Hexadecimal values for ASCII-encoded characters (if no character is used you can
enter '00' or leave trailing characters empty)
After a keycode sequence is sent with the AT+BLEKEYBOARDCODE command, you must send a
second AT+BLEKEYBOARDCODE command with at least two 00 characters to indicate the
keys were released!
Modifier Values
The modifier byte can have one or more of the following bits set:
Bit
Bit
Bit
Bit
0
1
2
3
(0x01): Left Control
(0x02): Left Shift
(0x04): Left Alt
(0x08): Left Window
Bit
Bit
Bit
Bit
4
5
6
7
(0x10): Right Control
(0x20): Right Shift
(0x40): Right Alt
(0x80): Right Window
Codebase Revision: 0.5.0
Parameters: A set of hexadecimal values separated by a hyphen ('-'). Note that these are HID scan
code values, not standard ASCII values!
Output: None
HID key code values don't correspond to ASCII key codes! For example, 'a' has an HID keycode
value of '04', and there is no keycode for an upper case 'A' since you use the modifier to set
upper case values. For details, google 'usb hid keyboard scan codes', and see the example
below.
A list of HID keyboard codes can be found here (http://adafru.it/cQV) (see section 7).
# send 'abc' with shift key --> 'ABC'
AT+BLEKEYBOARDCODE=02-00-04-05-06-00-00
OK
# Indicate that the keys were released (mandatory!)
AT+BLEKEYBOARDCODE=00-00
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 119 of 173
AT+BLEHIDEN
This command will enable GATT over HID (GoH) support, which allows you to emulate a keyboard,
mouse or media controll on supported iOS, Android, OSX and Windows 10 devices. By default HID
support is disabled, so you need to set BLEHIDEN to 1 and then perform a system reset before the
HID devices will be enumerated and appear in on your central device.
Codebase Revision: 0.6.6
Parameters: 1 or 0 (1 = enable, 0 = disable)
Output: None
You normally need to 'bond' the Bluefruit LE peripheral to use the HID commands, and the exact
bonding process will change from one operating system to another.
If you have previously bonded to a device and need to clear the bond, you can run the
AT+FACTORYRESET command which will erase all stored bond data on the Bluefruit LE module.
# Enable GATT over HID support on the Bluefruit LE module
AT+BLEHIDEN=1
OK
# Reset so that the changes take effect
ATZ
OK
AT+BLEHIDMOUSEMOVE
Moves the HID mouse or scroll wheen position the specified number of ticks.
All parameters are signed 8-bit values (-128 to +127). Positive values move to the right or down, and
origin is the top left corner.
Codebase Revision: 0.6.6
Parameters: X Ticks (+/-), Y Ticks (+/-), Scroll Wheel (+/-), Pan Wheel (+/-)
Output: None
# Move the mouse 100 ticks right and 100 ticks down
AT+BLEHIDMOUSEMOVE=100,100
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 120 of 173
# Scroll down 20 pixels or lines (depending on context)
AT+BLEHIDMOUSEMOVE=,,20,
OK
# Pan (horizontal scroll) to the right (exact behaviour depends on OS)
AT+BLEHIDMOUSEMOVE=0,0,0,100
AT+BLEHIDMOUSEBUTTON
Manipulates the HID mouse buttons via the specific string(s).
Codebase Revision: 0.6.6
Parameters: Button Mask String [L][R][M][B][F], Action [PRESS][CLICK][DOUBLECLICK][HOLD]
L = Left Button
R = Right Button
M = Middle Button
B = Back Button
F = Forward Button
If the second parameter (Action) is "HOLD", an optional third parameter can be passed
specifying how long the button should be held in milliseconds.
Output: None
# Double click the left mouse button
AT+BLEHIDMOUSEBUTTON=L,doubleclick
OK
# Press the left mouse button down, move the mouse, then release L
# This is required to perform 'drag' then stop type operations
AT+BLEHIDMOUSEBUTTON=L
OK
AT+BLEHIDMOUSEMOVE=-100,50
OK
AT+BLEHIDMOUSEBUTTON=0
OK
# Hold the backward mouse button for 200 milliseconds (OS dependent)
AT+BLEHIDMOUSEBUTTON=B,hold,200
OK
AT+BLEHIDCONTROLKEY
Sends HID media control commands for the bonded device (adjust volume, screen brightness, song
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 121 of 173
selection, etc.).
Codebase Revision: 0.6.6
Parameters: The HID control key to send, followed by an optional delay in ms to hold the button
The control key string can be one of the following values:
System Controls (works on most systems)
BRIGHTNESS+
BRIGHTNESSMedia Controls (works on most systems)
PLAYPAUSE
MEDIANEXT
MEDIAPREVIOUS
MEDIASTOP
Sound Controls (works on most systems)
VOLUME
MUTE
BASS
TREBLE
BASS_BOOST
VOLUME+
VOLUMEBASS+
BASSTREBLE+
TREBLEApplication Launchers (Windows 10 only so far)
EMAILREADER
CALCULATOR
FILEBROWSER
Browser/File Explorer Controls (Firefox on Windows/Android only)
SEARCH
HOME
BACK
FORWARD
STOP
REFRESH
BOOKMARKS
You can also send a raw 16-bit hexadecimal value in the '0xABCD' format. A full list of 16-bit 'HID
Consumer Control Key Codes' can be found here (http://adafru.it/cQV)(see section 12).
Output: Normally none.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 122 of 173
If you are not bonded and connected to a central device, this command will return ERROR. Make
sure you are connected and HID support is enabled before running these commands.
# Toggle the sound on the bonded central device
AT+BLEHIDCONTROLKEY=MUTE
OK
# Hold the VOLUME+ key for 500ms
AT+BLEHIDCONTROLKEY=VOLUME+,500
OK
# Send a raw 16-bit Consumer Key Code (0x006F = Brightness+)
AT+BLEHIDCONTROLKEY=0x006F
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 123 of 173
BLE GAP
GAP (http://adafru.it/iCo), which stands for the Generic Access Profile, governs advertising and
connections with Bluetooth Low Energy devices.
The following commands can be used to configure the GAP settings on the BLE module.
You can use these commands to modify the advertising data (for ex. the device name that appears
during the advertising process), to retrieve information about the connection that has been established
between two devices, or the disconnect if you no longer wish to maintain a connection.
AT+GAPGETCONN
Diplays the current connection status (if we are connected to another BLE device or not).
Codebase Revision: 0.3.0
Parameters: None
Output: 1 if we are connected, otherwise 0
# Connected
AT+GAPGETCONN
1
OK
# Not connected
AT+GAPGETCONN
0
OK
AT+GAPDISCONNECT
Disconnects to the external device if we are currently connected.
Codebase Revision: 0.3.0
Parameters: None
Output: None
AT+GAPDISCONNECT
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 124 of 173
AT+GAPDEVNAME
Gets or sets the device name, which is included in the advertising payload for the Bluefruit LE module
Codebase Revision: 0.3.0
Parameters:
None to read the current device name
The new device name if you want to change the value
Output: The device name if the command is executed in read mode
Updating the device name will persist the new value to non-volatile memory, and the updated
name will be used when the device is reset. To reset the device to factory settings and clean the
config data from memory run the AT+FACTORYRESET command.
# Read the current device name
AT+GAPDEVNAME
UART
OK
# Update the device name to 'BLEFriend'
AT+GAPDEVNAME=BLEFriend
OK
# Reset to take effect
ATZ
OK
AT+GAPDELBONDS
Deletes and bonding information stored on the Bluefruit LE module.
Codebase Revision: 0.3.0
Parameters: None
Output: None
AT+GAPDELBONDS
OK
AT+GAPINTERVALS
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 125 of 173
Gets or sets the various advertising and connection intervals for the Bluefruit LE module.
Be extremely careful with this command since it can be easy to cause problems changing the
intervals, and depending on the values selected some mobile devices may no longer recognize the
module or refuse to connect to it.
Codebase Revision: 0.3.0
Parameters: If updating the GAP intervals, the following comma-separated values can be entered:
Minimum connection interval (in milliseconds)
Maximum connection interval (in milliseconds)
Fast Advertising interval (in milliseconds)
Fast Advertising timeout (in seconds)
To save power, the Bluefruit modules automatically drop to a lower advertising rate after 'fast
advertising timeout' seconds. The default value is 30 seconds. The low power advertising interval
is hard-coded to approximately 0.6s. Support to control the low power interval will be added in the
0.7.0 firmware release.
Please note the following min and max limitations for the GAP parameters:
Absolute minimum connection interval: 10ms
Absolute maximum connection interval: 4000ms
Absolute minimum fast advertising interval: 20ms
Absolute maximum fast advertisting interval: 10240ms
If you only wish to update one interval value, leave the other comma-separated values empty (ex.
',,110,' will only update the third value, advertising interval).
Output: If reading the current GAP interval settings, the following comma-separated information will
be displayed:
Minimum connection interval (in milliseconds)
Maximum connection interval (in milliseconds)
Advertising interval (in milliseconds)
Advertising timeout (in milliseconds)
Updating the GAP intervals will persist the new values to non-volatile memory, and the updated
values will be used when the device is reset. To reset the device to factory settings and clean the
config data from memory run the AT+FACTORYRESET command.
# Read the current GAP intervals
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 126 of 173
AT+GAPINTERVALS
20,100,100,30
# Update all values
AT+GAPINTERVALS=20,200,200,30
OK
# Update only the advertising interval
AT+GAPINTERVALS=,,150,
OK
AT+GAPSTARTADV
Causes the Bluefruit LE module to start transmitting advertising packets if this isn't already the case
(assuming we aren't already connected to an external device).
Codebase Revision: 0.3.0
Parameters: None
Output: None
# Command results when advertising data is not being sent
AT+GAPSTARTADV
OK
# Command results when we are already advertising
AT+GAPSTARTADV
ERROR
# Command results when we are connected to another device
AT+GAPSTARTADV
ERROR
AT+GAPSTOPADV
Stops advertising packets from being transmitted by the Bluefruit LE module.
Codebase Revision: 0.3.0
Parameters: None
Output: None
AT+GAPSTOPADV
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 127 of 173
AT+GAPSETADVDATA
Sets the raw advertising data payload to the specified byte array (overriding the normal advertising
data), following the guidelines in the Bluetooth 4.0 or 4.1 Core Specification (http://adafru.it/ddd).
In particular, Core Specification Supplement (CSS) v4 contains the details on common advertising
data fields like 'Flags' (Part A, Section 1.3) and the various Service UUID lists (Part A, Section 1.1). A
list of all possible GAP Data Types is available on the Bluetooth SIG's Generic Access
Profile (http://adafru.it/cYs) page.
The Advertising Data payload consists of Generic Access Profile (http://adafru.it/cYs) data that is
inserted into the advertising packet in the following format: [U8:LEN] [U8:Data Type Value] [n:Value]
WARNING: This command requires a degree of knowledge about the low level details of the
Bluetooth 4.0 or 4.1 Core Specification, and should only be used by expert users. Misuse of this
command can easily cause your device to be undetectable by central devices in radio range.
WARNING: This command will override the normal advertising payload and may prevent some
services from acting as expected.
To restore the advertising data to the normal default values use the AT+FACTORYRESET
command.
For example, to insert the 'Flags' Data Type (Data Type Value 0x01), and set the value to
0x06/0b00000110 (BR/EDR Not Supported and LE General Discoverable Mode) we would use the
following byte array:
02-01-06
0x02 indicates the number of bytes in the entry
0x01 is the 'Data Type Value (http://adafru.it/cYs)' and indicates that this is a 'Flag'
0x06 (0b00000110) is the Flag value, and asserts the following fields (see Core Specification
4.0, Volume 3, Part C, 18.1):
LE General Discoverable Mode (i.e. anyone can discover this device)
BR/EDR Not Supported (i.e. this is a Bluetooth Low Energy only device)
If we also want to include two 16-bit service UUIDs in the advertising data (so that listening devices
know that we support these services) we could append the following data to the byte array:
05-02-0D-18-0A-18
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 128 of 173
0x05 indicates that the number of bytes in the entry (5)
0x02 is the 'Data Type Value (http://adafru.it/cYs)' and indicates that this is an 'Incomplete List
of 16-bit Service Class UUIDs'
0x0D 0x18 is the first 16-bit UUID (which translates to 0x180D, corresponding to the Heart Rate
Service (http://adafru.it/ddB)).
0x0A 0x18 is another 16-bit UUID (which translates to 0x180A, corresponding to the Device
Information Service (http://adafru.it/ecj)).
Including the service UUIDs is important since some mobile applications will only work with
devices that advertise a specific service UUID in the advertising packet. This is true for most apps
from Nordic Semiconductors, for example.
Codebase Revision: 0.3.0
Parameters: The raw byte array that should be inserted into the advertising data section of the
advertising packet, being careful to stay within the space limits defined by the Bluetooth Core
Specification.
Response: None
# Advertise as Discoverable and BLE only with 16-bit UUIDs 0x180D and 0x180A
AT+GAPSETADVDATA=02-01-06-05-02-0d-18-0a-18
OK
The results of this command can be seen in the screenshot below, taken from a sniffer analyzing the
advertising packets in Wireshark. The advertising data payload is higlighted in blue in the raw byte
array at the bottom of the image, and the packet analysis is in the upper section:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 129 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 130 of 173
BLE GATT
GATT (http://adafru.it/iCp), which standards for the Generic ATTribute Profile, governs data
organization and data exchanges between connected devices. One device (the peripheral) acts as a
GATT Server, which stores data in Attribute records, and the second device in the connection (the
central) acts as a GATT Client, requesting data from the server whenever necessary.
The following commands can be used to create custom GATT services and characteristics on the
BLEFriend, which are used to store and exchange data.
Please note that any characteristics that you define here will automatically be saved to non-volatile
FLASH config memory on the device and re-initialised the next time the device starts.
You need to perform a system reset via 'ATZ' before most of the commands below will take
effect!
If you want to clear any previous config value, enter the 'AT+FACTORYRESET' command before
working on a new peripheral configuration.
AT+GATTCLEAR
Clears any custom GATT services and characteristics that have been defined on the device.
Codebase Revision: 0.3.0
Parameters: None
Response: None
AT+GATTCLEAR
OK
AT+GATTADDSERVICE
Adds a new custom service definition to the device.
Codebase Revision: 0.3.0
Parameters: This command accepts a set of comma-separated key-value pairs that are used to
define the service properties. The following key-value pairs can be used:
UUID: The 16-bit UUID to use for this service. 16-bit values should be in hexadecimal format
(0x1234).
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 131 of 173
UUID128: The 128-bit UUID to use for this service. 128-bit values should be in the following
format: 00-11-22-33-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF
Response: The index value of the service in the custom GATT service lookup table. (It's important to
keep track of these index values to work with the service later.)
Note: Key values are not case-sensitive
Only one UUID type can be entered for the service (either UUID or UUID128)
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a battery service (UUID = 0x180F) to the peripheral
AT+GATTADDSERVICE=UUID=0x180F
1
OK
# Add a battery measurement characteristic (UUID = 0x2A19), notify enabled
AT+GATTADDCHAR=UUID=0x2A19,PROPERTIES=0x10,MIN_LEN=1,VALUE=100
1
OK
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a custom service to the peripheral
AT+GATTADDSERVICE=UUID128=00-11-00-11-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF
1
OK
# Add a custom characteristic to the above service (making sure that there
# is no conflict between the 16-bit UUID and bytes 3+4 of the 128-bit service UUID)
AT+GATTADDCHAR=UUID=0x0002,PROPERTIES=0x02,MIN_LEN=1,VALUE=100
1
OK
AT+GATTADDCHAR
Adds a custom characteristic to the last service that was added to the peripheral (via
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 132 of 173
AT+GATTADDSERVICE).
AT+GATTADDCHAR must be run AFTER AT+GATTADDSERVICE, and will add the new
characteristic to the last service definition that was added.
As of version 0.6.6 of the Bluefruit LE firmware you can now use custom 128-bit UUIDs with this
command. See the example at the bottom of this command description.
Codebase Revision: 0.3.0
Parameters: This command accepts a set of comma-separated key-value pairs that are used to
define the characteristic properties. The following key-value pais can be used:
UUID: The 16-bit UUID to use for the characteristic (which will be insert in the 3rd and 4th bytes
of the parent services 128-bit UUID). This value should be entered in hexadecimal format (ex.
'UUID=0x1234'). This value must be unique, and should not conflict with bytes 3+4 of the parent
service's 128-bit UUID.
PROPERTIES: The 8-bit characteristic properties field, as defined by the Bluetooth SIG. The
following values can be used:
0x02 - Read
0x04 - Write Without Response
0x08 - Write
0x10 - Notify
0x20 - Indicate
MIN_LEN: The minimum size of the values for this characteristic (in bytes, min = 1, max = 20,
default = 1)
MAX_LEN: The maximum size of the values for the characteristic (in bytes, min = 1, max = 20,
default = 1)
VALUE: The initial value to assign to this characteristic (within the limits of 'MIN_LEN' and
'MAX_LEN'). Value can be an integer ("-100", "27"), a hexadecimal value ("0xABCD"), a byte
array ("aa-bb-cc-dd") or a string ("GATT!").
Response: The index value of the characteristic in the custom GATT characteristic lookup table. (It's
important to keep track of these characteristic index values to work with the characteristic later.)
Note: Key values are not case-sensitive
Make sure that the 16-bit UUID is unique and does not conflict with bytes 3+4 of the 128-bit
service UUID
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 133 of 173
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a battery service (UUID = 0x180F) to the peripheral
AT+GATTADDSERVICE=UUID=0x180F
1
OK
# Add a battery measurement characteristic (UUID = 0x2A19), notify enabled
AT+GATTADDCHAR=UUID=0x2A19,PROPERTIES=0x10,MIN_LEN=1,VALUE=100
1
OK
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a custom service to the peripheral
AT+GATTADDSERVICE=UUID128=00-11-00-11-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF
1
OK
# Add a custom characteristic to the above service (making sure that there
# is no conflict between the 16-bit UUID and bytes 3+4 of the 128-bit service UUID)
AT+GATTADDCHAR=UUID=0x0002,PROPERTIES=0x02,MIN_LEN=1,VALUE=100
1
OK
Version 0.6.6 of the Bluefruit LE firmware added the ability to use a new 'UUID128' flag to add custom
128-bit UUIDs that aren't related to the parent service UUID (which is used when passing the 16-bit
'UUID' flag).
To specify a 128-bit UUID for your customer characteristic, enter a value resembling the following
syntax:
# Add a custom characteristic to the above service using a
# custom 128-bit UUID
AT+GATTADDCHAR=UUID128=00-11-22-33-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF,PROPERTIES=0x02,MIN_
LEN=1,VALUE=100
1
OK
AT+GATTCHAR
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 134 of 173
Gets or sets the value of the specified custom GATT characteristic (based on the index ID returned
when the characteristic was added to the system via AT+GATTADDCHAR).
Codebase Revision: 0.3.0
Parameters: This function takes one or two comma-separated functions (one parameter = read, two
parameters = write).
The first parameter is the characteristic index value, as returned from the AT+GATTADDCHAR
function. This parameter is always required, and if no second parameter is entered the current
value of this characteristic will be returned.
The second (optional) parameter is the new value to assign to this characteristic (within the
MIN_SIZE and MAX_SIZE limits defined when creating it).
Response: If the command is used in read mode (only the characteristic index is provided as a
value), the response will display the current value of the characteristics. If the command is used in
write mode (two comma-separated values are provided), the characteristics will be updated to use the
provided value.
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a battery service (UUID = 0x180F) to the peripheral
AT+GATTADDSERVICE=UUID=0x180F
1
OK
# Add a battery measurement characteristic (UUID = 0x2A19), notify enabled
AT+GATTADDCHAR=UUID=0x2A19,PROPERTIES=0x10,MIN_LEN=1,VALUE=100
1
OK
# Read the battery measurement characteristic (index ID = 1)
AT+GATTCHAR=1
0x64
OK
# Update the battery measurement characteristic to 32 (hex 0x20)
AT+GATTCHAR=1,32
OK
# Verify the previous write attempt
AT+GATTCHAR=1
0x20
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 135 of 173
AT+GATTLIST
Lists all custom GATT services and characteristics that have been defined on the device.
Codebase Revision: 0.3.0
Parameters: None
Response: A list of all custom services and characteristics defined on the device.
# Clear any previous custom services/characteristics
AT+GATTCLEAR
OK
# Add a battery service (UUID = 0x180F) to the peripheral
AT+GATTADDSERVICE=UUID=0x180F
1
OK
# Add a battery measurement characteristic (UUID = 0x2A19), notify enabled
AT+GATTADDCHAR=UUID=0x2A19,PROPERTIES=0x10,MIN_LEN=1,VALUE=100
1
OK
# Add a custom service to the peripheral
AT+GATTADDSERVICE=UUID128=00-11-00-11-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF
2
OK
# Add a custom characteristic to the above service (making sure that there
# is no conflict between the 16-bit UUID and bytes 3+4 of the 128-bit service UUID)
AT+GATTADDCHAR=UUID=0x0002,PROPERTIES=0x02,MIN_LEN=1,VALUE=100
2
OK
# Get a list of all custom GATT services and characteristics on the device
AT+GATTLIST
ID=01,UUID=0x180F
ID=01,UUID=0x2A19,PROPERTIES=0x10,MIN_LEN=1,MAX_LEN=1,VALUE=0x64
ID=02,UUID=0x11, UUID128=00-11-00-11-44-55-66-77-88-99-AA-BB-CC-DD-EE-FF
ID=02,UUID=0x02,PROPERTIES=0x02,MIN_LEN=1,MAX_LEN=1,VALUE=0x64
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 136 of 173
Debug
The following debug commands are available on Bluefruit LE modules:
Use these commands with care since they can easily lead to a HardFault error on the ARM core,
which will cause the device to stop responding.
AT+DBGMEMRD
Displays the raw memory contents at the specified address.
Codebase Revision: 0.3.0
Parameters: The following comma-separated parameters can be used with this command:
The starting address to read memory from (in hexadecimal form, with or without the leading
'0x')
The word size (can be 1, 2, 4 or 8)
The number of words to read
Output: The raw memory contents in hexadecimal format using the specified length and word size
(see examples below for details)
# Read 12 1-byte values starting at 0x10000009
AT+DBGMEMRD=0x10000009,1,12
FF FF FF FF FF FF FF 00 04 00 00 00
OK
# Try to read 2 4-byte values starting at 0x10000000
AT+DBGMEMRD=0x10000000,4,2
55AA55AA 55AA55AA
OK
# Try to read 2 4-byte values starting at 0x10000009
# This will fail because the Cortex M0 can't perform misaligned
# reads, and any non 8-bit values must start on an even address
AT+DBGMEMRD=0x10000009,4,2
MISALIGNED ACCESS
ERROR
AT+DBGNVMREAD
Displays the raw contents of the config data section of non-volatile memory
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 137 of 173
Codebase Revision: 0.3.0
Properties: None
Output: The raw config data from non-volatile memory
AT+DBGNVMRD
FE CA 38 05 00 03 00 00 01 12 01 00 55 41 52 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
0 00 00 00 00 00 00 00 14 00 64 00 64 00 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 BA FF 00 00
OK
AT+DBGSTACKSIZE
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 138 of 173
AT+DBGSTACKSIZE
Returns the current stack size, to help detect stack overflow or detect stack memory usage when
optimising memory usage on the system.
Codebase Revision: 0.4.7
Parameters: None
Output: The current size of stack memory in bytes
AT+DBGSTACKSIZE
1032
OK
AT+DBGSTACKDUMP
Dumps the current stack contents. Unused sections of stack memory are filled with '0xCAFEFOOD' to
help determine where stack usage stops.
This command is purely for debug and development purposes.
Codebase Revision: 0.4.7
Parameters: None
Output: The memory contents of the entire stack region
AT+DBGSTACKDUMP
0x20003800: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003810: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003820: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003830: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003840: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003850: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003860: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003870: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003880: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003890: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038A0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038B0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038C0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038D0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038E0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200038F0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003900: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003910: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003920: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003930: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003940: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 139 of 173
0x20003950: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003960: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003970: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003980: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003990: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039A0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039B0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039C0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039D0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039E0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x200039F0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A00: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A10: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A20: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A30: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A40: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A50: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A60: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A70: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A80: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003A90: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AA0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AB0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AC0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AD0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AE0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003AF0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B00: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B10: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B20: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B30: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B40: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B50: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B60: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B70: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B80: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003B90: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BA0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BB0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BC0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BD0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BE0: CAFEF00D CAFEF00D CAFEF00D CAFEF00D
0x20003BF0: CAFEF00D CAFEF00D 00000000 CAFEF00D
0x20003C00: 00000004 20001D04 CAFEF00D FFFFEF68
0x20003C10: CAFEF00D 00001098 CAFEF00D CAFEF00D
0x20003C20: CAFEF00D CAFEF00D 00001006 200018D8
0x20003C30: 00000001 200018D8 20001C50 00000004
0x20003C40: 20001BB0 000134A5 0000100D 20001D28
0x20003C50: 00000006 00000006 20001C38 20001D44
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 140 of 173
0x20003C60: 20001C6C 20001D44 00000006 00000005
0x20003C70: 20001D38 00000005 20001D38 00000000
0x20003C80: 00000001 00012083 200018C8 000013D3
0x20003C90: 00550000 00000001 80E80000 4FC40000
0x20003CA0: 000080E8 00000009 60900000 000080E8
0x20003CB0: 60140000 20002764 0009608F 000080E8
0x20003CC0: 80000000 000080E8 00000000 00129F5F
0x20003CD0: 00000000 0001E4D9 80E80000 200018C8
0x20003CE0: 200018D4 00000000 80E80000 000000FF
0x20003CF0: 0000011C 0001BCE1 0000203A 0001BC1D
0x20003D00: 00000000 0001BC1D 80E80000 0001BCE1
0x20003D10: 0000011C 0001BDA9 80E80000 0001BDA9
0x20003D20: 0000011C FFFFFFF9 008B8000 0001BC1D
0x20003D30: 00000048 00000010 0000A000 00000009
0x20003D40: 0001E326 00000001 80E80000 51538000
0x20003D50: 000080E8 0001E9CF 00000000 00000009
0x20003D60: 61C78000 000080E8 00000048 00000504
0x20003D70: 0000A1FC 0002125C 00000000 000080E8
0x20003D80: 00000000 0012A236 00000000 0001E4D9
0x20003D90: 000080E8 00000009 00004998 000080E8
0x20003DA0: 622C8000 0012A29B 00000042 0001E479
0x20003DB0: 40011000 000185EF 00006E10 00000000
0x20003DC0: 00000000 00000004 0000000C 00000000
0x20003DD0: 62780000 00018579 2000311B 0001ACDF
0x20003DE0: 00000000 20003054 20002050 00000001
0x20003DF0: 20003DF8 0002085D 00000001 200030D4
0x20003E00: 00000200 0001F663 00000001 200030D4
0x20003E10: 00000001 2000311B 0001F631 00020A6D
0x20003E20: 00000001 00000000 0000000C 200030D4
0x20003E30: 2000311B 00000042 200030D4 00020AD7
0x20003E40: 20002050 200030D4 20002050 00020833
0x20003E50: 20002050 20003F1B 20002050 0001FF89
0x20003E60: 20002050 0001FFA3 00000005 20003ED8
0x20003E70: 20002050 0001FF8B 00000010 00020491
0x20003E80: 00000001 0012A54E 00000020 00022409
0x20003E90: 00000000 20002050 200030D4 0001FF8B
0x20003EA0: 00021263 00000005 0000000C 20003F74
0x20003EB0: 20003ED8 20002050 200030D4 00020187
0x20003EC0: 20003ED4 20003054 00000000 20003F75
0x20003ED0: 00000008 20003F64 00000084 FFFFFFFF
0x20003EE0: FFFFFFFF 00000008 00000001 00000008
0x20003EF0: 20302058 2000311B 0001F631 00020A6D
0x20003F00: 20002050 00000000 0000000C 200030D4
0x20003F10: 32002050 32303032 00323330 000258D7
0x20003F20: 20002050 200030D4 20002050 00020833
0x20003F30: 00000000 20002050 00000020 000001CE
0x20003F40: 20003F40 200030D4 00000004 0001ED83
0x20003F50: 200030D4 20003F60 000001D6 000001D7
0x20003F60: 000001D8 00016559 0000000C 00000000
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 141 of 173
0x20003F70: 6C383025 00000058 200030D4 FFFFFFFF
0x20003F80: 1FFF4000 00000028 00000028 000217F8
0x20003F90: 200020C7 000166C5 000166AD 00017ED9
0x20003FA0: FFFFFFFF 200020B8 2000306C 200030D4
0x20003FB0: 200020B4 000180AD 1FFF4000 200020B0
0x20003FC0: 200020B0 200020B0 1FFF4000 0001A63D
0x20003FD0: CAFEF00D CAFEF00D 200020B4 00000002
0x20003FE0: FFFFFFFF FFFFFFFF 1FFF4000 00000000
0x20003FF0: 00000000 00000000 00000000 00016113
OK
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 142 of 173
History
This page tracks additions or changes to the AT command set based on the firmware version number
(which you can obtain via the 'ATI' command):
Version 0.6.7
The following AT commands were added in the 0.6.7 release:
AT+BLEUARTFIFO
Returns the number of free bytes available in the TX and RX FIFOs for the Bluetooth UART
Service.
The following commands were changed in the 0.6.7 release:
AT+BLEUARTTX
If the TX FIFO is full, the command will wait up to 200ms to see if the FIFO size decreases
before exiting and returning an ERROR response due to the FIFO being full.
AT+BLEURIBEACON
This command will go back to using the old (deprecated) UriBeacon UUID (0xFED8), and only
the AT+EDDYSTONEURL command will use the newer Eddystone UUID (0xFEAA).
AT+BLEKEYBOARD and AT+BLEUARTTX
These commands now accept '\?' as an escape code since 'AT+BLEKEYBOARD=?' has another
meaning for the AT parser. To send a single question mark the following command should be
used: 'AT+BLEKEYBOARD=\?' or 'AT+BLEUARTTX=\?'
AT+EDDYSTONEURL
This command now accepts an optional third parameter for RSSI at 0m value (default is 18dBm).
Running this command with no parameters ('AT+EDDYSTONEURL\r\n') will now return the
current URL.
Key bug fixes in this release:
The FIFO handling for the Bluetooth UART Service was improved for speed and stability, and
the TX and RF FIFOs were increased to 1024 bytes each.
An issue where a timer overflow was causing factory resets every 4 hours or so has been
resolved.
Fixed a problem with the GATT server where 'value_len' was being incorrectly parsed for
integer values in characteristics where 'max_len' >4
Version 0.6.6
The following AT commands were added in the 0.6.6 release:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 143 of 173
AT+EDDYSTONEURL
Update the URL for the beacon and switch to beacon mode
AT+EDDYSTONEENABLE
Enable/disable beacon mode using the configured url
AT+EDDYSTONECONFIGEN
Enable advertising for the the Eddystone configuration service for the specified number of
seconds
AT+HWMODELED
Allows the user to override the default MODE LED behaviour with one of the following options:
DISABLE, MODE, HWUART, BLEUART, SPI, MANUAL
AT+BLECONTROLKEY
Allows HID media control values to be sent to a bonded central device (volume, screen
brightness, etc.)
AT+BLEHIDEN
Enables or disables BLE HID support in the Bluefruit LE firmware (mouse, keyboard and media
control)
AT+BLEMOUSEMOVE
To move the HID mouse
AT+BLEMOUSEBUTTON
To set the state of the HID mouse buttons
The following commands were changed in the 0.6.6 release:
AT+BLEKEYBOARDEN - Now an alias for AT+BLEHIDEN
AT+GATTADDCHAR - Added a new UUID128 field to allow custom UUIDs
Key bug fixes in this release:
Fixed issues with long beacon URLs
Fixed big endian issue in at+blebeacon for major & minor number
Known issues with this release:
Windows 10 seems to support a limited number of characteristics for the DIS service. We had to
disable the Serial Number characteristic to enable HID support with windows 10.
Version 0.6.5
The following AT commands were added in the 0.6.5 release:
AT+BLEGETPEERADDR (http://adafru.it/iCq)
The following commands were changed in the 0.6.5 release:
Increased the UART buffer size (on the nRF51) from 128 to 256 bytes
+++ now responds with the current operating mode
Fixed a bug with AT+GATTCHAR values sometimes not being saved to NVM
Fixed a bug with AT+GATTCHAR max_len value not being taken into account after a reset
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 144 of 173
(min_len was always used when repopulating the value)
Version 0.6.2
This is the first release targetting 32KB SRAM parts (QFAC). 16KB SRAM parts can't be used with
this firmware due to memory management issues, and should use the earlier 0.5.0 firmware.
The following AT commands were changed in the 0.6.2 release:
AT+BLEUARTTX (http://adafru.it/iCr)
Basic escape codes were added for new lines, tabs and backspace
AT+BLEKEYBOARD (http://adafru.it/iCr)
Also works with OS X now, and may function with other operating systems that support BLE HID
keyboards
Version 0.5.0
The following AT commands were added in the 0.5.0 release:
AT+BLEKEYBOARDEN (http://adafru.it/iCr)
AT+BLEKEYBOARD (http://adafru.it/iCr)
AT+BLEKEYBOARDCODE (http://adafru.it/iCr)
The following AT commands were changed in the 0.5.0 release:
ATI (http://adafru.it/iCs)
The SoftDevice, SoftDevice version and bootloader version were added as a new (7th) record.
For Ex: "S110 7.1.0, 0.0" indicates version 7.1.0 of the S110 softdevice is used with the 0.0
bootloader (future boards will use a newer 0.1 bootloader).
Other notes concerning 0.5.0:
Starting with version 0.5.0, you can execute the AT+FACTORYRESET command at any point (and
without a terminal emulator) by holding the DFU button down for 10 seconds until the blue
CONNECTED LED starts flashing, then releasing it.
Version 0.4.7
The following AT commands were added in the 0.4.7 release:
+++ (http://adafru.it/iCs)
AT+HWRANDOM (http://adafru.it/iCt)
AT+BLEURIBEACON (http://adafru.it/iCu)
AT+DBGSTACKSIZE (http://adafru.it/iCv)
AT+DBGSTACKDUMP (http://adafru.it/iCv)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 145 of 173
The following commands were changed in the 0.4.7 release:
ATI
(http://adafru.it/iCs)The chip revision was added after the chip name. Whereas ATI would
previously report 'nRF51822', it will now add the specific HW revision if it can be detected (ex
'nRF51822 QFAAG00')
Version 0.3.0
First public release
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 146 of 173
Command Examples
The following code snippets can be used when operating in Command Mode to perform specific tasks.
Heart Rate Monitor Service
The command list below will add a Heart Rate (http://adafru.it/ddB) service to the BLEFriend's attribute
table, with two characteristics:
Heart Rate Measurement (http://adafru.it/ddD)
Body Sensor Location (http://adafru.it/eck)
# Perform a factory reset to make sure we get a clean start
AT+FACTORYRESET
OK
# Add the Heart Rate service entry
AT+GATTADDSERVICE=UUID=0x180D
1
OK
# Add the Heart Rate Measurement characteristic
AT+GATTADDCHAR=UUID=0x2A37, PROPERTIES=0x10, MIN_LEN=2, MAX_LEN=3, VALUE=00-40
1
OK
# Add the Body Sensor Location characteristic
AT+GATTADDCHAR=UUID=0x2A38, PROPERTIES=0x02, MIN_LEN=1, VALUE=3
2
OK
# Create a custom advertising packet that includes the Heart Rate service UUID
AT+GAPSETADVDATA=02-01-06-05-02-0d-18-0a-18
OK
# Reset the device to start advertising with the custom payload
ATZ
OK
# Update the value of the heart rate measurement (set it to 0x004A)
AT+GATTCHAR=1,00-4A
OK
Python Script
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 147 of 173
Python Script
The following code performs the same function, but has been placed inside a Python wrapper using
PySerial (http://adafru.it/cLU) to show how you can script actions for the AT parser.
import io
import sys
import serial
import random
from time import sleep
filename = "hrm.py"
ser = None
serio = None
verbose = True # Set this to True to see all of the incoming serial data
def usage():
"""Displays information on the command-line parameters for this script"""
print "Usage: " + filename + " <serialPort>\n"
print "For example:\n"
print " Windows : " + filename + " COM14"
print " OS X : " + filename + " /dev/tty.usbserial-DN009WNO"
print " Linux : " + filename + " /dev/ttyACM0"
return
def checkargs():
"""Validates the command-line arguments for this script"""
if len(sys.argv) < 2:
print "ERROR: Missing serialPort"
usage()
sys.exit(-1)
if len(sys.argv) > 2:
print "ERROR: Too many arguments (expected 1)."
usage()
sys.exit(-2)
def errorhandler(err, exitonerror=True):
"""Display an error message and exit gracefully on "ERROR\r\n" responses"""
print "ERROR: " + err.message
if exitonerror:
ser.close()
sys.exit(-3)
def atcommand(command, delayms=0):
"""Executes the supplied AT command and waits for a valid response"""
serio.write(unicode(command + "\n"))
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 148 of 173
if delayms:
sleep(delayms/1000)
rx = None
while rx != "OK\r\n" and rx != "ERROR\r\n":
rx = serio.readline(2000)
if verbose:
print unicode(rx.rstrip("\r\n"))
# Check the return value
if rx == "ERROR\r\n":
raise ValueError("AT Parser reported an error on '" + command.rstrip() + "'")
if __name__ == '__main__':
# Make sure we received a single argument (comPort)
checkargs()
# This will automatically open the serial port (no need for ser.open)
ser = serial.Serial(port=sys.argv[1], baudrate=9600, rtscts=True)
serio = io.TextIOWrapper(io.BufferedRWPair(ser, ser, 1),
newline='\r\n',
line_buffering=True)
# Add the HRM service and characteristic definitions
try:
atcommand("AT+FACTORYRESET", 1000) # Wait 1s for this to complete
atcommand("AT+GATTCLEAR")
atcommand("AT+GATTADDSERVICE=UUID=0x180D")
atcommand("AT+GATTADDCHAR=UUID=0x2A37, PROPERTIES=0x10, MIN_LEN=2, MAX_LEN=3, VALUE=0
0-40")
atcommand("AT+GATTADDCHAR=UUID=0x2A38, PROPERTIES=0x02, MIN_LEN=1, VALUE=3")
atcommand("AT+GAPSETADVDATA=02-01-06-05-02-0d-18-0a-18")
# Perform a system reset and wait 1s to come back online
atcommand("ATZ", 1000)
# Update the value every second
while True:
atcommand("AT+GATTCHAR=1,00-%02X" % random.randint(50, 100), 1000)
except ValueError as err:
# One of the commands above returned "ERROR\n"
errorhandler(err)
except KeyboardInterrupt:
# Close gracefully on CTRL+C
ser.close()
sys.exit()
The results of this script can be seen below in the 'HRM' app of Nordic's nRF Toolbox application:
Please note that nRF Toolbox will only display HRM data if the value changes, so you will need to
update the Heart Rate Measurement characteristic at least once after opening the HRM app and
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 149 of 173
connecting to the BLEFriend
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 150 of 173
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 151 of 173
SDEP (SPI Data Transport)
In order to facilitate switching between UART and SPI based Bluefruit LE modules, the Bluefruit LE SPI
Friend and Shield uses the same AT command set at the UART modules ( ATI , AT+HELP , etc.).
These text-based AT commands are encoded as binary messages using a simple binary protocol
we've named SDEP (Simple Data Exhange Protocol).
Most of the time, you never need to deal with SDEP directly, but we've documented the protocol
here in case you need understand the Bluefruit LE SPI interface in depth!
SDEP Overview
SDEP was designed as a bus neutral protocol to handle binary commands and responses -- including
error responses -- in a standard, easy to extend manner. 'Bus neutral' means that we can use SDEP
regardless of the transport mechanism (USB HID, SPI, I2C, Wireless data over the air, etc.).
All SDEP messages have a four byte header, and in the case of the Bluefruit LE modules up to a 16
byte payloads. Larger messages are broken up into several 4+16 bytes message chunks which are
rebuilt at either end of the transport bus. The 20 byte limit (4 byte header + 16 byte payload) was
chosen to take into account the maximum packet size in Bluetooth Low Energy 4.0 (20 bytes per
packet).
SPI Setup
While SDEP is bus neutral, in the case of the Bluefruit LE SPI Friend or Shield, an SPI transport is
used with the following constraints and assumptions, largely to take into account the HW limitations of
the nRF51822 system on chip:
SPI Hardware Requirements
The SPI clock should run <=4MHz
A 100us delay should be added between the moment that the CS line is asserted, and before
any data is transmitted on the SPI bus
The CS line must remain asserted for the entire packet, rather than toggling CS every byte
The CS line can however be deasserted and then reasserted between individual SDEP packets
(of up to 20 bytes each).
IRQ Pin
The IRQ line is asserted by the Bluefruit LE SPI Friend/Shield as long as an entire SDEP packet is
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 152 of 173
available in the buffer on the nRF51822, at which point you should read the packet, keeping the CS
line asserted for the entire transaction (as detailed above).
The IRQ line will remain asserted as long as one or more packets are available, so the line may stay
high after reading a packet, meaning that more packets are still available in the FIFO on the SPI slave
side.
SDEP Packet and SPI Error Identifier
Once CS has been asserted and the mandatory 100us delay has passed, a single byte should be read
from the SPI bus which will indicate the type of payload available on the nRF51822 (see Message
Type Indicator below for more information on SDEP message types). Keep CS asserted after this byte
has been read in case you need to continue reading the rest of the frame.
If a standard SDEP message type indicator (0x10, 0x20, 0x40 or 0x80) is encountered, keep reading
as normal. There are two other indicators that should be taken into account, though, which indicate a
problem on the nRF51822 SPI slave side:
0xFE: Slave device not ready (wait a bit and try again)
0xFF: Slave device read overflow indicator (you've read more data than is available)
This means there are six possible response bytes reading the message type indicator (the first byte
read after an SDEP command is sent): 0x10, 0x20, 0x40, 0x80, which indicate a valid message type,
or 0xFE, 0xFF which indicate an error condition.
Sample Transaction
The following image shows a sample SDEP response that is spread over two packets (since the
response is > 20 bytes in size). Notice that the IRQ line stays asserted between the packets since
more than one packet was available in the FIFO on the Bluefruit LE SPI side:
SDEP (Simple Data Exchange Protocol)
The Simple Data Exchange Protocol (SDEP) can be used to send and receive binary messages
between two connected devices using any binary serial bus (USB HID, USB Bulk, SPI, I2C, Wireless,
etc.), exchanging data using one of four distinct message types (Command, Response, Alert and Error
messages).
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 153 of 173
The protocol is designed to be flexible and extensible, with the only requirement being that individual
messages are 20 bytes or smaller, and that the first byte of every message is a one byte (U8)
identifier that indicates the message type, which defines the format for the remainder of the payload.
Endianness
All values larger than 8-bits are encoded in little endian format. Any deviation from this rule should be
clearly documented.
Message Type Indicator
The first byte of every message is an 8-bit identifier called the Message Type Indicator. This value
indicates the type of message being sent, and allows us to determine the format for the remainder of
the message.
Message Type ID (U8)
Command
0x10
Response
0x20
Alert
0x40
Error
0x80
SDEP Data Transactions
Either connected device can initiate SDEP transactions, though certain transport protocols imposes
restrictions on who can initiate a transfer. The master device, for example, always initiates
transactions with Bluetooth Low Energy or USB, meaning that slave devices can only reply to incoming
commands.
Every device that receives a Command Message must reply with a Response Message, Error
Message or Alert message.
Message Types
Command Messages
Command messages (Message Type = 0x10) have the following structure:
Name
Type Meaning
Message Type U8
Command ID
Always '0x10'
U16 Unique Command Identifier
Payload Length U8
© Adafruit Industries
[7] More data
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 154 of 173
[6-5] Reserved
[4-0] Payload length (0..16)
Payload
...
Optional command payload (parameters, etc.)
Command ID (bytes 1-2) and Payload Length (byte 3) are mandatory in any command message.
The message payload is optional, and will be ignored if Payload Length is set to 0 bytes. When a
message payload is present, it’s length can be anywhere from 1..16 bytes, to stay within the 20-byte
maximum message length.
A long command (>16 bytes payload) must be divided into multiple packets. To facilitate this, the More
data field (bit 7 of byte 3) is used to indicate whether additional packets are available for the same
command. The SDEP receiver must continue to reads packets until it finds a packet with More data ==
0, then assemble all sub-packets into one command if necessary.
The contents of the payload are user defined, and can change from one command to another.
A sample command message would be:
10 34 12 01 FF
0: Message Type (U8)
0x10
1+2: Command ID (U16) 0x34 0x12
3: Payload Len (U8)
0x01
4: Payload (...)
0xFF
The first byte is the Message Type (0x10), which identifies this as a command message.
The second and third bytes are 0x1234 (34 12 in little-endian notation), which is the unique
command ID. This value will be compared against the command lookup table and redirected to
an appropriate command handler function if a matching entry was found.
The fourth byte indicates that we have a message payload of 1 byte
The fifth byte is the 1 byte payload: 0xFF
Response Messages
Response messages (Message Type = 0x20) are generated in response to an incoming command,
and have the following structure:
Name
Type Meaning
Message Type U8
Command ID
Always '0x20'
U16 Command ID this message is a response to
Payload Length U8
© Adafruit Industries
[7] More data
[6-5] Reserved
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 155 of 173
[4-0] Payload length (0..16)
Optional response payload (parameters, etc.)
Payload
By including the Command ID that this response message is related to, the recipient can more easily
correlate responses and commands. This is useful in situations where multiple commands are sent,
and some commands may take a longer period of time to execute than subsequent commands with a
different command ID.
Response messages can only be generate in response to a command message, so the Command ID
field should always be present.
A long response (>16 bytes payload) must be divided into multiple packets. Similar to long commands,
the More data field (bit 7 of byte 3) is used to indicate whether additional packets are available for the
same response. On responses that span more than one packet, the More data bit on the final packet
will be set to 0 to indicate that this is the last packet in the sequence. The SDEP receiver must reassemble all sub-packets in into one payload when necessary.
If more precise command/response correlation is required a custom protocol should be developed,
where a unique message identifier is included in the payload of each command/response, but this is
beyond the scope of this high-level protocol definition.
A sample response message would be:
20 34 12 01 FF
0: Message Type (U8)
0x20
1+2: Command ID (U16) 0x34 0x12
3: Payload Len (U8)
0x01
4: Payload
0xFF
The first byte is the Message Type (0x20), which identifies this as a response message.
The second and third bytes are 0x1234, which is the unique command ID that this response is
related to.
The fourth byte indicates that we have a message payload of 1 byte.
The fifth byte is the 1 byte payload: 0xFF
Alert Messages
Alert messages (Message Type = 0x40) are sent whenever an alert condition is present on the system
(low battery, etc.), and have the following structure:
Name
Type Meaning
Message Type U8
Alert ID
Always '0x40'
U16 Unique ID for the Alert Condition
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 156 of 173
Payload Length U8
Payload Length (0..16)
Payload
Optional response payload
...
A sample alert message would be:
40 CD AB 04 42 07 00 10
0: Message Type (U8) 0x40
1+2: Alert ID (U16)
0xCD 0xAB
3: Payload Length
0x04
4+5+6+7: Payload
0x42 0x07 0x00 0x10
The first byte is the Message Type (0x40), which identifies this as an alert message.
The second and third bytes are 0xABCD, which is the unique alert ID.
The fourth byte indicates that we have a message payload of 4 bytes.
The last four bytes are the actual payload: 0x10000742 in this case, assuming we were
transmitting a 32-bit value in little-endian format.
Standard Alert IDs
Alert IDs in the range of 0x0000 to 0x00FF are reserved for standard SDEP alerts, and may not be
used by custom alerts.
The following alerts have been defined as a standard part of the protocol:
ID
Alert
Description
0x0000 Reserved
Reserved for future use
0x0001 System Reset The system is about to reset
0x0002 Battery Low
The battery level is low
0x0003 Battery Critical The battery level is critically low
Error Messages
Error messages (Message Type = 0x80) are returned whenever an error condition is present on the
system, and have the following structure:
Name
Type Meaning
Message Type U8
Always '0x80'
Error ID
U16 Unique ID for the error condition
Reserved
U8
Reserved for future use
Whenever an error condition is present and the system needs to be alerted (such as a failed request,
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 157 of 173
an attempt to access a non-existing resource, etc.) the system can return a specific error message
with an appropriate Error ID.
A sample error message would be:
80 01 00 00
0: Message ID (U8) 0x80
1+2: Error ID (U16) 0x01 0x00
3: Reserved (U8)
0x00
Standard Error IDs
Error IDs in the range of 0x0000 to 0x00FF are reserved for standard SDEP errors, and may not be
used by custom errors.
The following errors have been defined as a standard part of the protocol:
ID
Error
0x0000 Reserved
Description
Reserved for future use
0x0001 Invalid CMD ID CMD ID wasn't found in the lookup table
0x0003 Invalid Payload The message payload was invalid
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 158 of 173
GATT Service Details
Data in Bluetooth Low Energy is organized around units called 'GATT Services (http://adafru.it/iCp)'
and 'GATT Characteristics'. To expose data to another device, you must instantiate at least one
service on your device.
Adafruit's Bluefruit LE Pro modules support some 'standard' services, described below (more may be
added in the future).
UART Service
The UART Service is the standard means of sending and receiving data between connected devices,
and simulates a familiar two-line UART interface (one line to transmit data, another to receive it).
The service is described in detail on the dedicated UART Service (http://adafru.it/iCn) page.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 159 of 173
UART Service
Base UUID: 6E400001-B5A3-F393- E0A9- E50E24DCCA9E
This service simulates a basic UART connection over two lines, TXD and RXD.
It is based on a proprietary UART service specification by Nordic Semiconductors. Data sent to and
from this service can be viewed using the nRFUART apps from Nordic Semiconductors for Android
and iOS.
This service is available on every Bluefruit LE module and is automatically started during the
power-up sequence.
Characteristics
Nordic’s UART Service includes the following characteristics:
Name Mandatory UUID Type R W N I
TX
Yes
0x0002 U8[20] X
RX Yes
0x0003 U8[20] X X
R = Read; W = Write; N = Notify; I = Indicate
Characteristic names are assigned from the point of view of the Central device
TX (0x0002)
This characteristic is used to send data back to the sensor node, and can be written to by the
connected Central device (the mobile phone, tablet, etc.).
RX (0x0003)
This characteristic is used to send data out to the connected Central device. Notify can be enabled by
the connected device so that an alert is raised every time the TX channel is updated.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 160 of 173
Software Resources
To help you get your Bluefruit LE module talking to other Central devices, we've put together a
number of open source tools for most of the major platforms supporting Bluetooth Low Energy.
Bluefruit LE Client Apps and Libraries
Adafruit has put together the following mobile or desktop apps and libraries to make it as easy as
possible to get your Bluefruit LE module talking to your mobile device or laptop, with full source
available where possible:
Bluefruit LE
Connect (http://adafru.it/f4G) (Android/Java)
Bluetooth Low Energy support was added to Android starting with Android 4.3 (though it was only
really stable starting with 4.4), and we've already released Bluefruit LE Connect to the Play
Store (http://adafru.it/f4G).
The full source code (http://adafru.it/fY9) for Bluefruit LE Connect for Android is also available on
Github to help you get started with your own Android apps. You'll need a recent version of Android
Studio (http://adafru.it/fYa) to use this project.
Bluefruit LE
Connect (http://adafru.it/f4H) (iOS/Swift)
Apple was very early to adopt Bluetooth Low Energy, and we also have an iOS version of the Bluefruit
LE Connect (http://adafru.it/f4H) app available in Apple's app store.
The full Swift source code (http://adafru.it/ddv) for Bluefruit LE Connect for iOS is also available on
Github. You'll need XCode and access to Apple's developper program to use this project.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 161 of 173
Bluefruit Buddy (http://adafru.it/mCn) (OS X)
This native OS X application is a basic proof of concept app that allows you to connect to your Bluefruit
LE module using most recent macbooks or iMacs. You can get basic information about the modules
and use the UART service to send and receive data.
The full source for the application is available in the github repo at
Adafruit_BluefruitLE_OSX (http://adafru.it/mCo).
ABLE (http://adafru.it/ijB) (Cross
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 162 of 173
ABLE (http://adafru.it/ijB) (Cross
Platform/Node+Electron)
ABLE (http://adafru.it/ijB) (Adafruit Bluefruit LE Desktop) is a cross-platform desktop application based
on Sandeep Misty's noble library (http://adafru.it/ijC) and the Electron (http://adafru.it/ijD) project from
Github (used by Atom).
It runs on OS X, Windows 7+ and select flavours of Linux (Ubuntu tested locally). Windows 7 support
is particularly interesting since Windows 7 has no native support for Bluetooth Low Energy but the
noble library talks directly to supported Bluetooth 4.0 USB dongles (http://adafru.it/1327) to emulate
BLE on the system (though at this stage it's still in early BETA and drops the connection and takes
more care to work with).
This app allows you to collect sensor data or perform many of the same functionality offered by the
mobile Bluefruit LE Connect apps, but on the desktop.
The app is still in BETA, but full source (http://adafru.it/ijE) is available in addition to the easy to use
pre-compiled binaries (http://adafru.it/ijB).
Bluefruit LE Python
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 163 of 173
Bluefruit LE Python
Wrapper (http://adafru.it/fQF)
As a proof of concept, we've played around a bit with getting Python working with the native Bluetooth
APIs on OS X and the latest version of Bluez on certain Linux targets.
There are currently example sketches showing how to retreive BLE UART data as well as some basic
details from the Device Information Service (DIS).
This isn't an actively support project and was more of an experiment, but if you have a recent
Macbook or a Raspberry Pi and know Python, you might want to look at
Adafruit_Python_BluefruitLE (http://adafru.it/fQF) in our github account.
Debug Tools
If your sense of adventure gets the better of you, and your Bluefruit LE module goes off into the
weeds, the following tools might be useful to get it back from unknown lands.
These debug tools are provided purely as a convenience for advanced users for device recovery
purposes, and are not recommended unless you're OK with potentially bricking your board. Use
them at your own risk.
AdaLink (http://adafru.it/fPq) (Python)
This command line tool is a python-based wrapper for programming ARM MCUs using either a Segger
J-Link (http://adafru.it/fYU) or an STLink/V2 (http://adafru.it/ijF). You can use it to reflash your Bluefruit
LE module using the latest firmware from the Bluefruit LE firmware repo (http://adafru.it/edX).
Details on how to use the tool are available in the readme.md file on the main
Adafruit_Adalink (http://adafru.it/fPq) repo on Github.
Completely reprogramming a Bluefruit LE module with AdaLink would require four files, and would look
something like this (using a JLink):
adalink nrf51822 --programmer jlink --wipe
--program-hex "Adafruit_BluefruitLE_Firmware/softdevice/s110_nrf51_8.0.0_softdevice.hex"
--program-hex "Adafruit_BluefruitLE_Firmware/bootloader/bootloader_0002.hex"
--program-hex "Adafruit_BluefruitLE_Firmware/0.6.7/blefriend32/blefriend32_s110_xxac_0_6_7_150917_blefrien
d32.hex"
--program-hex "Adafruit_BluefruitLE_Firmware/0.6.7/blefriend32/blefriend32_s110_xxac_0_6_7_150917_blefrien
d32_signature.hex"
You can also use the AdaLink tool to get some basic information about your module, such as which
SoftDevice is currently programmed or the IC revision (16KB SRAM or 32KB SRAM) via the --info
command:
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 164 of 173
$ adalink nrf51822 -p jlink --info
Hardware ID : QFACA10 (32KB)
Segger ID : nRF51822_xxAC
SD Version : S110 8.0.0
Device Addr : **:**:**:**:**:**
Device ID : ****************
Adafruit nRF51822
Flasher (http://adafru.it/fVL) (Python)
Adafruit's nRF51822 Flasher is an internal Python tool we use in production to flash boards as they go
through the test procedures and off the assembly line, or just testing against different firmware
releases when debugging.
It relies on AdaLink or OpenOCD beneath the surface (see above), but you can use this command line
tool to flash your nRF51822 with a specific SoftDevice, Bootloader and Bluefruit firmware combination.
It currently supports using either a Segger J-Link or STLink/V2 via AdaLink, or GPIO on a Raspberry
Pi (http://adafru.it/fVL) if you don't have access to a traditional ARM SWD debugger. (A pre-built
version of OpenOCD for the RPi is included in the repo since building it from scratch takes a long time
on the original RPi.)
We don't provide active support for this tool since it's purely an internal project, but made it public just
in case it might help an adventurous customer debrick a board on their own.
$ python flash.py --jtag=jlink --board=blefriend32 --softdevice=8.0.0 --bootloader=2 --firmware=0.6.7
jtag
: jlink
softdevice : 8.0.0
bootloader : 2
board
: blefriend32
firmware : 0.6.7
Writing Softdevice + DFU bootloader + Application to flash memory
adalink -v nrf51822 --programmer jlink --wipe --program-hex "Adafruit_BluefruitLE_Firmware/softdevice/s110_nrf51
_8.0.0_softdevice.hex" --program-hex "Adafruit_BluefruitLE_Firmware/bootloader/bootloader_0002.hex" --programhex "Adafruit_BluefruitLE_Firmware/0.6.7/blefriend32/blefriend32_s110_xxac_0_6_7_150917_blefriend32.hex" --p
rogram-hex "Adafruit_BluefruitLE_Firmware/0.6.7/blefriend32/blefriend32_s110_xxac_0_6_7_150917_blefriend32
_signature.hex"
...
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 165 of 173
BLE FAQ
Can I talk to Classic Bluetooth devices with a Bluefruit LE modules?
No. Bluetooth Low Energy and 'Classic' Bluetooth are both part of the same Bluetooth Core
Specification -- defined and maintained by the Bluetooth SIG -- but they are completely different
protocols operating with different physical constraints and requirements. The two protocols can't talk
to each other directly.
Can my Bluefruit LE module connect to other Bluefruit LE peripherals
No, the Bluefruit LE firmware from Adafruit is currently peripheral only, and doesn't run in Central
mode, which would cause the module to behave similar to your mobile phone or BLE enabled laptop.
At some point we might consider a new firmware image offering this, but since 98% of the uses cases
for BLE involved running as a peripheral we've concentrated all of our development effort there for
now.
Why are none of my changes persisting when I reset with the sample sketches?
In order to ensure that the Bluefruit LE modules are in a known state for the Adafruit demo sketches,
most of them perform a factory reset at the start of the sketch.
This is useful to ensure that the sketch functions properly, but has the side effect of erasing any
custom user data in NVM and setting everything back to factory defaults every time your board comes
out of reset and the sketch runs.
To disable factory reset, open the demo sketch and find the FACTORYRESET_ENABLE flag and set
this to '0', which will prevent the factory reset from happening at startup.
If you don't see the 'FACTORYRESET_ENABLE' flag in your .ino sketch file, you probably have an
older version of the sketches and may need to update to the latest version via the Arduino library
manager.
Do I need CTS and RTS on my UART based Bluefruit LE Module?
Using CTS and RTS isn't strictly necessary when using HW serial, but they should both be used with
SW serial, or any time that a lot of data is being transmitted.
The reason behind the need for CTS and RTS is that the UART block on the nRF51822 isn't very
robust, and early versions of the chip had an extremely small FIFO meaning that the UART peripheral
was quickly overwhelmed.
Using CTS and RTS significantly improves the reliability of the UART connection since these two pins
tell the device on the other end when they need to wait while the existing buffered data is processed.
To enable CTS and RTS support, go into the BluefruitConfig.h file in your sketch folder and simply
assign an appropriate pin to the macros dedicated to those functions (they may be set to -1 if they
aren't currently being used).
Enabling both of these pins should solve any data reliability issues you are having with large
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 166 of 173
commands, or when transmitting a number of commands in a row.
How can I update to the latest Bluefruit LE Firmware?
The easiest way to keep your Bluefruit LE modules up to date is with our Bluefruit LE Connect app for
Android (http://adafru.it/f4G) or Bluefruit LE Connect for iOS (http://adafru.it/f4H). Both of these apps
include a firmware update feature that allows you to automatically download the latest firmware and
flash your Bluefruit LE device in as safe and painless a manner as possible. You can also roll back to
older versions of the Bluefruit LE firmware using these apps if you need to do some testing on a
previous version.
Which firmware version supports 'xxx'?
We regularly release Bluefruit LE firmware images (http://adafru.it/edX) with bug fixes and new
features. Each AT command in this learning guide lists the minimum firmware version required to use
that command, but for a higher level overview of the changes from one firmware version to the next,
consult the firmware history page (http://adafru.it/iCw).
Does my Bluefruit LE device support ANCS?
ANCS is on the roadmap for us (most likely in the 0.7.x release family), but we don't currently support
it since there are some unusual edge cases when implementing it as a service.
My Bluefruit LE device is stuck in DFU mode ... what can I do?
If your device is stuck in DFU mode for some reason and the firmware was corrupted, you have
several options.
First, try a factory reset by holding down the DFU button for about 10 seconds until the CONN LED
starts flashing, then release the DFU button to perform a factory reset.
If this doesn't work, you may need to reflash your firmware starting from DFU mode, which can be
done in one of the following ways:
Bluefruit LE Connect (Android)
Place the module in DFU mode (constant LED blinky)
Open Bluefruit LE Connect
Connect to the 'DfuTarg' device
Once connected, you will see a screen with some basic device information. Click the '...' in the
top-right corner and select Firmware Updates
Click the Use Custom Firmware button
Select the appropriate .hex and .init files (copied from the Bluefruit LE Firmware
repo (http://adafru.it/edX)) ... for the BLEFRIEND32 firmware version 0.6.7, this would be:
Hex File: blefriend32_s110_xxac_0_6_7_150917_blefriend32.hex
Init File: blefriend32_s110_xxac_0_6_7_150917_blefriend32_init.dat
Click Start Update
Unfortunately, the iOS app doesn't yet support custom firmware updates from DFU mode yet, but we
will get this into the next release.
Nordic nRF Toolbox
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 167 of 173
You can also use Nordic's nRF Toolbox application to update the firmware using the OTA bootloader.
On Android:
Open nRF Toolbox (using the latest version)
Click the DFU icon
Click the Select File button
Select Application from the radio button list, then click OK
Find the appropriate .hex file (ex. 'blefriend32_s110_xxac_0_6_7_150917_blefriend32.hex')
When asked about the 'Init packet', indicate Yes, and select the appropriate *_init.dat file (for
example: 'blefriend32_s110_xxac_0_6_7_150917_blefriend32_init.dat').
Click the Select Device button at the bottom of the main screen and find the DfuTarg device,
clicking on it
Click the Upload button, which should now be enabled on the home screen
This will begin the DFU update process which should cause the firmware to be updated or
restored on your Bluefruit LE module
On iOS:
Create a .zip file containing the .hex file and init.dat file that you will use for the firmware update.
For example:
Rename 'blefriend32_s110_xxac_0_6_7_150917_blefriend32.hex' to application.hex
Rename 'blefriend32_s110_xxac_0_6_7_150917_blefriend32_init.dat' to application.dat
Upload the .zip file containing the application.hex and application.dat files to your iPhone using
uTunes, as described here (http://adafru.it/iCx)
Open the nRF Toolbox app (using the latest version)
Click the DFU icon
Click the Select File text label
Switch to User Files to see the .zip file you uploaded above
Select the .zip file (ex. blefriend32_065.zip)
On the main screen select Select File Type
Select application
On the main screen select SELECT DEVICE
Select DfuTarg
Click the Upload button which should now be enabled
This will begin the DFU process and your Bluefruit LE module will reset when the update is
complete
If you get the normal 2 or 3 pulse blinky pattern, the update worked!
Adafruit_nRF51822_Flasher
As a last resort, if you have access to a Raspberry Pi, a Segger J-Link or a STLink/V2, you can also try
manually reflashing the entire device, as described in the FAQ above (http://adafru.it/iCy), with further
details on the Software Resources (http://adafru.it/iCz) page.
How do I reflash my Bluefruit LE module over SWD?
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 168 of 173
Reflashing Bluefruit LE modules over SWD (ex. switching to the sniffer firmware and back) is at your
own risk and can lead to a bricked device, and we can't offer any support for this operation!
You're on your own here, and there are unfortunately 1,000,000 things that can go wrong, which is
why we offer two separate Bluefruit LE Friend boards -- the sniffer and the normal Bluefruit LE Friend
board with the non-sniffer firmware, which provides a bootloader with fail safe features that prevents
you from ever bricking boards via OTA updates.
AdaLink (SWD/JTAG Debugger Wrapper)
Transitioning between the two board types (sniffer and Bluefruit LE module) is unfortunately not a riskfree operation, and requires external hardware, software and know-how to get right, which is why it
isn't covered by our support team.
That said ... if you're determined to go down that lonely road, and you have a Segger JLink (http://adafru.it/fYU) (which is what we use internally for production and development), or have
already erased your Bluefruit LE device, you should have a look at AdaLink (http://adafru.it/fPq), which
is the tool we use internally to flash the four files required to restore a Bluefruit LE module. (Note:
recent version of AdaLink also support the cheaper STLink/V2 (http://adafru.it/2548), though the J-Link
is generally more robust if you are going to purchase a debugger for long term use.)
The mandatory Intel Hex files are available in the Bluefruit LE Firmware repo (http://adafru.it/edX). You
will need to flash:
An appropriate bootloader image
An appropriate SoftDevice image
The Bluefruit LE firmware image
The matching signature file containing a CRC check so that the bootloader accepts the firmware
image above (located in the same folder as the firmware image)
The appropriate files are generally listed in the version control .xml file (http://adafru.it/fPr) in the
firmware repository.
If you are trying to flash the sniffer firmware (at your own risk!), you only need to flash a single .hex
file, which you can find here (http://adafru.it/fYV). The sniffer doesn't require a SoftDevice image, and
doesn't use the fail-safe bootloader -- which is why changing is a one way and risky operation if you
don't have a supported SWD debugger.
Adafruit_nF51822_Flasher
We also have an internal python tool available that sits one level higher than AdaLink (referenced
above), and makes it easier to flash specific versions of the official firmware to a Bluefruit LE module.
For details, see the Adafruit_nRF51822_Flasher (http://adafru.it/fVL) repo.
Can I access BETA firmware releases?
The latest versions of the Bluefruit LE Connect applications for iOS and Android allow you to optionally
update your Bluefruit LE modules with pre-release or BETA firmware.
This functionality is primarilly provided as a debug and testing mechanism for support issues in the
forum, and should only be used when trying to identify and resolve specific issues with your modules!
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 169 of 173
Enabling BETA Releases on iOS
Make sure you have at least version 1.7.1 of Bluefruit LE Connect
Go to the Settings page
Scroll to the bottom of the Settings page until you find Bluefruit LE
Click on the Bluefruit LE icon and enable the Show beta releases switch
You should be able to see any BETA releases available in the firmware repo now when you use
Bluefruit LE Connect
Enabling BETA Releases on Android
Make sure you have the latest version of Bluefruit LE Connect
Open the Bluefruit LE Connect application
Click the "..." icon in the top-right corner of the app's home screen
Select Settings
Scroll down to the Software Updates section and enable Show beta releases
You should be able to see any BETA releases available in the firmware repo now when you use
Bluefruit LE Connect
Why can't I see my Bluefruit LE device after upgrading to Android 6.0?
In Android 6.0 there were some important security changes (http://adafru.it/jcU) that affect Bluetooth
Low Energy devices. If location services are unavailable (meaning the GPS is turned off) you won't be
able to see Bluetooth Low Energy devices advertising either. See this issue (http://adafru.it/jcV) for
details.
Be sure to enable location services on your Android 6.0 device when using Bluefruit LE Connect or
other Bluetooth Low Energy applications with your Bluefruit LE modules.
What is the theoretical speed limit for BLE?
This depends on a variety of factors, and is determined by the capabilities of the central device (the
mobile phone, etc.) as much as the peripheral.
Taking the HW limits on the nR51822 into account (max 6 packets per connection interval, and a
minimum connection interval of 7.5ms) you end up with the following theoretical limits on various
mobile operating systems:
iPhone 5/6 + IOS 8.0/8.1
6 packets * 20 bytes * 1/0.030 s = 4 kB/s = 32 kbps
iPhone 5/6 + IOS 8.2/8.3
3 packets * 20 bytes * 1/0.030 s = 2 kB/s = 16 kbps
iPhone 5/6 + IOS 8.x with nRF8001
1 packet * 20 bytes * 1/0.030 s = 0.67 kB/s = 5.3 kbps
Nexus 4
4 packets * 20 bytes * 1/0.0075 s = 10.6 kB/s = 84 kbps
Nordic Master Emulator Firmware (MEFW) with nRF51822 0.9.0
1 packet * 20 bytes * 1/0.0075 = 2.67 kB/s = 21.33 kbps
Nordic Master Emulator Firmware (MEFW) with nRF51822 0.11.0
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 170 of 173
6 packets * 20 bytes * 1/0.0075 = 16 kB/s = 128 kbps
There are also some limits imposed by the Bluefruit LE firmware, but we are actively working to
significantly improve the throughput in the upcoming 0.7.0 release, which will be available Q1 2015.
The above figures are useful as a theoretical maximum to decide if BLE is appropriate for you project
or not.
Can my Bluefruit board detect other Bluefruit boards or Central devices?
No. All of our Bluefruit LE modules currently operate in peripheral mode, which means they can only
advertise their own existence via the advertising payload. The central device (usually your phone or
laptop) is responsible for listening for these advertising packets, starting the connection process, and
inititating any transactions between the devices. There is no way for a Bluefruit module to detect other
Bluefruit modules or central devices in range, they can only send their own advertising data out and
wait for a connection request to come in.
How can I determine the distance between my Bluefruit module and my phone in m/ft?
The short answer is: you can't.
RF devices normally measure signal strength using RSSI, which stands for Received Signal Strength
Indicator, which is measured in dBm. The closer the devices are the strong the RSSI value generally
is (-90dBm is much weaker than -60dBm, for example), but there is no reliable relationship between
RSSI values in dBm and distance in the real world. If there is a wall between devices, RSSI will fall. If
there is a lot of interference on the same 2.4GHz band, RSSI will fall. Depending on the device, if you
simply change the antenna orientation, RSSI will fall. You can read the RSSI value between two
connected devices with the AT+BLEGETRSSI command, but there are no meaningful and repeatable
conclusions that can be drawn from this value about distance other than perhaps 'farther' or 'closer' in
a very loose sense of the terms.
How far away from my phone can I have my Bluefruit LE module?
This depends on a number of factors beyond the module itself such as antenna orientation, the
antenna design on the phone, transmit power on the sending node, competing traffic in the same
2.4GHz bandwidth, obstacles between end points, etc.
It could be as low as a couple meters up to about 10 meters line of sight, but generally Bluetooth Low
Energy is designed for very short range and will work best in the 5-6 meter or less range for reliable
communication, assuming normal Bluefruit firmware settings.
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 171 of 173
DFU Bluefruit Updates
You can reprogram the Bluefruit LE module itself over-the-air using an Android or iOS phone/tablet.
This doesn't reprogram the ATmega32u4 in the Bluefruit Micro, only the BLE module itself. Since its
not a common thing to do, its a little challenging to do.
You will need to disconnect/unpower the Bluefruit Micro, connect a wire temporarily between the DFU
pin and GND and then power up the board via USB or battery.
The red LED will blink continuously, letting you know it's in DFU mode. Then follow our guide for field
updating the firmware (http://adafru.it/iCQ)
© Adafruit Industries
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le
Page 172 of 173
Downloads
Feather 32u4 Bluefruit LE Pinout Diagram
http://adafru.it/lMe
Schematic
Click to embiggen
We've changed the regulator from an SPX3819 to AP2112 - it has lower dropout but cannot handle
higher than 6V
Fabrication Print
Dimensions in inches
© Adafruit Industries
Last Updated: 2016-04-29 03:27:21 PM EDT
Page 173 of 173
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF

advertising