Varios modelos de placas de serie, permiten la transmisión de datos con Bluetooth en Arduino. Sin embargo en muchos escenarios será necesario configurar un módulo Bluetooth externo.
Para este proyecto se usará un módulo Bluetooth nRF8001, pues sus características de bajo consumo y estar actualizado para emparejarse y transmitir datos a teléfonos inteligentes, nos permitirá adaptar el proyecto a una gran cantidad de escenarios reales.
La placa que se usará a continuación será una Arduino UNO que conectaremos al módulo nRF8001 y le serán enviado datos como si de un puerto serial se tratara.
Proyecto de transmisión Bluetooth en Arduino
Módulo nRF8001
La interfaz de usuario del módulo nRF8001 es UART, facilitando su uso al operar de forma similar a los antiguos Tx y Rx en serie.
El módulo ofrece varios pines de configuración que conectaremos a nuestra placa Arduino.
Los primeros 3 pines son SCK (reloj), MISO (Master In Slave Out) y MOSI (Master Out Slave In).
El nRF8001 se alimenta mediante 3,3 V, sin embargo los pines Vcc y de datos son tolerantes a 5 V, por lo que puedes utilizar cualquiera.
La conexión de los pines del módulo Bluetooth a la placa Arduino debe hacerse como se muestra en la siguiente figura que ilustra también el montaje físico para éste proyecto:

El Pin REQ envía una señal a nRF generada por el Arduino. RDY le envía una señal al Arduino desde nRF, indicando que debe enviar una solicitud de interrupción al Arduino, es decir, 2 o 3.
RST es el pin de reinicio y reinicia el nRF al inicio.
REQ se usa de manera similar a SS que puede haber encontrado en otras aplicaciones SPI. Adafruit tiene más detalles sobre su nRF8001 aquí.
Conectando el módulo nRF8001 a Arduino
A continuación los pasos a seguir para llevar a cabo el proyecto:
Intalación de las librerías en el Arduino
Será necesaria la instalación de la librería SPI desde el IDE de Arduino.
Luego también será necesario descargar e instalar la aplicación Android de nombre nRF UART 2.0. La encontrarás disponible en la Play Store de Android.

La aplicación permite la comunicación entre el teléfono móvil y la placa Arduino. Es decir, si escribe un mensaje desde el monitor serial de Arduino será recibido en la pantalla del móvil y si lo hace desde el móvil, recibirá el mensaje en el monitor serial.
Código a cargar en arduino
luego de realizado el monteja físico, carga este código al Arduino:
//an adaptation of the "echodemo" example in the library examples folder
#include <SPI.h>
#include "Adafruit_BLE_UART.h"
//On UNO & compatible: CLK = 13, MISO = 12, MOSI = 11
#define BLE_REQ 10
#define BLE_RDY 2 // This should be an interrupt pin, on Uno thats #2 or #3
#define BLE_RST 9
Adafruit_BLE_UART BTLE = Adafruit_BLE_UART(BLE_REQ, BLE_RDY, BLE_RST);
#include <LiquidCrystal_I2C.h>
#define BL_ON 1
#define BL_OFF 0
#define ADDRESS 0x38
LiquidCrystal_I2C lcd(ADDRESS, 16, 2); // set the LCD I2C address
byte blueLED = 3;
byte redLED = 5;
byte greenLED = 4;
aci_evt_opcode_t laststatus = ACI_EVT_DISCONNECTED;
void setup(void)
{
lcd.init(); // initialize the lcd
lcd.setBacklight(BL_ON);
lcd.setCursor(0,0); //col, row
lcd.print("Bluetooth tests ");
Serial.begin(9600);
Serial.println(F("Bluefruit LE nRF8001 UART demo"));
BTLE.setDeviceName("Arduino"); /* 7 characters max! */
BTLE.begin();
pinMode(blueLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
//pre test flash LEDs:
digitalWrite(redLED, HIGH);
delay(200);
digitalWrite(redLED, LOW);
delay(200);
digitalWrite(greenLED, HIGH);
delay(200);
digitalWrite(greenLED, LOW);
delay(200);
digitalWrite(blueLED, HIGH);
delay(200);
digitalWrite(blueLED, LOW);
delay(200);
}
void loop()
{
// Tell the nRF8001 to do whatever it should be working on.
BTLE.pollACI();
// Ask what is our current status
aci_evt_opcode_t status = BTLE.getState();
// If the status changed....
if (status != laststatus)
{
// print it out!
if (status == ACI_EVT_DEVICE_STARTED) {
Serial.println(F("Advertising started"));
}
if (status == ACI_EVT_CONNECTED)
{
Serial.println(F("Connected!"));
}
if (status == ACI_EVT_DISCONNECTED)
{
Serial.println(F("Disconnected or advertising timed out"));
}
// OK set the last status change to this one
laststatus = status;
}
if (status == ACI_EVT_CONNECTED)
{
// Lets see if there's any data for us!
if (BTLE.available())
{
Serial.println();
Serial.print(BTLE.available()); //gets number of bytes available
Serial.println(F(" bytes available from BTLE"));
}
// OK while we still have something to read, get a character and print it out
//lcd.clear();
lcd.setCursor(0,1); //col, row
while (BTLE.available())
{
char c = BTLE.read();
Serial.print(c);
lcd.write(c);
if(c == 'r')
{
digitalWrite(redLED, HIGH);
delay(800);
digitalWrite(redLED, LOW);
}
if(c == 'g')
{
digitalWrite(greenLED, HIGH);
delay(800);
digitalWrite(greenLED, LOW);
}
if(c == 'b')
{
digitalWrite(blueLED, HIGH);
delay(800);
digitalWrite(blueLED, LOW);
}
if(c == 'c')
{
lcd.setCursor(0,1); //col, row
lcd.print(" "); //clear 2nd line
}
}
// Now see if we have any data from Arduino keybd/Serial console
if (Serial.available())
{
// Read a line from Serial
Serial.setTimeout(100); // 100 millisecond timeout
String s = Serial.readString();
// We need to convert the line to bytes, no more than 20 at this time
byte sendbuffer[20];
s.getBytes(sendbuffer, 20);
char sendbuffersize = min(20, s.length());
Serial.print(F("\nSending -> \""));
Serial.print((char *)sendbuffer);
Serial.println("\"");
// write the data:
BTLE.write(sendbuffer, sendbuffersize);
}
}
}
Salida del código en el monitor serie
Una vez compilado cargado y corriendo el código anterior en Arduino, se mostrará el siguiente texto en pantalla:

Esperamos que este pequeño proyecto te sirva de ayuda para aprender a realizar transmisión de datos con Bluetooth en Arduino.