Enviar y recibir datos con módulo Bluetooth para Arduino

Hoy voy a hacer una simple explicación sobre cómo utilizar el módulo bluetooth JY-MCU BT Board V1.04 para transmitir y recibir datos con Arduino.

Módulo puerto serie Arduino Bluetooth JY-MCU

DSC_0180

Este módulo se comunica con la placa arduino utilizando una comunicación serie, para conectarla vamos a utilizar la librería “SoftwareSerial.h” que viene incluida en el IDE de Arduino. Con esta librería podremos usar los pines 2 y 3 como RX y TX.

También necesitaremos un LED y un potenciómetro. Las conexiones son muy sencillas:

  • Módulo VCC → VCC Arduino
  • Módulo GND → GND Arduino
  • Módulo RX → PIN 3 Arduino
  • Módulo TX → PIN 2 Arduino (En caso de usar Arduino Mega o Leonardo conectar a pin 10 y editar la linea correspondiente en el programa)

El Led lo conectamos al PIN 13 y el potenciómetro al PIN ANALOG 0

ENVIAR DATOS DESDE ARDUINO Y RECIBIRLOS EN EL PC:

Vamos a enviar un valor de 0 a 1023 que obtendremos girando el potenciómetro conectado a la placa Arduino, los valores se enviaran cada segundo. Para ello utilizaremos el siguiente código:

//Enviar datos con modulo Bluetooth para Arduino http://zygzax.com/
#include <SoftwareSerial.h>
SoftwareSerial blue(2, 3);
int pot=0;
void setup(){
  blue.begin(9600);
  blue.println("Conectado");
}
void loop(){
 pot=analogRead(0);
  blue.println(pot);
  delay(1000);
}

Para conectarnos con el módulo bluetooth desde el ordenador tendremos que añadirlo como si se tratase de un teléfono móvil o cualquier otro dispositivo bluetooth normal y corriente, utilizando la clave de emparejamiento 1234.

En el programa de desarrollo de Arduino seleccionaremos el puerto serie que corresponde a la comunicación bluetooth con este módulo, en mi caso (Sistema operativo Mac) el puerto es: “/dev/tty.HC-07-DevB”.

El último paso para leer la información que está transmitiendo nuestra placa Arduino es abrir el monitor serie del programa de desarrollo de Arduino y seleccionar “9600 baud” y ya deberíamos ver la información.

ENVIAR DATOS DESDE EL PC A ARDUINO

Ahora vamos a enviar un “1” para encender el LED conectado a la placa Arduino y un “0” para apagarlo. Si enviamos una cadena de caracteres el programa leerá cada uno de ellos por orden (001101 –> Apagado-Apagado-Encendido-Encendido-Apagado-Encendido).

El código es el siguiente:

//Recibir datos con modulo Bluetooth para Arduino http://zygzax.com/
#include <SoftwareSerial.h>
char rec;
SoftwareSerial blue(2,3);
void setup(){
  pinMode(13,OUTPUT);
  blue.begin(9600);
  blue.println("Conectado");
}
void loop() {
  if(blue.available()){
    rec=blue.read();
    switch(rec){
      case '0':
        digitalWrite(13,LOW);
        delay(500);
        blue.println("Led off");
        break;
      case '1':
        digitalWrite(13,HIGH);
        delay(500);
        blue.println("Led on");
        break;
      default:
        delay(500);
        blue.print(rec);
        blue.println(" no es una orden valida. Introduzca 0 o 1");
    }
  }
}

El método para conectarnos a través de bluetooth con nuestra placa arduino es exactamente igual al seguido para leer la información pero en este caso no recibiremos ningún mensaje sino que escribiremos un 1 y se lo enviaremos, veremos que nos devuelve un mensaje confirmando que se ha recibido la orden y que se ha encendido el led. Para apagarlo enviaremos un 0.

