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
via AliExpress
via eBay
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
Connect
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
Connect
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.
Commands
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
If you're using WS2811/WS2812 Strip
Copy and install the Arduino sketch. You can find the code here.
If you're using RGB LEDs without an IC
You can use this sample code instead.
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!
Future Improvements
* 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
* tape
* 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 :-)

Participated in the
Make It Glow Contest
40 Comments
9 years ago on Introduction
I wanted to leave a tip about pairing. If pairing is required in your application, send AT+TYPE3 to your HM-10. Default pin code is 000000. Change that by using AT+PINxxxxxx, where xxxxxx is a number between 000000 and 999999.
NOTE1: AT+TYPE3 was added in firmware v524. (Check firmware version by AT+VERS?)
NOTE2: Use AT+TYPE0 to go back to default where no pairing required.
Reply 6 years ago
When I try to use AT+TYPE3, I can't control RGB Lights. After entering a PIN code, status become Connected, but there's missing "Yes, serial! :)" message.
Firmware is v540.
Does anyone have any idea?
Reply 8 years ago on Introduction
Notice that it is actually AT+PASSxxxxxx instead of AT+PINxxxxxx
Question 4 years ago
can we use HC05 instead of BLE? will HC05 work with same code?
Question 5 years ago
Hi,
I tried to do this project . I used CC41A module.
(www.ebay.com/itm/1X-HM-10-Bluetooth-4-0-BLE-CC2540-CC2541-Serial-Wireless-CC41-A-Arduino-Android/162740962369?hash=item25e41e0441:g:RsAAAOSwO7haAR3W)
When I try to pair Phone and CC41A , can’t do it. An error was occurred as “couldn’t pair with CC41A because of an incorrect PIN or passkey”.
Please Help me.
8 years ago on Step 1
I need help!!
When I typed AT at 9600 baud.. I got this message as a reply. Help.
Goodnight moon! ÿ
Reply 6 years ago
I have the same problem! Did you ever figure out what was wrong?
6 years ago
Check out this android app:
https://play.google.com/store/apps/details?id=com.optimist.bleCentral&hl=en
6 years ago
Blue light.apk do not work .pl attached correct file . do not scan any
Bluetooth device how to control without app pl help me as soon as
possible.
6 years ago
Is there a way to control HM 10 module to operate in advertising mode only after pressing the switch/button so that power consumption is less. On pressing the switch, the device will operate in advertising mode and will again move to connectable mode. When the device is in adevrtising mode, it will be visible to master devices (mobile application) and on triggering the connect from the mobile device, blutetooth connection will get established. On subsequent reboots, device will be in connectable mode unless switch is pressed. Since device is in connectable mode, mobile app can directly connect to the device by selecting the connect option for bluetooth device.
6 years ago
sir can you please send me a modification of this apk? instead of controlling rgb leds, can you send me one that can control 2 servo motors? thanks!
7 years ago
stvmac11
2 years ago
I wanted to leave a tip about
pairing. If pairing is required in your application, send AT+TYPE3 to
your HM-10. Default pin code is 000000. Change that by using
AT+PINxxxxxx, where xxxxxx is a number between 000000 and 999999.
NOTE1: AT+TYPE3 was added in firmware v524. (Check firmware version by AT+VERS?)
NOTE2: Use AT+TYPE0 to go back to default where no pairing required.
===================================
I SEARCH FOR THIS INFO ONE WEEK, MANY THANKS :)
FOR FIRST
TIME THE BLUETOOTH ASKING FOR PIN CODE BUT STILL MY TELEPHONE CAN'T
PAIRING WITH IT "UNABLE TO PAIR WITH XXXXX, MAKE SURE XXXXX IS READY TO
PAIR.
ANY SUGGEST PLEASSSE ?
7 years ago
Nice tutorial can you code for ios . i want to do that thing ios please help me
my mail id : gupta.sunkari@gmail.com
7 years ago
For anyone that might be interested. I just published free iOS and Android app, that lets you control Arduino with gamepad style interface. The app is compatible with the most popular HM-10 BLE to Serial module.
More info:
https://www.instructables.com/id/Controlling-Arduino-Robot-With-IOS-IPhone-IPad-or-/
7 years ago
Does it remember the last used settings after power off or disconnecting BT?
Many thanks :)
7 years ago
I have tried sending some value per 100 ms delay from arduino.
How come the the "data" field shows "no data" until you press on the slider? how can you just get the data from a button press?
I know it gets read with displayData(intent.getStringExtra(mBluetoothLeService.EXTRA_DATA)); but how can I invoke this and get a value?
Thanks
8 years ago on Introduction
I am facing a strange issue
where the App operation doesn't trigger the Bluetooth chip(the App control doesn't change the RGB values) , if I run the board from the 9V battery.
But it works fluidly from the FTDI cable from Laptop.
I have checked the terminal voltages for the BLE module, it is 3.45 V in both cases.
I am not even getting a clue of whats wrong please comment if you think there is any related problem if you can think of...
Thanks in Advance
8 years ago on Introduction
hello guys,
my project is communication between 2 point via wireless,
i wanna to work with this module (XM-10B BLE);but i dont know about this anything!! :(
i have a CC Debugger (Ti),
how i can program this module ?
is a sample of program?
8 years ago on Step 4
You mention that the UUID to pass through data is 0000ffe0-0000-1000-8000-00805f9b34fb, which mine is set to. How do I change this to 0000ffe1-0000-1000-8000-00805f9b34fb in order to send and receive data.
I've found your app is one of the only ones I can connect with, but would like to try using other SPP apps but none will connect and stay connected.
Thanks for the great tutorial!
8 years ago on Introduction
I'm really quite new to android and arduino development, but want to be able to modify the android app so that it serves for my own purposes. I have no idea how to do this at the moment and any help would be massively appreciated! I saw you based it off the google example, but I didn't understand any of that :(
Thanks very much for the great tutorial,
Hugh