Introduction: Control RGB Lights From Android With Arduino & Bluetooth LE (BLE)
I've seen a lot of Kickstarter projects featuring the new Bluetooth 4.0 Low Energy standard and a number of Bluetooth LE (BLE) enabled Arduino clones coming to market, but many of these projects still seem to be somewhere in the production process and I couldn't find a lot of practical information about how to get BLE connected with Android.
This is my proof-of-concept attempt at working with Bluetooth LE, Android and Arduino. For my project I'm using an inexpensive module based upon TI's CC 2540 chip called the HM-10. It is only the second time I've tried to put together an Android app, so improvements and collaboration are very welcome!
You might be thinking "Bluetooth?!? But that's been around forever, what's the big deal?" The new standard attempts to address some of the short-comings of Bluetooth by simplifying the pairing process and reducing power drain, aiming to replace an array of proprietary radios and protocols with something more standardized. Popular applications have included fitness trackers (Fitbit, Nike+, etc) and in-store notification beacons (see Apple's iBeacon) but now BLE is starting to make its way into all kinds of consumer devices.
You can find all the necessary code here.
What you need
1 x Bluetooth LE / 4.0 module
HM-10 modules can be purchased for $6-7, including breakout board $10-15
Make your own breakout board
Red Bear Lab sells an Arduino shield and mini BLE module based upon the same TI CC2540 chip. They have some neat examples for iOS and Android. The Android program I've included should work with their shield with a few minor adjustments.
1 x Arduino (or similar) microcontroller
RGB LED Strip
This tutorial uses Adafruit Neopixel / WS2811 RGB LED strip, but you could adapt it for other types of strip, or even a regular RGB LEDs without an IC.
Android device with BLE support, running 4.4 KitKat or later
Support for Bluetooth 4 was added to Android as of version 4.3. So far as I can tell, at this point only a limited number of Android devices support BLE. Among them are the Nexus 4 and 5, Galaxy S4. I tested this with a LG Nexus 4 running Android 4.4.2, it may work with other devices and pre 4.4.2 versions of Android but I don't have any handy! (I would love to know if it indeed does)
Arduino photo CC-BY Creative Tools / Jota Cartas
Step 1: Assemble, Test, Configure Your Bluetooth LE Module
We're using the BT module to transparently send/receive data and shouldn't need to change much from the factory default settings. I do find it helpful to set a unique name and confirm that your module is working properly. To do this you'll need a FTDI cable or an Arduino board.
Important: The HM-10 runs at 3.3V, many Arduinos are 5V. If you connect your BLE module to something 5V without a logic level converter and voltage regulator you will likely damage it.
If you bought a HM-10 module that includes a breakout board, fantastic, you're set to go. If you need to build a breakout board head over to this tutorial. If you want to work out something on your own, you can find the pins arrangement on this datasheet.
Using a serial/FTDI cable
HM-10 TX - FTDI RX
HM-10 RX - FTDI TX
HM-10 GND - FTDI GND
HM-10 VCC - FTDI VCC
Then connect to the FTDI cable via the console or your favorite serial terminal. Some that work well:
Linux/Mac - CuteCom
Linux/Windows/Mac - CoolTerm
Windows - RealTerm
Settings: 9600, N, 8, 1;
If you're using an Arduino
Open the Arduino software, then upload Examples -> SoftwareSerial -> SoftwareSerialExample to your device
HM-10 TX - Arduino Pin 10 softRX
HM-10 RX - Arduino Pin 11 softTX
HM-10 GND - Arduino GND
HM-10 VCC - Arduino 3.3V
Open the serial monitor at 9600 baud.
The BLE module uses AT Commands to read and write system information, they do not need to be followed by a line break. If you don't get a response when you enter a command something may not be connected properly and you'll need to troubleshoot your module.
When you're connected type:
AT - it should respond with OK
You can find your firmware version:
AT+VERS? - firmware version
And set your device's name:
AT+NAME? - get current name
AT+NAMEyourname - set the name (12 chars max)
A full set of AT commands in the datasheet
If everything appears to be working it's time to move on to installation of the Android and Arduino apps!
Step 2: Install the Arduino Sketch
Step 3: Connect Your Bluetooth Module and LEDs to Your Arduino
Connecting HM-10 to Arduino
Connect Bluetooth RX and TX pins to your microcontroller. In my case I'm not going to use the Arduino's USB so I'm utilizing the built-in serial port on digital pins 0 and 1. If you need USB functions of your microcontroller try using software serial.
HM-10 RX - Arduino TX (D1)
HM-10 TX - Arduino RX (D0)
Connecting RGB LED strip
For the WS2812 lights you only need 3 pins: Data to digital pin 6, 5V and GND. If you are using a different strip you might have 4 pins and will need to include relevant code for driving those lights.
If you're using RGB strip or LEDs without some kind of IC you can follow this Arduino example.
Connect power source to your Arduino
I'm using a USB Power pack, but you could use a wall wart or a USB connection to your computer.
Step 4: Install the Android Application
Install the app
The application is still at a 'proof of concept' stage, so it's not quite ready for the Play Store. If you want to download it you'll need to side-load it. I was hoping I could use App Inventor or PhoneGap to create a quick app with BLE support, but this functionality is so new it's not supported yet, so I tried my hand at the Android SDK!
First enable apps from Unknown Sources by checking:
Settings -> Security ->Unknown Sources
Download the APK either directly to your phone or copy it over USB and use a file browser to run the file.
What this app does and how to modify it
The app is extremely basic, after you connect to the BT module, it looks for a serial service and then takes values from 3 sliders and sends them as a string to the Arduino where they are translated into LED values. It's based on Android sample code.
Bluetooth LE uses something called the Generic Attribute Profile (GATT) model which defines Services and Characteristics, these are identified by a value called UUID. The HM-10 has a Service that allows you to pass-through data, I found the UUID to be 0000ffe0-0000-1000-8000-00805f9b34fb. The Characteristic that you use to send and receive data has a UUID of 0000ffe1-0000-1000-8000-00805f9b34fb
Please feel welcome to modify and improve the source. it's incredibly helpful to first install the Android SDK Bundle
The main files you work with live here
BluetoothLeService.java - Bluetooth LE functions
DeviceControlActivity.java - What happens when you connect to a device
DeviceScanActivity.java - Routines for scanning for BLE devices
SampleGattAttributes.java - Defines recognized Services and Characteristics
nRF Master Control Panel was very useful for sniffing Services and Characteristics and learning more about BLE devices
Step 5: Put It All Together
1. Plug in your Arduino.
2. Open the Blue Light Android app. If everything is working correctly you should see your BLE module within range. Select it!
3. If the connection is successful, the second screen should show 'State: Connected' and if the serial Service is found 'Yes, serial :-)'
4. Adjust the sliders and your lights should change color
5. Hack, celebrate, modify, play and enjoy!
* More versatile Android app (Support for patterns, color picker, etc)
Future BLE Projects
* Replace Arduino with an ATTiny
* Utilize the GPIO pins on the HM-10
* iBeacon (supported as of newest HM-10 firmware)
* Attempt to flash HM-10 with open source Biscuit firmware from Red Bear Lab
Step 6: Make Something Beautiful
What you need
* a cardboard tube
* a power or USB extension cord
* a paper lantern
Place the Arduino and Bluetooth module inside the cardboard tube, cover the bottom with another piece of cardboard so they don't fall out. Wrap your LED strip around the outside of the tube and tape in place.
Attach the power or USB extension cord to your Arduino.
You can hang your lantern via a hook in the ceiling or run some monofilament (fishing line) across your room.
Place the cardboard tube inside your lantern, you can poke holes in the top and hang it by string or wire. Now, you have an Android & Bluetooth LE controlled RGB lamp :-)