32 pensamientos en “Enviar y recibir datos con módulo Bluetooth para Arduino

    1. JavierSB Autor

      Hola, siento el inconveniente.
      Los códigos los alojamos en Pastebin y en ocasiones el servicio se satura o se cae por problemas ajenos a nosotros. Tenemos pendiente cambiar el método para almacenar y mostrar los códigos.
      Intenta acceder a través del enlace: http://pastebin.com/Tux4sgGg

  1. Javier

    Hola soy novato en este mundo de arduino, aunque me ha enamorado y estoy leyendo mucho y aprendiendo.

    Bueno entrando en mi proyecto es el siguiente: necesito comunicar dos arduino a través de bluetooth para transmitir datos de un comunicador conectado a una máquina por rs232 hacia un ordenador también conectado al puerto serie (rs232).

    Ya he conseguido conectar un modulo bluetooth hc-06 en modo esclavo con éxito pero conectándolo con un móvil, aún no he probado conectar modulo con modulo porque estoy esperando que me llega un modulo bluetooth hc-05 para configurarlo como maestro ya que el hc-06 no puede hacerlo.

    Una vez que consiga comunicarlo entre ello no sé como conectarle el comunicador y el rs232 del ordenador, he pensado conectarlo a tx y rx pero no se si conectarlo directamente o a través de un max232 para evitar conflicto de tensiones. La verdad es que estoy un poco perdido y por eso estoy escribiendo aquí para que me puedas orientar.

    Muchas gracias y si necesitas mas detalles con gusto lo doy.

  2. michelle

    Hola disculpa es posible controlar el arduino mediante labview utilizando un hc05?, no lo he conseguido

  3. juan fernando cadena

    hola, excelente pagina pero tengo un pregunta puedo conectar un arduino mega y un lego NXT por bluetooth solo necesito mandar un mensaje al NXT asi se solo un numero te agradecería mucho si me puedes ayudar

    gracias

  4. juan

    hola excelente aplicación, quisiera saber si el arduino recibiría la información que sale de una impresora térmica serial y mandarla mediante bluethoth a la pc agradecería tu comentario.

  5. Charly

    Hola. Ojalà puedas ayudarme. Estoy realizando un aplicacion para controlar arduino con un android. la app ya la hice, pero al momento de enviar los comandos desde el celular el arduino no los recibe. te muestro los codigos tanto de android. Te agradezco si me ayudas.

    ARDUINO LEONARDO

    char incomingByte;

    void setup() {
    pinMode(13, OUTPUT);
    Serial1.begin(9600);
    }

    void loop() {
    // see if there’s incoming serial data:
    if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial1.read();
    // if it’s an r, turn the LED on then off
    if (incomingByte == ‘r’) {
    digitalWrite(53, HIGH);
    delay(500);
    digitalWrite(53, LOW);
    }
    }
    delay(250);
    }

    ANDROID

    package com.example.bluetooth;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    import java.util.UUID;

    import android.R.string;
    import android.os.Build;
    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothServerSocket;
    import android.bluetooth.BluetoothSocket;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;

    //@SuppressLint(“NewApi”)
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
    public class MainActivity extends Activity {

    protected static final int DISCOVERY_REQUEST = 1;
    private BluetoothAdapter Bluetooth; // BluetoothAdapter gives information about bluetooth status
    public TextView StatusUpdate;
    public Button Search;
    public Button Disconnect;
    public Button Activate;
    public Button Connect;
    public Button Send;
    public String Address;
    protected String toastText;
    public static UUID MY_UUID = UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”);
    public static UUID UUID2;
    public BluetoothServerSocket Master;
    public BluetoothSocket Slave;
    public BluetoothDevice Arduino;
    private OutputStream outStream = null;
    private InputStream inStream = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SetupUI();

    }

    private void SetupUI() {
    // TODO Auto-generated method stub
    final TextView StatusUpdate = (TextView)findViewById(R.id.Result);

    Button Activate = (Button)findViewById(R.id.Activate);
    Button Search = (Button)findViewById(R.id.Search);
    Button Connect = (Button)findViewById(R.id.Connect);
    Button Send = (Button)findViewById(R.id.Send);
    Button Disconnect = (Button)findViewById(R.id.Disconnect);

    Bluetooth = BluetoothAdapter.getDefaultAdapter(); //Here we are knowing if the bluetooth is turned on or turned off
    if(Bluetooth.disable())
    {
    StatusUpdate.setText(“Bluetooth is off”);
    }

    Activate.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

    String Discoverable = BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE;
    startActivityForResult(new Intent(Discoverable),DISCOVERY_REQUEST);
    String Name = Bluetooth.getName();
    String Address = Bluetooth.getAddress();
    StatusUpdate.setText( Name + “n” + Address);
    }

    });

    Search.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    if (Bluetooth.startDiscovery())
    {
    toastText = “Scannig for devices”;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND));
    }
    }

    });

    Connect.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    try {
    EstablishConection();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    toastText = “It was not possible to establish the connection”;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    }
    }

    private void EstablishConection() throws IOException {
    // TODO Auto-generated method stub

    if(BluetoothAdapter.checkBluetoothAddress(Address))
    {
    Arduino = Bluetooth.getRemoteDevice(Address);

    // Get a BluetoothSocket to connect with the given BluetoothDevice
    try {
    UUID2 = Arduino.getUuids()[0].getUuid();
    Slave = Arduino.createRfcommSocketToServiceRecord(UUID2);
    //Master = Bluetooth.listenUsingInsecureRfcommWithServiceRecord(null, UUID2);
    Bluetooth.cancelDiscovery();

    Slave.connect();
    //Slave = Master.accept();
    toastText = “Connection done “;
    outStream = Slave.getOutputStream();
    inStream = Slave.getInputStream();
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    }
    catch (IOException connectException) {
    // Unable to connect; close the socket and get out
    try {
    toastText = “Connection failed “;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    Slave.close();
    } catch (IOException closeException) { }
    return;
    }
    }

    else
    {
    toastText = “Insert a correct device address”;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    }

    }
    });

    Send.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    String on = “r”;
    write(on);

    }

    private void write(String on) {
    // TODO Auto-generated method stub
    try {
    byte[] Send = on.getBytes();
    outStream.write(Send);
    toastText = “Message send”;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
    toastText = “It was not possible to send the message”;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    }
    }
    });

    Disconnect.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    if(Slave.isConnected())
    {
    try {
    Slave.close();
    outStream.close();
    inStream.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    Bluetooth.disable();
    unregisterReceiver(discoveryResult);
    StatusUpdate.setText(“Bluetooth is off”);
    }

    });

    }
    BroadcastReceiver discoveryResult = new BroadcastReceiver()
    {

    @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    String RemoteDeviceName = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
    BluetoothDevice remoteDevice;
    remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    toastText = “Discovered ” + RemoteDeviceName;
    Toast.makeText(MainActivity.this, toastText, Toast.LENGTH_SHORT).show();
    if(remoteDevice.getName().equals(“HC-05″))
    {
    Address = remoteDevice.getAddress();
    }

    }

    };

    protected void OnDestroy() {
    super.onDestroy();
    unregisterReceiver(discoveryResult);
    System.exit(0);
    }

    }

  6. SERGIO

    disculpen alguien me podría ayudar para resetear HC-05 RESULTA QUE LE EMPECE A MOVER Y PARA VERIFICAR EL CAMBIO DE VELOCIDAD LO BAJE HASTA 2400 Y DESDE ENTONCES YA NO PUEDO CAMBIAR VALORES SOLO ME RESPONDE CUANDO LE ENVIO EL COMANDO AT, DEMAS SOLO ME ENVIA ERROR (0) ESPERO SU RESPUESTA…………GRACIAS.

  7. Javier

    Gracias por este Bolg. Pregunta: Es posible ocn el HC-05 transmitir y recibir datos desde una misma applicación? Digamos qu epor ej. deseo leer un sensor ultrasónico cuando se active desde el programa arduino y tomar una decisión en un programa cirriendo en la PC par agrafizar los resultados.

  8. miguel

    holá, me gustaba hacerte una pregunta, sabes como puedo hacer lo mismo que tu codigo pero arduino + bluetooth + matlab?

    gracias….Miguel Sousa….

    1. javiersb Autor

      Hola, puedes ojear esta entrada: Cómo leer datos de Arduino con Matlab a través del puerto USB
      Ahí esta explicado como hacer una conexión para leer datos de Arduino con Matlab, tendrías que editar las líneas en las que se especifica el puerto serie que estas utilizando, en mi caso seria: /dev/tty.usbmodem621 (En Mac, en Windows los puertos serie tienen nombres del estilo COM4) por el puerto correspondiente a la conexión serie Bluetooth que sería por ejemplo en mi caso: /dev/tty.HC-07-DevB (Debes comprobar cual sería en tu caso, no tiene por qué coincidir con el mío).

      Aún no he probado a enlazar Matlab con Arduino por Bluetooth y no puedo asegurarte que esto funcione.

      Un saludo y gracias por tu visita.

  9. Javier

    Estimado muy buen blog, te escribo para saber si sabes si existe algun modo de transmitir un pulso analogo por bluetooth, por ejemplo el modulo bluetooth RN-52 posee dos entradas analogas…mi pregunta es si puedo conectar directamente mi señal analogica al bluetooth y transmitir el umbral, espero tu respuesta, gracias.

Los comentarios están cerrados.