Android + Processing + Bluetooth

A finales de 2009 los creadores de Processing anunciaron que iban a dar soporte a la plataforma de Android. La verdad es que fue una noticia muy buena, ya que el famoso entorno de creación de gráficos animados iba a poder ejecutar sketchs dentro de móviles que tuviesen a Android como sistema operativo. Pero no se han quedado ahí y además admite la posibilidad de usar las características embebidas en los dispositivos móviles como el GPS, la brújula electrónica, enviar y recibir sms, etc y por supuesto bluetooth.

Lo que explicaré en este artículo son los pasos que he seguido para crear una conexión desde mi teléfono Android con un dispositivo bluetooth y poder enviarle información a la par que recibirla dibujando los resultados de una forma gráfica con Processing para Android.

Ya en su momento me dediqué a programar en symbian algo parecido:

Sin embargo finalmente lo deseché porque la plataforma de symbian tiene ya poco futuro y porque las APIS eran confusas, mal explicadas y no se puede acceder a todos los elementos de hardware con ellas.

Por otra parte no hay que compararlo con Amarino, ya que Amarino es una aplicación ya hecha para Android con una interfaz definida y está pensado para usarse con Arduino, sin embargo aquí vamos a programar nuestra propia aplicación con su propia interfaz para cualquier dispositivo que tenga un controlador bluetooth.

Dicho esto lo primero es necesario instalar todo el entorno de desarrollo, aquí viene bien explicado en castellano por lo que no considero necesario añadir más.

Antes de empezar, sería interesante que echarais un vistazo a dos páginas para entender mejor lo que viene a continuación. Por una parte la API de Android para bluetooth para comprender qué posibilidades nos ofrece. Por otra parte unos conceptos y un ejemplo de cómo usar Android y gestionar el hardware con Processing. A los que hayáis programado en Processing puede resultar extraño que además de poder usar las funciones básicas del entorno, se puedan incluir librerias y código de Java y la API Android. Esto es debido a que tanto Android como Processing tienen una fuerte vinculación con el lenguaje de programación Java y su unión ha creado una suerte de mescolanza que reúne lo mejor de ambos mundos.

El objetivo es que podamos crear una interfaz completa para que nos muestre los dispositivos bluetooth que hay alrededor, a continuación podamos elegir uno de ellos y finalmente conectarnos a este para enviar y recibir datos. En este caso en concreto voy a conectar mi móvil HTC Wildfire S con una placa Arduino a través de un módulo bluetooth. La placa Arduino enviará a mi móvil cada segundo un valor comprendido entre 0 y 39 y este lo mostrará en su pantalla. En el móvil habrá dibujado un botón que cuando se pulse enviará un 0 a la placa Arduino para encender o apagar el led del pin 13.

Este es el código fuente del sketch para la placa Arduino:

boolean estado;
 
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  randomSeed(analogRead(0));
  estado = false;
}
 
void loop()
{
    delay(1000);
    Serial.write(random(40));
    while(Serial.available() > 0)
    {
      Serial.read();
      estado = !estado;
      digitalWrite(13, estado);
    }
}

Ahora la parte de Android y Processing. A partir de aquí iré explicando los conceptos a medida que publico el código fuente para comentar los aspectos que considero que son más relevantes y finalmente pondré el código fuente integro.

Para poder programar el bluetooth de nuestro dispositivo basado en Android junto con Processing empezaremos por crear un sketch, daremos los permisos BLUETOOTH y BLUETOOTH_ADMIN en el menú Android/Sketch Permissions e importaremos las clases necesarias para que todo funcione:

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import java.util.ArrayList;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;

Hay algunas librerías que, como veremos más adelante, podemos prescindir de ellas dependiendo de lo que queremos hacer y lo bien o mal que nos funcione.

A continuación vamos a añadir los métodos típicos de un sketch de Processing: setup y draw:

void setup() {
  size(320,480);
  frameRate(25);
  f1 = createFont("Arial",20,true);
  f2 = createFont("Arial",15,true);
  stroke(255);
}
 
void draw() {
  switch(estado)
  {
    case 0:
      listaDispositivos("BUSCANDO DISPOSITIVOS", color(255, 0, 0));
      break;
    case 1:
      listaDispositivos("ELIJA DISPOSITIVO", color(0, 255, 0));
      break;
    case 2:
      conectaDispositivo();
      break;
    case 3:
      muestraDatos();
      break;
    case 4:
      muestraError();
      break;
  }
}

En el método setup forzamos a que la resolución de la pantalla sea de 320 píxeles de ancho x 480 píxeles de alto (HVGA), ya que es una configuración muy extendida dentro del mundo de los móviles. Establecemos que la frecuencia de refresco sea de 25 fps. Creamos dos tipos de fuentes con las que dibujar después los textos que queramos.

En el método draw vamos a simular varias ventanas dependiendo del estado en el que se encuentre nuestra aplicación en cada momento. Así nada más empezar se muestra la ventana de búsqueda de dispositivos, a continuación se ofrece al usuario que seleccione uno de los dispositivos mostrados:

Después se intenta conectar con el dispositivo elegido y finalmente si tiene éxito se muestra la ventana con los datos enviados por Arduino y con el botón que mencionaba antes:

Si algo falla se muestra el error en una ventana:

Un sketch de Proccesing para Arduino se trata como una Activity, por eso se puede inicializar todo en el evento OnStart cuando es llamado al arrancar la aplicación (OnCreate no es llamado).

void onStart()
{
  super.onStart();
  println("onStart");
  adaptador = BluetoothAdapter.getDefaultAdapter();
  if (adaptador != null)
  {
    if (!adaptador.isEnabled())
    {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
    else
    {
      empieza();
    }
  }
}

En el evento OnStart primero debemos llamar al método onStart de la clase padre para inicializar correctamente. Después recuperamos el adaptador bluetooth del móvil y comprobamos si está activo. Si está activo empezamos a mostrar la lista de dispositivos. Si no lo está, lanzamos una petición para activarlo. En esta petición Android nos mostrará un mensaje similar a este en el móvil para activar el bluetooth:

Pulsemos la opción que pulsemos, se llamará al evento onActivityResult:

void onActivityResult (int requestCode, int resultCode, Intent data)
{
  println("onActivityResult");
  if(resultCode == RESULT_OK)
  {
    println("RESULT_OK");
    empieza();
  }
  else
  {
    println("RESULT_CANCELED");
    estado = 4;
    error = "No se ha activado el bluetooth";
  }
}

Si hemos pulsado Si entonces empezaremos a mostrar la lista de dispositivos, si hemos pulsado No iremos directamente a la pantalla de error.

Cuando se abandona la aplicación se llama al evento onStop (onDestroy no es llamado)  y aquí se pueden liberar los recursos que hayamos utilizado antes de terminar definitivamente.

void onStop()
{
  println("onStop");
  /*
  if(registrado)
  {
    unregisterReceiver(receptor);
  }
  */
 
  if(socket != null)
  {
    try
    {
      socket.close();
    }
    catch(IOException ex)
    {
      println(ex);
    }
  }
  super.onStop();
}

En el evento OnStop vamos a hacer dos cosas, aunque una de ellas está comentada por una razón que explicaré más adelante. Lo que se ve es que se cierra un socket que no es otra cosa que la conexión que hayamos establecido con nuestro dispositivo para poder liberar los recursos asociados a este. Finalmente se llama al método onStop de la clase padre para cerrar correctamente la aplicación.

El método empieza sirve para rellenar la lista de dispositivos bluetooth que más tarde mostraremos al usuario.

void empieza()
{
    dispositivos = new ArrayList();
    /*
    registerReceiver(receptor, new IntentFilter(BluetoothDevice.ACTION_FOUND));
    registerReceiver(receptor, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
    registerReceiver(receptor, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
    registrado = true;
    adaptador.startDiscovery();
    */
    for (BluetoothDevice dispositivo : adaptador.getBondedDevices())
    {
        dispositivos.add(dispositivo);
    }
    estado = 1;
}

Inicializamos un array que rellenaremos de objetos BluetoothDevice. Aquí comento una problemática que me he encontrado: Puedes incluir los dispositivos que hay alrededor del móvil o bien incluir los que previamente se hayan emparejado. La parte que está comentada (y por tanto la del método onStop que desregistra el Receiver) se usa para lanzar un proceso de búsqueda de dispositivos bluetooth que estén cerca de nuestro móvil: se registra el empiece, cada dispositivo que se encuentre y el final de la búsqueda. Para manejar estos eventos se usa una clase del tipo BroadcastReceiver ya inicializada:

BroadcastReceiver receptor = new BroadcastReceiver()
{
    public void onReceive(Context context, Intent intent)
    {
        println("onReceive");
        String accion = intent.getAction();
 
        if (BluetoothDevice.ACTION_FOUND.equals(accion))
        {
            BluetoothDevice dispositivo = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            println(dispositivo.getName() + " " + dispositivo.getAddress());
            dispositivos.add(dispositivo);
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(accion))
        {
          estado = 0;
          println("Empieza búsqueda");
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(accion))
        {
          estado = 1;
          println("Termina búsqueda");
        }
    }
};

Cuando se empieza la búsqueda se encuentra en el estado 0 para mostrar la lista de dispositivos a medida que van apareciendo. Por cada dispositivo bluetooth que se encuentre se añade al array de dispositivos bluetooth, Cuando termina la búsqueda se pasa al estado 1 para que el usuario seleccione el dispositivo al que quiere conectarse.

El hacerlo de esta forma provoca que más adelante cuando se conecte al dispositivo bluetooth se tenga que mostrar una ventana preguntando por un código de emparejamiento para vincular el móvil con este.El problema es que esa ventana no se visualiza cuando están los gráficos mostrándose y el proceso de conexión dará finalmente un error. Por eso la otra alternativa que he encontrado es emparejar el dispositivo bluetooth a mano con el móvil y rellenar la lista de dispositivos con los que ya están vinculados en el móvil, así no pedirá el código de emparejamiento y se conectará con el dispositivo bluetooth directamente.

En varias ocasiones hay que capturar donde pulsa el dedo del usuario para saber qué acción quiere realizar. Esto se consigue con el evento mouseReleased:

void mouseReleased()
{
  switch(estado)
  {
    case 0:
      /*
      if(registrado)
      {
        adaptador.cancelDiscovery();
      }
      */
      break;
    case 1:
      compruebaEleccion();
      break;
    case 3:
      compruebaBoton();
      break;
  }
}

Depende del estado en el que encontremos hará una acción diferente. Cuando estamos en el estado 0 y si se usara la búsqueda de dispositivos bluetooth (pero no es así por los motivos que he comentado) al pulsar en la pantalla cancelaría la búsqueda y lanzaría un ACTION_DISCOVERY_FINISHED al BroadCastReceiver visto anteriormente. Si estamos en el estado 1 se buscaría qué dispositivo bluetooth de la lista ha pulsado el usuario para conectarse a el. Si estamos en el estado 3 se comprueba si se ha pulsado el botón que envía un byte al dispositivo bluetooth.

El método que comprueba que elección ha hecho el usuario en el estado 1 es compruebaEleccion:

void compruebaEleccion()
{
  int elegido = (mouseY - 50) / 55;
  if(elegido < dispositivos.size())
  {
    dispositivo = (BluetoothDevice) dispositivos.get(elegido);
    println(dispositivo.getName());
    estado = 2;
  }
}

Con una sencilla fórmula matemática se puede sacar el dispositivo bluetooth que el usuario ha elegido en base a en qué parte de la pantalla ha pulsado. Después se pasa al estado 2 (Conexión al dispositivo bluetooth).

La lista de dispostivos bluetooth se hace con el método listaDispositivos:

void listaDispositivos(String texto, color c)
{
  background(0);
  textFont(f1);
  fill(c);
  text(texto,0, 20);
  if(dispositivos != null)
  {
    for(int indice = 0; indice < dispositivos.size(); indice++)
    {
      BluetoothDevice dispositivo = (BluetoothDevice) dispositivos.get(indice);
      fill(255,255,0);
      int posicion = 50 + (indice * 55);
      if(dispositivo.getName() != null)
      {
        text(dispositivo.getName(),0, posicion);
      }
      fill(180,180,255);
      text(dispositivo.getAddress(),0, posicion + 20);
      fill(255);
      line(0, posicion + 30, 319, posicion + 30);
    }
  }
}

Se recorre el array de dispositivos bluetooth mostrando su nombre y su dirección MAC. Es usada tanto en el estado 0 (listado de dispositivos bluetooth a medida que van apareciendo en la búsqueda) como en el estado 1 (selección del dispositivo bluetooth al que conectarse).

La conexión con el dispositivo bluetooth se hace con el método conectaDispositivo:

void conectaDispositivo()
{
  try
  {
    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    /*
    Method m = dispositivo.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
    socket = (BluetoothSocket) m.invoke(dispositivo, 1);
    */
    socket.connect();
    ins = socket.getInputStream();
    ons = socket.getOutputStream();
    estado = 3;
  }
  catch(Exception ex)
  {
    estado = 4;
    error = ex.toString();
    println(error);
  }
}

Aquí ocurre un caso especial. Para conectar con el dispositivo bluetooth se debe crear un socket con el dispositivo y después hacer la conexión propiamente dicha con el método connect. Sin embargo dependiendo de con qué dispositivo se conecte puede dar problemas el método que se use para obtener ese socket. La versión normal es la que está en el metodo y se supone que es la estándar, pero a mi me dio problemas al conectar al blueooth de un PC y tuve que usar las dos líneas que aparecen comentadas . Sin embargo con el módulo bluetooth de Sure la línea que aparece actualmente ha funcionado sin problemas. Como estamos creando una conexión SPP (como si fuese un puerto serie virtual) a través del protocolo RFCOMM, debemos obtener el socket que conecta con el servicio 00001101-0000-1000-8000-00805F9B34FB, que es el identificador único de servicio para SPP en el estandar Bluetooth. El método connect es bloqueante por lo que dejará la aplicación paralizada hasta que se conecte realmente o surja un error. Google dice que se debe usar un thread para separar el hilo de ejecución principal con el de la conexión, pero creo que está solución es más sencilla. Una vez se ha conectado se pueden recuperar el stream de entrada y el de salida para recibir y enviar datos respectivamente con el dispositivo bluetooth. A continuación se pasa al estado 3 (Visualización de datos e interacción con el botón). Si hubiese algún error se pasaría al estado 4 mostrando qué lo ha provocado.

El método que muestra los datos enviados desde el dispositivo bluetooth es muestraDatos:

void muestraDatos()
{
  try
  {
    while(ins.available() > 0)
    {
      valor = (byte)ins.read();
    }
  }
  catch(Exception ex)
  {
    estado = 4;
    error = ex.toString();
    println(error);
  }
  background(0);
  fill(255);
  text(valor, width / 2, height / 2);
  stroke(255, 255, 0);
  fill(255, 0, 0);
  rect(120, 400, 80, 40);
  fill(255, 255, 0);
  text("Botón", 135, 425);
}

Simplemente comprueba si se ha recibido algún byte y lo muestra. También muestra el botón ficticio que puede pulsar el usuario.

El método que se ejecuta cuando el usuario pulsa el botón es compruebaBoton:

void compruebaBoton()
{
  if(mouseX > 120 && mouseX < 200 && mouseY > 400 && mouseY < 440)
  {
    try
    {
        ons.write(0);
    }
    catch(Exception ex)
    {
      estado = 4;
      error = ex.toString();
      println(error);
    }
  }
}

Si se comprueba que el usuario ha pulsado en el área del botón se envía un byte con valor 0 al dispositivo bluetooth, que actualmente lo que hace es encender o apagar el led de la placa Arduino. Si hubiese algún error se pasaría al estado 4 mostrando qué lo ha provocado.

Finalmente el método que muestra los errores es muestraError:

void muestraError()
{
  background(255, 0, 0);
  fill(255, 255, 0);
  textFont(f2);
  textAlign(CENTER);
  translate(width / 2, height / 2);
  rotate(3 * PI / 2);
  text(error, 0, 0);
}

Simplemente muestra el texto del error de forma apaisada para mostrar cadenas largas.

Dejo el código fuente entero:

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import java.util.ArrayList;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
 
private static final int REQUEST_ENABLE_BT = 3;
ArrayList dispositivos;
BluetoothAdapter adaptador;
BluetoothDevice dispositivo;
BluetoothSocket socket;
InputStream ins;
OutputStream ons;
boolean registrado = false;
PFont f1;
PFont f2;
int estado;
String error;
byte valor;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BroadcastReceiver receptor = new BroadcastReceiver()
{
    public void onReceive(Context context, Intent intent)
    {
        println("onReceive");
        String accion = intent.getAction();
 
        if (BluetoothDevice.ACTION_FOUND.equals(accion))
        {
            BluetoothDevice dispositivo = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            println(dispositivo.getName() + " " + dispositivo.getAddress());
            dispositivos.add(dispositivo);
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(accion))
        {
          estado = 0;
          println("Empieza búsqueda");
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(accion))
        {
          estado = 1;
          println("Termina búsqueda");
        }
 
    }
};
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  //size(320,480);
  frameRate(25);
  f1 = createFont("Arial",20,true);
  f2 = createFont("Arial",15,true);
  stroke(255);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void draw() {
  switch(estado)
  {
    case 0:
      listaDispositivos("BUSCANDO DISPOSITIVOS", color(255, 0, 0));
      break;
    case 1:
      listaDispositivos("ELIJA DISPOSITIVO", color(0, 255, 0));
      break;
    case 2:
      conectaDispositivo();
      break;
    case 3:
      muestraDatos();
      break;
    case 4:
      muestraError();
      break;
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void onStart()
{
  super.onStart();
  println("onStart");
  adaptador = BluetoothAdapter.getDefaultAdapter();
  if (adaptador != null)
  {
    if (!adaptador.isEnabled())
    {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
    else
    {
      empieza();
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void onStop()
{
  println("onStop");
  /*
  if(registrado)
  {
    unregisterReceiver(receptor);
  }
  */
 
  if(socket != null)
  {
    try
    {
      socket.close();
    }
    catch(IOException ex)
    {
      println(ex);
    }
  }
  super.onStop();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void onActivityResult (int requestCode, int resultCode, Intent data)
{
  println("onActivityResult");
  if(resultCode == RESULT_OK)
  {
    println("RESULT_OK");
    empieza();
  }
  else
  {
    println("RESULT_CANCELED");
    estado = 4;
    error = "No se ha activado el bluetooth";
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mouseReleased()
{
  switch(estado)
  {
    case 0:
      /*
      if(registrado)
      {
        adaptador.cancelDiscovery();
      }
      */
      break;
    case 1:
      compruebaEleccion();
      break;
    case 3:
      compruebaBoton();
      break;
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void empieza()
{
    dispositivos = new ArrayList();
    /*
    registerReceiver(receptor, new IntentFilter(BluetoothDevice.ACTION_FOUND));
    registerReceiver(receptor, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
    registerReceiver(receptor, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
    registrado = true;
    adaptador.startDiscovery();
    */
    for (BluetoothDevice dispositivo : adaptador.getBondedDevices())
    {
        dispositivos.add(dispositivo);
    }
    estado = 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void listaDispositivos(String texto, color c)
{
  background(0);
  textFont(f1);
  fill(c);
  text(texto,0, 20);
  if(dispositivos != null)
  {
    for(int indice = 0; indice < dispositivos.size(); indice++)
    {
      BluetoothDevice dispositivo = (BluetoothDevice) dispositivos.get(indice);
      fill(255,255,0);
      int posicion = 50 + (indice * 55);
      if(dispositivo.getName() != null)
      {
        text(dispositivo.getName(),0, posicion);
      }
      fill(180,180,255);
      text(dispositivo.getAddress(),0, posicion + 20);
      fill(255);
      line(0, posicion + 30, 319, posicion + 30);
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void compruebaEleccion()
{
  int elegido = (mouseY - 50) / 55;
  if(elegido < dispositivos.size())   
  {     
    dispositivo = (BluetoothDevice) dispositivos.get(elegido);     
    println(dispositivo.getName());     
    estado = 2;   
  } 
} 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void conectaDispositivo() 
{   
  try   
  {     
    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    /*     
      Method m = dispositivo.getClass().getMethod("createRfcommSocket", new Class[] { int.class });     
      socket = (BluetoothSocket) m.invoke(dispositivo, 1);             
    */     
    socket.connect();     
    ins = socket.getInputStream();     
    ons = socket.getOutputStream();     
    estado = 3;   
  }   
  catch(Exception ex)   
  {     
    estado = 4;     
    error = ex.toString();     
    println(error);   
  } 
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
void muestraDatos() 
{   
  try
  {     
    while(ins.available() > 0)
    {
      valor = (byte)ins.read();
    }
  }
  catch(Exception ex)
  {
    estado = 4;
    error = ex.toString();
    println(error);
  }
  background(0);
  fill(255);
  text(valor, width / 2, height / 2);
  stroke(255, 255, 0);
  fill(255, 0, 0);
  rect(120, 400, 80, 40);
  fill(255, 255, 0);
  text("Botón", 135, 425);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void compruebaBoton()
{
  if(mouseX > 120 && mouseX < 200 && mouseY > 400 && mouseY < 440)
  {
    try
    {
        ons.write(0);
    }
    catch(Exception ex)
    {
      estado = 4;
      error = ex.toString();
      println(error);
    }
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void muestraError()
{
  background(255, 0, 0);
  fill(255, 255, 0);
  textFont(f2);
  textAlign(CENTER);
  translate(width / 2, height / 2);
  rotate(3 * PI / 2);
  text(error, 0, 0);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Visitas :147696
You can leave a response, or trackback from your own site.

302 Responses to “Android + Processing + Bluetooth”

  1. Angel MA says:

    It is an amazing job, so I couldn’t wait to try it, unfortunately there was a problem when attempting to run the application that says that it suddenly stopped due to a process related to classes.processing.android\test.bluetooth_android. I hope you have bumped into this problem and could give a possible reason as well as a posible solution.
    Many thanks.

    • Oscar says:

      Hi

      I need more info about it. Normally a stack trace is showed in processing window when an error appears.

      • Angel MA says:

        Ohhh. it was configuration mistakes, I should have declared the permissions from the beginning, that was the problem, now i have sent some data to a PIC and viceversa. Thanks a lot and once more: AMAZING JOB!!!!!

  2. Pedro says:

    Está muy bien, te lo has currado!
    Yo te recomendaría hacer más uso de las facilidades que tiene Android como los ListView (http://developer.android.com/resources/tutorials/views/hello-listview.html) para pintar los dispositivos BT. Y para ahorrarte el trauma de calcular si un dedo a pulsado un botón podrías hacerlo añadiendo un Button. Además así valdría para cualquier pantalla ;)
    Donde ando un poco perdido es en la parte del arduino.
    I Like!

  3. David Asensio Cañas says:

    Hola, me parece muy interesante, pero no puedo compilar-lo, te importaría enviarme los archivos al correo creo que es por alguna tontería de código, Y así comparo :D gracias de antemano!

    • Oscar says:

      Hola

      En el código fuente completo que había publicado no se por qué se me cambiaron algunas líneas a una sola y posiblemente ese fuese el error que te estaba dando, lo he cambiado, por lo que prueba a copiar de nuevo el código fuente y compilalo a ver si ahora te funciona.

  4. David Asensio Cañas says:

    Muchisimas gracias ;), me es super util, estoy haciendo un robot humanoide con arduino y lo quiero controlar con un android, así que me sirve de mucho, Merci!

  5. David Asensio Cañas says:

    Ahora funciona perfecto :) muchisiimas gracias

  6. Alan says:

    Hola Oscar,
    Esto es genial!
    que es el módulo bluetooth? which bluetooth module is it?
    Gracias,
    Alan.

  7. Alex says:

    Hola,

    This looks amazing!

    Which versions of the Android SDKs and tools did you use? I am having trouble compiling the Processing code in Processing 1.5.1 with Android API 7 tools.

    Thanks
    Alex

  8. Oscar says:

    Hi

    The API 7 is the correct. What compile errors do you have?

    • Alex says:

      Oscar
      Ahora esta functionando, despues de un poco mas trabajo – un proyecto increible – muchas gracias!

      Alex

  9. Sophie says:

    Hello,

    I am very excited about your project. I would like to do something similar.
    Is it possible that you download the entire Eclipse project files up?

    Thank you,
    Sophie

  10. David Asensio Cañas says:

    Una pregunta, la conexión al modulo la haces directamente al 3.3v del arduino y directamente al tx/rx o le pones alguna resistencia diodo o algo?

  11. David Asensio Cañas says:

    103 ohms?

    • JM says:

      103 en smd significa 10000 ohmios, el último número es el número de ceros. Por otro lado 10^3 = 1000 que puede ser lo que haya querido poner el chino que ha hecho ese datasheet.

      http://webdelcire.com/wordpress/archives/135 Si lees la entrada verás que dice 1000 ohmios, ante la duda prueba con 10k ya que esa resistencia se encarga de limitar la corriente que pasa por los diodos de protección interna

  12. David Asensio Cañas says:

    Gracias :=)

  13. joe says:

    Hola, excelente trabajo!

    que cambios tendria que hacer para que la aplicación acepte conexiones por el método startActivityForResult(Intent, int) ? saludos!

  14. joe says:

    Gracias por tu respuesta tan rápida! correcto estoy leyendo esa parte, sin embargo como soy nuevo programando android estoy bien confundido, básicamente la necesidad que tengo de que el telefono se comporte como servidor es porque la comunicacion blue2 la estoy realizando desde del telefono a la pc (WIN7), y de esa manera la pc no me deja iniciar la comunicacion, dice no puede abrir puerto CON, lo mismo me pasa con los programas que son terminales blue, siempre la computadora tiene que iniciar la comunicación.

    • Oscar says:

      Bien. Tenga en cuenta que el artículo habla de conectarse a un módulo bluetooth que actua como servidor. Lo que no entiendo es por qué el PC no le deja actuar como servidor y que el móvil se conecte a este. ¿Con qué programa abre el puerto COM en el PC?

  15. joe says:

    De antemano muchas gracias por tu colaboración!

    estoy usando Teraterm, hyperterminal y el emulador de terminal que trae el software del arduino, como no poseo un modulo quiero probar primero enviando datos desde la pc, el celular se conecta y muestra la pantalla esperando recibir datos, igual el dongle bluetooth que tengo conectado a la pc titila en senial de que inicio conexión pero al abrir alguno de estos programas para enviar datos no abre el puerto COM12 que es el que tomo el celular al vincularse con la pc, esto mismo me pasa con los emuladores de terminal del celular solo me permite conectar si la comunicación la inicia la PC, colocando al celular en modo “discoverable”

    • Oscar says:

      Bien

      Vamos a hacer lo siguiente. Primero abra el programa hyperterminal y después conecte el móvil al pc.

      Si no funciona vaya al administrador de dispositivos, puertos COM y cambie el puerto COM12 por el puerto COM4 y repita el punto anterior.

      Si no funciona intente ejecutar el primer paso con distintas velocidades (9600, 19200, 57600, 115200)

  16. joe says:

    No funciona, veo que cuando la pc asepta la conexion para la toma como un si fuera un moden “dial up service”

  17. joe says:

    Actualizo, ya lo pude hacer funcionar conectando a una computadora con win XP. Parce que es un tema de seguridad en win7 que no deja que otros dispositivos inicien la comunicación..

  18. jesus says:

    Hola esta muy bueno lo que haz hecho, me gustaria saber en que cambiaria el codigo para el caso de que yo desee usar el celular como controlador , por ejemplo el mandar a encender el led desde el celular

    • Oscar says:

      Como puede ver en el vídeo Joe, el móvil es el que manda que se encienda el led o se apague. No hace falta cambiar ningún codigo.

  19. Joshua says:

    Thanks for this tutorial! The main problem I encountered was that I was not able to get my Android phone to receive or send values to the Bluetooth modem until I set the baud rate on the Arduino sketch to 115200.

    I am not sure if the issue I encountered is a result of my hardware or software, so here are the versions of my hardware and software. Hopefully this will help someone else!
    Arduino 0022
    Processing 2.0a4
    T-Mobile G1 running Cyanogenmod 6
    Bluetooth Mate Silver (http://www.sparkfun.com/products/10393)

  20. Electronicguy says:

    Hi, I love your post just one problem: It doesnt work well with my phone its hard to select a bluetooth device. I dont need to search for devices pair with them, etc. Can you please show me how to modify code to bare minimum and automatically set the adress of the bluetooth device to “00:11:11:XX:XX:XX”(and automatically connect). So far I cant compile because I cant compare bluetooth to a string.

    Thanks

  21. Luca says:

    Hi,
    before to start, i would say thank you for the great tutorial.
    Then, i have a question for you.
    I need to make a project for the University: i have to make an android application that use the accelerometer, saves datas in files and sends them via bluetooth!
    I developed the first part, now i will send the files via bluetooth!
    How can i integrate this code with mine?

    In attachment i leave you my code, i hope that you can help me…

    Again, thank you!
    …and everybody “Excuse me” for my bad English!

    See you soon!

    Luca.

    http://dl.dropbox.com/u/47779079/Acc.zip

  22. fray says:

    HOLA tu codigo me parece muy util
    pero por orto lado megustaria saber que se necesita para conectar una impresora (PB2 y PB3 Impresoras Portátiles de Recibos) la idea es mediante la aplicacion android poder imprimir una factura

  23. fray says:

    Si ya que se configuran atravéz de un puerto COM de salida

  24. Theelectronicguy says:

    You gotta fix that reply probrem :D . So lets say that I send a value of 100 to the arduino. First time it connects, the arduino receives the value 100(tested with an led). Then if I immediatelly go from 100 to 50(in steps of 5), I wait ten seconds and the the led starts to go from 100 to 50 in a split second. Now, I put a println(`DATA SENT`) just before the ons.write() and on the computer, I receive DATA SENT a few times per second. So my guess is that its a problem with ons.write(). Any idea?

    • Theelectronicguy says:

      Ok, I have found the solution, I had to put a 200 millisecond delay and write ons.flush(); after each write. Thank you Oscar for making this tutorial :D.

  25. Martin says:

    Hola, tu codigo esta muy bien planteado y la explicacion mas, pero tengo una duda: en processing como exporto la aplicacion para el android, espero que me puedas ayudar

  26. Martin says:

    jajaja ya vi, automaticamente crea la aplicacion dentro del dispositivo android, no?

  27. Martin says:

    Hola de nuevo, oye amigo de donde aprendiste a utilizar los recursos para manipular el bluetooth? Existe algun manual o libro donde venga las funciones del bluetooth?

  28. Oscar says:

    Pues la de processing es porque se está usando la API de Android para bluetooth y en este mismo artículo está el enlace donde está la documentación. En cuanto a Arduino no hay que explciar mucho ya que se trata de usar el puerto serie con un módulo bluetooth que puede ver como funciona en este artículo http://webdelcire.com/wordpress/archives/135

    • Martin says:

      OK, ya vi lo de android, para transferir datos del arduino hacia el modulo bluetooth, se utilizan las mismas instrucciones que la de comunicacion serial?

      • Oscar says:

        Realmente no hay instrucciones para comunicaciones serie, ya que se trata de enviar y recibir datos, incluso los comandos Hayes son datos que se envían y se reciben aunque en el caso concreto de este módulo bluetooth no se aplica.

  29. Oscarcv says:

    Hola, es genial, ya lo he probado.

    Tengo terminado un programa en VBasic para el PC, y estoy intentando hacerlo para la tablet.En este proceso me he topado con que no puedo introducir delay`s, Es por algún motivo en especial.
    un saludo.

  30. Greg says:

    Hello thank you for the incredible effort your post has been very informative and helpful… still working on getting the sketch to run on my phone. I am planning to use Android Processing to control several servos with my phones accelerometer via bluetooth through my computer as your sketch does. My question for you is in regards to the Ketai Library… I’ve just discovered that they have several bluetooth functions that might simplify your code. Are you familiar with Ketai? What do you think of the idea…

    I must say that I am in the learn by doing phase of programing as such examples are ‘king’ thank you!

    http://www.danielsauter.com/display.php?project_id=113

    Cheers,
    Greg

    • Greg says:

      Any ideas why the program would be force stopping whenever I run the sketch on my phone, Motorola Atrix? It runs in my emulator though it doesn’t recognize any devices… but whenever I load the sketch onto my phone is doesn’t open or run.

    • Oscar says:

      Hi Greg

      This post was published on August 13th, 2011, however the Ketai library with bluetooth support was released on Mar 10, 2012 ( http://code.google.com/p/ketai/downloads/detail?name=Ketai_v4.zip&can=2&q= ) So in that time I had not any libraries for bluetooth with Arduino and Processing, then I studied the Android API to explain everybody how to make it works.

      I think that a library like Ketai is good for developers who wants to abstract from low level code.

      Regards.

      • Greg says:

        Thanks for the reply… seems like the Bluetooth Ketai library is still experimental so don’t think I’ll use it yet… just thought I’d mention it for those online searching for ways to connect via Bluetooth and Processing to Arduino.

        Cheers,
        Greg

  31. Conor says:

    Where in the code do you print the incoming bluetooth packets to the middle of the screen? Also, is there a place where I can get all of the source code in the order it was written in? For me, the source code at the bottom of your post has a lot of the text removed (and placed above).

    • Conor says:

      Nevermind. I just discovered that when I translate the page from Spanish to English large chunks of the source code are removed. Hope this helps anyone else that uses the automatic translate option of Google Chrome’s browser.

      Cheers. Great Tutorial!

  32. [...] with Processing, but I had trouble with my app crashing.  I tried going through this tutorial: http://webdelcire.com/wordpress/archives/1045 on Processing, Android, and Arduino- but ran into similar phone freezing issues.   One issue I [...]

  33. gas says:

    Good morning, I have a question: it’s possible to connect at the same time to two bluetooth modules, driven by two microcontrollers, that send data to the same sketch on Android phone?
    Thank you

  34. gas says:

    Thank you Oscar for your reply. I have an Android version 2.3 and so I see that it’s possible to obtain a connection with other two bluetooth modules (drived by two pic24fxx). I want to ask if you can tell me if there are any source code (better in in Processing language…) to realize the control of this dual simultaneous communications.
    Thanks in advance

    • Oscar says:

      Sorry, but I don’t know if there is any code to do that. However the bluetooth code in Processing is the same for Android, so you can look for any Android code in Internet and then implements it in a Processing sketch like this article.

  35. [...] this article, basic information on how to build an android phone that can be connected to the Bluetooth device can be found.Read on to know more about [...]

  36. [...] my initial research, I found an example (Android + Processing + Bluetooth | C.I.r.E.) that uses the Android SDK calls in a Processing sketch to handle a Bluetooth connection to an [...]

  37. Julio César says:

    Hola Oscar

    Muy buena explicación de tu código y excelente applicación para empezar a conectar arduino con android via bluetooth, tengo un problema que copie todo el código que proporcionas a eclipse pero me salen varios errores, no se si de favor pudieras subir la carpeta de tu proyecto donde desarrollaste el código para eclipse, ya que en la carpeta que se desarrolla para eclipse para cualquier programa siempre se incluye carpetas como bin, gen, src, etc. gracias saludos.

    • Oscar says:

      El proyecto lo desarrollé en processing, no en eclipse, por eso no hay ningún proyecto para el entorno de desarrollo.

  38. Alex says:

    Hola Oscar

    Estoy programando una app en android mediante eclipse. Una parte de ella está centrada en encontrar los dispositivos bluetooth que tengo alrededor y conectarme uno por uno para enviar y recibir datos entre el dispositivo conectado y el mio propio. Me falta la parte de la conexión, he visto que has ido explicando el código, lo que es de gran ayuda, con lo cual si yo implemento en mi app esa parte de la conexión, o parte de ella, debería de funcionar a pesar de que lo desarrollaste en processing ¿no?.

    Muchas gracias de antemano.
    Un saludo.

    • Oscar says:

      Si, así es. El código es para Android por lo que da igual que esté en processing que en eclipse.

  39. gas says:

    Hi Oscar,
    I wish to connect a microcontroller with Android 2.3.4 via usb, using processing: can you suggest any example?
    Thank you

    • Oscar says:

      What kind of microcontroller? If the microcontoller doen’t support USB Host you can’t connect it directly to Android.

      • gas says:

        Microcontroller of family pic24fjxxx. In my case is pic24fj64gb002, that suppoprts usb.

        • Oscar says:

          In that case the microcontoller can act as usb Host. The next question is: can you enable a serial communication between your Android mobile and the pic24?

          • gas says:

            I’m not sure to understand your question. Now I only can communicate between pic and PC or Android and PC via usb…

  40. Oscar says:

    As you mentioned above, you want to communicate between pic and android directly, don’t you? So The first step is to program the microcontroller as a CDC Host, have you tried it succesfully that issue?

    • gas says:

      Yes, I do.

      • Oscar says:

        Ok, now when you connect you device to Android you should have a serial port. Make an .apk with the next source code for Processing:

        import processing.serial.*;

        void setup()
        {
        size(240, 320);
        PFont font = createFont(“Arial”, 16, true); // Arial, 16 point, anti-aliasing on
        textFont(font);
        fill(255);
        background(0);
        String vector[] = Serial.list();

        for(int index = 0; index < vector.length; index++)
        {
        text(vector[index], 5, 50 * index + 16);
        }

        }

        And tell me the results

  41. gas says:

    Hi Oscar,
    I try, but Processing compiler send me the message:”unexpected char:”\””. Did you know the meaning?

  42. gas says:

    Now I’d manually write the code and the compiler write: “No library found for processing.serial” in the first line. Where can I find this library?

  43. gas says:

    No, my board is a explorer 16 and I try to use the application “CE370 Explorer16 USB Bulk Out Demo without USB PICTail” of Microchip. It’s good for usb communication PCboard, but I’m not able to replace my phone with the Pc. In every case, I’ll examine your suggestions and I’ll tell you

  44. romelapj says:

    Estoy probando el programa con una galaxy tab 10.1-y me molesta bastante para la conexion y envia la informacion al arduino en el momento que toco el boton…cualquier sugerencia la tendre en cuenta gracias

    • Oscar says:

      No entiendo lo de “y me molesta bastante para la conexion”, ¿Qué te molesta?.

      En cuanto a que te envíe la información en el momento que tocas el botón, prueba a quitar la línea delay(1000)

  45. romelapj says:

    Lo que sucede es q estoy implementando el codigo en android(eclipse)
    y no entiendo el porque no me comunica…te agradeceria mucho si miraras el codigo, de ante mano te doy gracias y te felicito por el tutorial y si no puedes ayudarme entendere :D

  46. self says:

    hola:
    oye me aparece esto cuando le doy en run
    lost connection with device while launching. Try again

  47. Andreita says:

    :( no me muestra los aleatorios, se enciende el le pero no muestra los aleatorios

    • Oscar says:

      Prueba a hacerlo desde el bluetooth de un PC a ver si ocurre lo mismo. Tiene pinta de que el no está bien conectado el pin RX del módulo bluetooth al pin TX del microcontrolador.

  48. Usco says:

    Hola, es que intento hacer este mismo ejercicio, pero me resulta un error a la hora de dar play, ya que sigue sin reconocerme las librerias de bluetooth, no se ya que hacer, ya le di a todos los permisos de sketch en android y nada… me podrias ayudar, trabajo en Mac OS X. pero es casi lo mismo. ya tengo el sdk de andorid completo.

  49. mistery says:

    Hi,
    First off all I want to thank you for this code it is great, simple and working :)
    And second I have one question.
    I can connect to my bluetooth and recieve sendt data, I can even send data with ons.write(0x..) in hex but now i have to send byte, how can i convert sone variable that I have let say it is
    byte a;
    and send it thrue bluetooth
    I tried
    ons.write(a);
    and
    ons.write(hex(a));
    but it did not work.
    I think i tried to send
    int a;
    ons.write(a);
    and this did not work to.
    So if you can please explain me a little more how to send different types of variable.
    Thank you so much

    • Oscar says:

      If you use ons.write(a) (where a is byte) it will send only a byte, if you need to send other types you will have to convert them into array and then send. For example:

      long data;
      .
      .
      .
      ByteBuffer bb = ByteBuffer.allocate(8);
      byte vector[] = bb.putLong(data).array();
      ons.write(vector);

  50. mistery says:

    All working I had an error in other part of code.
    Thank you

  51. SimonC says:

    Hello Oscar!

    I’m really excited about your project! I need to read data emitted bluetooth loop with an Android device (samsung galaxy tab 2) inspired me and I would like your project to the reception party bluetooth.
    But as soon as I copy your code I get small defects:

    No library found for android.bluetooth
    No library found for android.bluetooth
    No library found for android.bluetooth
    No library found for android.content
    No library found for android.content
    No library found for android.content
    No library found for android.content
    Android SDK Tools Revision 21
    Installed at C:\Users\Simon\AppData\Local\Android\android-sdk
    Project Type: Application
    Project Target: Android 2.3.3
    API level: 10
    Library dependencies:
    No Libraries

    ——————
    API<=15: Adding annotations.jar to the classpath.
    Merging AndroidManifest files into one.
    Manifest merger disabled. Using project manifest only.
    No AIDL files to compile.
    No RenderScript files to compile.
    Generating resource IDs…
    Generating BuildConfig class.

    BUILD FAILED
    C:\Users\Simon\AppData\Local\Android\android-sdk\tools\ant\build.xml:705: The following error occurred while executing this line:
    C:\Users\Simon\AppData\Local\Android\android-sdk\tools\ant\build.xml:718: Compile failed; see the compiler error output for details.

    Total time: 3 seconds

    I tried to find information on the missing libraries and it is said that they are supposed to be downloaded with the SDK. (I download all MAJs SDK) I work with a processing configuration 2.0.b3 vista

    I need help, please!
    Thank you in advance

    • Oscar says:

      Did you give BLUETOOTH and BLUETOOTH_ADMIN permissions in Android/Sketch Permissions menu?

      • SimonC says:

        Yes, android/sketch permissions is okay. Now in Sketch/add file… I search the android API and bluetooth’s library are ok. But now, after this when I compile it’s fail again :s

        Thanks again

      • SimonC says:

        I followed bluetooth mode of your program, as well as other websites but when I want to just separate blutooth I have a compilation error.

        The all libraries (the header).

        BroadcastReceiver Receiver = new BroadcastReceiver ()
        {
        public void onReceive (Context context, Intent intent)
        {
        println (“onReceive”);
        String action = intent. GetAction ();

        if (BluetoothDevice. ACTION_FOUND. equals (action))
        {
        BluetoothDevice device = intent. GetParcelableExtra (BluetoothDevice. EXTRA_DEVICE);
        println (dispositivo. getName () + “” + device. getAddress ());
        devices. add (device);
        }
        else if (BluetoothAdapter. ACTION_DISCOVERY_STARTED. equals (action))
        {
        status = 0;
        println (“Lancer la recherche”);
        }
        else if (BluetoothAdapter. ACTION_DISCOVERY_FINISHED. equals (action))
        {
        status = 1;
        println (“Fin de la recherche”);
        }

        }
        };

        Thanks again

  52. Laura says:

    Me señala esta línea

    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    • GRACIEL says:

      Me sata error en este línea tu ayuda por favor.
      socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

  53. Laura says:

    De nuevo yo, incluyendo esta línea ya no saca el error. No estaba reconociendo el UUID.

    import java.util.UUID;

    Gracias de nuevo

  54. gonzalo says:

    Hola, alguien pordria decirme donde descargar todas las librerias??.

    import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import java.util.ArrayList; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method;

    Llevo toda la mañana buscando…

  55. Gonzalo says:

    Hola, instale SDK de Android y sigo sin poder hacer correr el programa, me salen los siguientes errores:
    No library found for android.bluetooth
    No library found for android.bluetooth
    No library found for android.bluetooth
    No library found for android.content
    No library found for android.content
    No library found for android.content
    No library found for android.content
    Libraries must be installed in a folder named ‘libraries’inside the ‘sketchbook’ folder.

    Utilizo processing 2.0b7

  56. gonzalo says:

    Ya consegui que encontrara las librerias. No tenia el processing en modo Android. Que bobada ¿verdad?. Los principios son duros!!.

  57. Parita says:

    Hey!
    I found your code really helpful in understanding the bluetooth library so thank you so much!
    Would just like to add that the line:
    socket=dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    gave me errors too and I used the commented lines instead like you said. But then I figured that the error was because we needed to import UUID package. I added this line:
    import java.util.UUID;
    and it worked just fine :)

    Thanks again :)

  58. Lisergio says:

    Estoy probando el sketch en el simulador y arranca, pero lo quiero instalar en un samsung galaxy con la version 2.2.1 Froyo….

    En el emulador si selecciono la version 2.2 NO funciona ….. si selecciono 2.3.3 Si ….

    me sale el siguiente error…

    Lost connection with device while installing. Try again

    debug:
    Failure [INSTALL_FAILED_OLDER_SDK]
    Shutting down any existing adb server..

    imagino que habra que cambiar el sdk usado para compilarlo,,,, pero donde se cambia….??

  59. Alicia says:

    Hola. Apenas estoy empezando a programar en Java y no entiendo muy bien la parte del código. ¿Cada uno va en una clase por separado o todo eso va en el main? Saludos

  60. Alicia says:

    Soy nueva en java. Leí en comentarios que puede sustituirse el Processing con botones, cómo se hace eso?

  61. prof.buchi says:

    Hello !
    Very nice job but I get an error during the processing compilation : “cannot find symbol” and the line : “socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));” is highlighted
    Can you help me ?
    Prof.buchi, Strasbourg (France)

  62. Lisergio says:

    Buenas otra vez….
    Después de hacer varias pruebas y actualizar mi samsung galaxy a la versión 2.3.3, ya funciona correctamente… Muchisimas gracias por el trabajo…

    Quiero enviar otro dato desde el arduino al teléfono, pero no lo consigo.
    quiero enviar en primer lugar un long, de millis y mostrarlo en el teléfono,( para mostrarlo después en el formato 00:00:000 ) pero no llega bien… he probado a enviar cada 100 milis un numero y al llegar a 255 empieza de cero otra vez…

    y luego me gustaría enviar algun texto también …

    alguna idea?? gracias

    • Oscar says:

      Un long son 4 bytes, tendrás que descomponerlo en arduino y enviarlos uno por uno , luego en processing los recuperas uno por uno y lo vuelves a componer.

      • Lisergio says:

        ok!

        gracias,, pruebo y te cuento… a ver si soy capaz de enviarlos separados en tres y volver a mostrarlos después…

        un saludo.

      • Lisergio says:

        Buenas otra vez….

        He descompuesto el tiempo, en todos los valore… Es decir ..
        MM:SS,DDD en 9 valores, y hago un serial.write de cada uno de ellos para enviarlos al telefono,
        Pero no se como unirlos para mostrarlos…

        Podrias orientarme? Gracias

        • Oscar says:

          No, envía los 4 bytes del millis:

          unsigned long valor = millis();
          Serial.write((valor & 0xFF000000) >> 24);
          Serial.write((valor & 0xFF0000) >> 16);
          Serial.write((valor & 0xFF00) >> 8);
          Serial.write(valor & 0xFF);

          Y luego ya en el sketch de Processing los vas recuperando:

          unsigned long valor = ins.read() << 24;
          valor |= ins.read() << 16;
          valor |= ins.read() << 8;
          valor |= ins.read();

          Así tienes en tu móvil la variable valor con el número que arduino te ha enviado. Ya sólo te falta formatear ese número en processing para mostrar HH:MM:SS,DDD

  63. Juanp-or says:

    una pregunta, podria conectar dos smartphones con este programa sin ninguna modificacion y mostrar en pantalla de cada uno el byte mandado en este caso para encender el led del arduino? o qué modificacion habria que hacer?

  64. Juanp-or says:

    Gracias le estoy echando un vistazo pero tengo ciertos problemas, ando con un proyecto entremanos, si no te importa, te podrias poner en contacto directamente a mi correo para poder explicarte lo que quiero hacer y asi pudieras asesorarme un poco? gracias.
    Mi correo eso juanpredroortegaruiz@gmail.com

    • JMN says:

      Sin animo de molestar, este tipo de comentarios están fuera de lugar en este blog.

      Si buscas asesoramiento gratuito, lo indicado es ir a un foro del tema, plantear la duda y allí encontrarás ayuda para que puedas hacer tu proyecto, tampoco esperes que nadie lo realice por tí (como más de un caso se suele ver). Esto es lo que hacemos todos cuando tenemos unda duda de estos temas, hay muchos sitios donde resolverlas, con buscar en google saldrán unos cuantos.

      Si buscas a alguien que te asesore de manera particular, a tu correo, lo indicado es pagar por ello, hay varios sitios para esto, ejemplo: http://www.infolancer.net/

      Una cosa es hacer un blog porque nos guste, y otra cosa muy distinta es estar recibiendo peticiones de gente para que hagamos sus proyectos o les ayudemos con ellos (cansados estamos de ello), como comprenderas el tiempo libre que tenemos preferimos aplicarlo a nuestros propios proyectos.

      Para ayudar y consultar dudas de manera gratuita están los foros.

      Un saludo.

      • juanp-or says:

        quizá no lo he explicado del mejor modo, mi intención no es es que los demás me hagan mi trabajo es simplemente resolver una duda sobre como declarar ciertas cosas en processing ya que soy bastante novato, nadie quiere perder su tiempo en cosas que resulten ser eso, una perdida de tiempo, pero tampoco veo correcto que esto de lugar a colgarme un sanBenito tan a la ligera, tendre que tener mas cuidado a la hora de explicarme en otras ocasiones. No sabia yo que crear una pequeña aplicación para guardar los archivos de mi pulsómetro de deporte fuera una app para dar lugar a un comentario de este tipo, el pedir ese “asesoramiento” por llamarlo así es porque quizá un mensaje de esas dimensiones intercederia en la dinamica principal del tema, pero deacuerdo, disculpad si os ha ofendido mi comentario.

        • JMN says:

          Mi intención no era colgarte nada ni decir que no quieras hacer tu trabajo, simplemente indicarte que para resolver dudas sobre proyectos personales, los comentarios de un blog no es el sitio adecuado, y dejar una dirección de correo para ello tampoco lo es.

          El sitio adecuado para estas cosas son los foros de internet, allí es donde se resuelven las dudas sobre los proyectos personales.

          Siento que te haya tocado este comentario, ya que mi intención ni mucho menos era molestar, pero para que te hagas una idea, podemos tener cientos de correos de gente preguntando dudas sobre sus proyectos personales, mandandonos cosas a nuestros correos personales, y esperando a que les respondamos o les hagamos algo, lamentablemente esa es la actitud general que tenemos por aquí.

          Solo volverte a indicar el uso de los foros para este tipo de peticiones, que era el fin de mi mensaje, y siento si en algún momento te ha molestado mi comentario.

          Saludos.

        • Oscar says:

          Juan

          Ten en cuenta que lo que está escrito en el artículo es lo que hay. Te puedo ayudar en cosas puntuales si se trata de algo del propio artículo y siempre en los comentarios (así otra gente lo puede ver también), pero cualquier otra ayuda que se salga del ámbito del artículo ya es tiempo del que desgraciadamente no dispongo. Como dice Jorge si es algo que te urge de programación en Processing puedes preguntarlo en los foros especializados http://forum.processing.org/ o si es algo de programación en Android lo puedes hacer en el foro de htcmania http://www.htcmania.com/forumdisplay.php?f=153
          Siento no poder darte más ayuda, pero al ser esto un hobby y no una profesión no puedo dedicarle más tiempo que el estrictamente necesario.
          Un saludo

    • jose says:

      hola Juan seria de ayuda contactarme con voz es algo relacionado al proyecto que mensionaste que dejo mi correo jose_xp_799@hotmail.cm

  65. juanp-or says:

    No, si entiendo lo que decís, es logico, solo queria que supierais que mi intención no era robar vuestro tiempo, ni nada por el estilo, pido perdón si lo ha parecido y estoy muy agradecido por la ayuda prestada, voy a plantear mi duda ahora mismo en el foro Oscar a ver si alguien pudiera ayudarme con ella, repito, Muchas gracias de veras :)

  66. Andrey says:

    Oye Una Pregunta de los modulos blue que venden aqui me servira lo puedes cheekear http://www.dynamoelectronics.com/images/stories/Bluetooth%20Shield.pdf

    gracias necesito enviar un high al pin 12 de arduino

  67. Andrey says:

    otra cosa copie el codigo que tienes y me aparece error que las librerias que estan en la cabecera no existen

  68. Andrey says:

    ya logre solucionar eso pero ahora le doy run al programa tuyo
    y me sale un error en esta linea
    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    a que se debe dice

    [javac] Since compiler setting isn’t classic or modern, ignoring fork setting.
    [javac] Since compiler setting isn’t classic or modern, ignoring fork setting.
    [javac] Since compiler setting isn’t classic or modern, ignoring fork setting.
    [javac] Compiling 3 source files to C:\Users\usuario\AppData\Local\Temp\android3109560753686470828sketch\bin\classes
    [javac] Since compiler setting isn’t classic or modern, ignoring fork setting.
    [javac] C:\Users\usuario\AppData\Local\Temp\android3109560753686470828sketch\src\processing\test\sketch_130202a\sketch_130202a.java:252: cannot find symbol
    [javac] symbol : variable UUID
    [javac] location: class processing.test.sketch_130202a.sketch_130202a
    [javac] socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));
    [javac] ^
    [javac] Note: C:\Users\usuario\AppData\Local\Temp\android3109560753686470828sketch\src\processing\test\sketch_130202a\sketch_130202a.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 1 error

    BUILD FAILED
    C:\Users\usuario\Desktop\adt-bundle-windows-x86_64\sdk\tools\ant\build.xml:710: The following error occurred while executing this line:
    C:\Users\usuario\Desktop\adt-bundle-windows-x86_64\sdk\tools\ant\build.xml:723: Compile failed; see the compiler error output for details.

  69. Andrey says:

    Esta relacion al conecta dispositivo El simbolo UUID no lo reconoce no se porque en ese caso que debo hacer?? gracias

  70. Andrey says:

    Si ya solucione todo eso ahora conecto mi tablet samsumng galaxy note II y sale esto en el cuadro de run

    debug:
    Shutting down any existing adb server…

  71. andrey caro says:

    Igual sin debug aparece eso y device no se conecta :s

    • Oscar says:

      Pero lo estás ejecutando en el samsumg o en el PC? Al tener librerías bluetooth sólo funciona en el samsumg directamente.

  72. Pete says:

    Hi
    When running the whole program in processing i keep getting an error in line 227 (Incomptible types).
    Does anyone recgionize this error and do you have any solutions for it.

    When commenting this line out i can get the aplication to compile and run on my Nexus 7. It even sees the BT module i have on my embedded board.

    Any help is greatly appreciated

    Processing 2.0b7

    • Oscar says:

      With socket.connect(); ?

      • Pete says:

        Sorry. I did not understand that.

        • Oscar says:

          The line contains socket.connect();?

          • Pete says:

            void conectaDispositivo ( )
            {
            try
            {
            socket = // Method m = dispositivo.getClass().getMethod(“createRfcommSocket”, new Class[] { int.class });
            // socket = (BluetoothSocket) m.invoke(dispositivo, 1);

            socket. connect ( ) ; // line 225
            ins = socket. getInputStream ( ) ;
            ons = socket. getOutputStream ( ) ;

            the compiler reports “Incompatible Types” and halts in line 225

            Pete

  73. Julian David Rua Pino says:

    Hola buenos días me podrías compartir por favor este proyecto de ejemplo ya que con este código no e logrado compilarlo, ya que me saca error en varias clases que no esta en el código que publicaste, te lo agradecería enormemente, por que a partir de esto puedo seguir con mi proyecto.

    gracias quedo atento

  74. jose hinestroza says:

    Muchas gracias por compartir esta informacion!

  75. Alberto Esteban says:

    Hola buenas, antes de nada felicitarte por el pedazo de curro que has hecho.

    Estoy intentando seguir tus pasos pero a la hora de compilar me da un error en la linea de codigo siguiente:

    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    Y no me da mucha explicación, por lo que no puedo buscar por mi cuenta.

    Tambien tengo que decir que estoy compilando el sketch en emulador y puede ser el motivo…pero no lo se.

    Si me pudieses ayudar te lo estaría muy agradecido.

    Saludos y otra vez felicidades.

    Mil gracias

  76. john lunt says:

    Brilliant job Oscar. But did you forget to import java.util.UUID?

  77. Lisergio says:

    Buenas e nuevo….

    Estoy intentando hacer algo similar pero con processing en el pc…. Y tengo una duda…

    Cuando configuras el puerto serie en processing… Usando la siguiente linea.

    myPort = new Serial(this, Serial.list()[0], 9600);

    Donde [0] es el puerto que corresponde con la placa arduino ( ya sea usando el cable usb o un puerto serie bt….

    Mi problema biene cuando cambio de puerto o uso otro adaptador serie, que el puerto cambia, por lo que hay que cambiar este numero con el que corresponda….

    Para saber cual es basta con hacer un porlist…

    println(Serial.list());

    Pero …. Y aqui viene mi duda… Como se puede hacer, que el programa se detenga, nos muestre la lista de los puertos disponibles ,con un numero asignado a cada uno ( que ya es asi, el primero es el 0, luego el 1 y asi sucesivamente…). y espere a que seleccionemos uno de esos numeros para continuar la ejecucion del sketch usando ese numero de puerto ?

    Perdon por la chapa….

    Gracias por la ayuda!

  78. szitko says:

    Why does not work on android version 4.0.4?
    Version 2.3.7 worked.

    • Oscar says:

      No idea. What kind of error do you have?

      • szitko says:

        My bluetooth is not pairing with my device HC-05 module.
        It says “paired but not connected”
        When I run the program, the background is always the password when prompted in.
        I in write, but does not connect to.

  79. heavy says:

    hola. por favor estoy intentando copilar pero el instante de cargar me sale cannot find symbol y mee subraya la linea de socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    activo las otras dos pero por nuingun motivo funciona por favor si me podrias ayuda.gracias

  80. heavy says:

    Primero te agradesco Oscar. Quisiera saber en que linea puedo comenzar para crear una pantalla donde pueda ver una senal analogica ayudame por favor es para mi proyecto final de la universidad.gracias

  81. jose says:

    hola Oscar buen dia amigo de verdad me interesa esto ya que estoy tratando de conectar una banda polar wearlink plus bluetooth, y de verdad soy algo nuevo por lo que seria de gran apoyo si me aconsejas ya que existe poco material acerca de esto por favor ayuda :(

  82. deux says:

    porque me marca error en esa linea? xfa si puedes ayudame

    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

  83. jose says:

    Buen dia Oscar sera que permitirias la aplicacion corriendo es que la necesito para entender mejor que hay cosas que no comprendo te dejo mi correo jose_xp_799@hotmail.com grax de ante mano :D

  84. basttian says:

    tengo un problema con las bibliotecas , como las instalo para q processing las pueda utilizar,me pueden ayudar porfavor

  85. Juan Carlos. says:

    Hola Oscar.

    Estamos desarrollando un dispositivo bluetooth y necesitamos programar una aplicación android para poder enlazar éste con el terminal y así poder interactuar con el teléfono. Si estás interesado en desarrollar la app como freelander o conoces a alguien que lo quiera hacer, por favor ponte en contacto con nosotros en iteeditorial@icloud.com o por teléfono 927 31 00 06. Gracias.

    Juan Carlos Ramiro.
    ITE editorial.

  86. Leonardo says:

    disculpa socio solo tengo una pregunta que hacerte el codigo final que a lo que entendi es la aplicacion para mi android como la instalo en mi dispositivo ?? saludos

  87. Eduardo del angel says:

    quisiera saber si tienes un ejemplo de una aplicacion en la cual se conecte con otro celular y puedes enviar datos como cadenas de caracteres o numeros…

    llevo buscando mucho tiempo un ejemplo asi pero no lo encuentro.

    o si me puedes decir como hacerlos.

    • Oscar says:

      Me temo que esto sólo es desde un módulo bluetooth serie a un móvil o tablet, no de móvil a móvil.

  88. Cesar Arellano says:

    Logre reproducir esta aplicacion para mi arduino uno, gracias por publicarlo, solo un detalle curioso, cada vez que muevo de posicion mi telefono la aplicacion se cierra automaticamente, tuve que deshabilitar la funcion de rotacion de pantalla para lograr que la aplicacion no se cierre debido al movimiento del aparato.Que tendria que hacer para evitar que se cierre sin tener que deshabilitar la funcion mencionada?

    • Oscar says:

      Prueba a importar la librería android.content.pm.ActivityInfo y luego poner esto en la función setup:

      setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

  89. Cesar Arellano says:

    Ahora estoy intentando leer una senal analoga (sensor temperatura) pero me encontre con dificultades.la senal enviada por el modulo bluetooth se recive como byte, asi que se necesitan hacer unas conversiones para convertir el inputstream a string.en void muestradatos() intente lo siguiente:
    InputStream ins;
    String valor;

    ins = socket.getInputStream();
    valor = str( ins.read() );

    Puedo compilarlo sin ningun error pero al momento de abrir la aplicacion esta se cierra forzadamente. no tengo idea de que mas hacer

  90. Oscar says:

    Pero ¿por qué pasarlo a cadena? La función text ya permite mostrar el número como una cadena a partir de un int o un byte.

  91. Cesar Arellano says:

    Gracias por el consejo, mis conocimientos en Java son muy limitados, voy a investigar en la red como utilizar la funcion text para mostrar valores en cadena.

  92. Cesar Arellano says:

    No solo pretendo recibir en Processing valores numericos, tambien pretendo enviar pequenos mensajes de texto, la funcion valor esta declarada como “byte” si quiero leer numeros mayores a 255 que es lo maximo que “cabe en un byte” o leer textos necesitaria leerla como un word o como un String es por eso que necesito saber como convertir el inpustream a string,

    • Oscar says:

      Puedes ir almacenando los bytes que recibes del inputstream en un arras y luego convertir este a string con Arrays.toString

  93. Ricardo says:

    Primero muchas gracias por tu aporte. He programado una aplicación de control de luces basado practicamente en tu proyecto, y ha funcionado varios meses bien, pero ahora, despues de cargar el programa de processing en el android y seleccionar el dispositivo bluetooth del arduino me sale siempre el mensaje “java.io.IOException: Unable to start Service Discovery”, es decir ya no muestra el UI (los botones (rectangulos) de encendido y apagado de luces). Haciendo pruebas, la unica forma para que se muestre el UI es, en la funcion conectaDispositivo(), comentar la primera linea del try “socket = …” y descomentar las dos lineas siguientes (que estaban comentadas en tu proyecto) pero en este ultimo caso los botones no interactuan. Sabrias decirme primero porque ya no funciona con el socket que conecta con el servicio 00001101-0000-1000-8000-00805F9B34FB; y segundo, como puedo dar actividad a los botones utilizando el socket con el metodo estandar.

    Muchas gracias de antemano.

    • Oscar says:

      Pues no sabría decirte. ¿Has cambiado el dispositivo bluetooth?. Si los botones no interactuan debe ser que no ha hecho una conexión correctamente, ¿has probado a enviar una cadena de caracteres (por ejemplo secuencia de apagados y encendidos de las luces) después de obtener el Outputstream para comprobar si al menos conecta bien y envía datos?

      Prueba otra cosa, deja tu proyecto como estaba y antes del connect pon esta línea:

      adaptador.cancelDiscovery();

  94. Ricardo says:

    Si cambie de bluetooth (utilizo JY-MCU Arduino Bluetooth) y tampoco funciona. Creo que todo esto empezo cuando instale en el portatil Toshiba (con el cual trabajo y conecto el arduino y el android) los nuevos drivers “Bluettoth Stack by Toshiba”, y tal vez al compilar los programas (Processing y Arduino) tome otra información para el bluetooth?, aunque yo no utilizo el bluetooth del portatil, solo utilizo en la comunicacion los bluetooth del android y del arduino.

    He creado otro programa y copie (exactamente) tu proyecto ejemplo de esta pagina (para el arduino y para el android) y he comprobado que solo recibo y envio caracteres utilizando el socket con el metodo estandar, por tanto el bluetooth del arduino esta bien (con el socket que conecta con el servicio 00001101-0000-1000-8000-00805F9B34FB me muestra el mensaje “java.io.IOException: Unable to start Service Discovery”). Ahora tengo que hacer funcionar mi proyecto (bastante mas largo tambien incluye comunicacion web) con el socket del metodo estándar y mi pregunta es si es necesario o no crear un thread como lo comentas (lo cual no sabria hacerlo) o si tendre problemas de funcionamiento.

    Muchas gracias de antemano.

  95. Ricardo says:

    Si tambien coloque la linea adaptador.cancelDiscovery(); antes de la linea socket.connect(); y salia el mismo mensaje “java.io.IOException: Unable to start Service Discovery” despues de pulsar (elegir ) de la lista el dispositivo bluetooth del arduino.

    • Javier says:

      Hola Ricardo, Óscar,
      Lo primero, muchas gracias a Óscar por este post/tutorial tan útil y claro. Me acabo de descargar processing hace una hora y estoy alucinando con lo potente que es.
      Hace unos días estuve escribiendo una aplicación similar directamente sobre Android y me llevó bastante más tiempo.
      Respecto al socket, aparentemente en nuevas versiones de Android las cosas funcionan diferente y no es posible la conexión utilizando UUID. He leído bastantes posts sobre el tema en stackoverflow, y la conclusión es que hay que utlizar la opción propuesta más arriba:

      Method m = dispositivo.getClass().getMethod(“createRfcommSocket”, new Class[] {int.class});
      socket = (BluetoothSocket) m.invoke(dispositivo, 1);

      Con este cambio, y añadiendo los import necesarios, a mí me funciona perfecto. He subido el sketch con todos los cambios al proyecto de mi aplicación android por si alguien quiere descargárselo:
      https://github.com/jmgjmg/SerialBluetooth/blob/master/BTSketchProcessing.pde

      Gracias de nuevo por un artículo tan útil!

      • Oscar says:

        Gracias Javier por aportar luz al asunto. Hace tiempo que no uso processing para Android y por eso agradezco vuestros comentarios sobre los cambios que hay que hacer para que siga funcionando.

        • Ricardo says:

          Hola Javier y Oscar, acabo de entrar de nuevo a este link (después de algunos meses) y me alegró la respuesta de Javier, porque haciendo pruebas había solucionado mi problema (hace unos meses) con la solución de Javier y me deja más tranquilo que es lo correcto.

          Al hilo de esto, tengo otro problema y si alguno de ustedes sabe la solución les estaré muy agradecido. Mi proyecto Processing-Android funciona muy bien en un target API level 10 pero al instalarlo en un android 4.1.2 (API 16) o 4.2.2 (API 17), se conecta bien al Bluetooth del Arduino pero el teclado del android se bloquea (no permite introducir digitos, lo que en el API 10 funciona perfectamente), y tampoco funciona en un emulador en este caso sólo muestra el mensaje “BUSCANDO DISPOSITIVOS”. He leido en la web que Processing sólo soporta el API level 10, y la solución que propone alguno es que se debería modificar los fuentes de Processing, y recompilarlo, etc. Mi pregunta es alguno de vosotros ha instalado un proyecto Processing-Android en un API level mayor a 10 y como lo ha hecho?

          Muchas gracias de antemano.

  96. Cesar Arellano says:

    Retomando lo del asunto de leer valores mayores de un byte: importe la libreria:
    import processing.bluetooth.*;

    Client c;
    byte[] inbuffer = new byte[2]; // leyendo bytes y acomodarlos en un array

    void muestraDatos() {
    if (c.available() > 0) {

    // Leer bytes
    c.readBytes(inbuffer);
    {
    // Convertir el array de bytes a String
    String myString = new String(inbuffer);
    if (inbuffer !=null)
    // Show it text area
    println(myString);
    }
    }
    }

    El programa se compila sin ningun error, pero al momento de abrir la aplicacion esta es forzada a cerrarse… Si por favor alguien sabe como leer datos en forma de “String” o de guiarme con un ejemplo lo agradecere mucho se me acaba el ciclo escolar para fin de mes y mi proyecto final aun no tiene forma, gracias

  97. carlos serna says:

    Hola, primeramente excelente tu trabajo. Lo que queria preguntarte es como podria hacer para que en ves de ver numeros en la pantalla del celular pueda ver otra cosa una imagen con algun texto por darte un ejemplo vdd esque esto es justo lo que necesito para un proyecto, otra pregunta la señal que envias al celular podrias hacerlo ccon un pulsador?

    Espero me puedas aclarar estas dudas gracias de antemano

    • Oscar says:

      Dado que se trata de Processing, puedes usar las funciones propias del entorno http://processing.org/reference/PImage.html. Con respecto a la señal mediante pulsador, ¿tiene experiencia en la electrónica? si es así sabrá que cuando se programa un microntrolador puede hacer tareas repetitivas o esperar a un evento (por ejemplo la pulsación de un botón) para hacer algo.

      • Carlos Serna says:

        Hola de nuevo muchas gracias por responder, leere el articulo, y si se electronica un poco mas que basica jeje, en fin, lo que en realidad quiero hacer para ser mas espesifico jeje es una ratonera automatizada algo raro pero me anda valiendo un 10 en la uni y lo unico que quiero hacer o lo que se quiere lograr es que al momento de que se accione la ratonera esta me mande una señal (apachurre el pulsador) y eseta señal se mande al arduino, del arduino via bluetooth que me llege al celular android, en resumen es el monitoreo de la trampa. jeje espero no estresarte con esto, y una vez mas gracias por la info.

        • Oscar says:

          En principio no hay problema para hacer que arduino detecte el cierre de un pulsador, luego ese estado se envía al módulo bluetooth mediante el puerto serie y sería recibido por tu celular.

  98. Jose says:

    Talvez mi duda será tonta…

    Pero no puedo importar la librería import java.util.UUID…

    no se como hacerlo… soy super nuevo en esto..

    en el menú me voy a Sketch, luego Add Library, Add Library… y luego en All busco java.util.UUID y no encuentro nada… no se si asi es la forma..

    Esta instalado el Android SDK Manager y tengo agregado donde dice Android Support Library…

    o en donde es…

    Les agradecería que me explicaran..

  99. Jose says:

    Te agradezco…

    Pero como te mencione soy totalmente nuevo en esto y estoy tirando a grandes ligas con lo que tu sabes…

    Disculpa mi ignorancia…

    pero no encuentro por donde ingresarle la librería y si es por donde digo no la encuentro a la hora de la búsqueda…

    Entonces me gustaría saber si me podes asesorar que hacer… gracias…

    • Oscar says:

      Lo primero es que que sólo tienes que poner esa línea al principio del código, no hace falta añadir ninguna librería. Lo segundo es saber si estás en modo android en el entorno de processing.

      • Jose says:

        Gracias… muchas gracias….

        Definitivamente mi ignorancia era grande… gracias…

        Otra consulta que tengo es que tengo es que no logro emular o compilar la aplicación en modo android ya que siempre me da el error

        Lost Connection with device while launching. Try again.

        Desde una aplicación sencilla hasta la que esta aquí.

        Tendras idea de que sea… (solo en modo android me da, ahora en java si funciona)

  100. Luis Felipe Ruiz says:

    Hola amigo muchas gracias por tu informacion funciona correctamente, quisiera realizar una pregunta sencilla soy novato en esto de processing, asi que veo que la instruccion TRY este ejecuta el proceso indefinidamente (loop) pero requiero que solamente me envie un dato una UNICA vez.

    ejemplo

    try
    {
    ons.write(‘A’) esta enviando AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    }

    PERO REQUIERO

    ons.write(‘A’) que envie A

    Agradeceria que me pudieran dar alguna idea de como solucionar

    Gracias :)

    • Oscar says:

      EL ons.write en el código del artículo sólo se envía cuando se pulsa una zona de la pantalla que hace de botón (función compruebaBoton), no continuamente.

  101. CARLOS says:

    Quiero saber si me puedes ayudar con algo de tu código, yo sé que han pasado varios años desde que lo publicaste, en estos momento lo necesito, pero al copiar el código, processing me genera un error en con el socket del método conectaDispositivo(), el error es cannot find symbol y no se qué pasa.

    • Oscar says:

      ¿Has puesto en modo android el processing?, ¿tienes instalada la sdk de android y su API 10?

      • CARLOS says:

        gracias por responder, y si tengo Processing en modo android y tengo el instalado el API 10 instalado, al comentar la linea del problema
        “socket=dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));” si deja compilar bien, que me recomiendas.

        • Oscar says:

          Vale, ahora que me has dado más información sobre en qué línea te ha dado el error, ¿has leído los comentarios de este artículo? ahí está la solución, más concretamente en el del 10 de Enero de 2013 a las 13:16

  102. infoe says:

    Hola. Necesito hacer un driver USB-Serie,o un COM virtual, o algo que me permitaconectar un adaptador serie-usb a una tablet. El driver original (PL2303.ko) no funciona. ¿Con esto se puede hacer?. Gracias. Saludos.

  103. Andrea says:

    Hola!
    Muy interesante este foro, muchas gracias…
    Copié el código en Arduino y Processing y corre sin errores, sin embargo una vez aparece el botón “BOTÓN” lo presiono y no pasa nada, no se prende el LED :(. Ya comprobé el pin digital 13 por aparte y funciona correctamente.
    Que podría ser?

    • Oscar says:

      Vaya, pues si llegas a ese punto es que todo ha ido bien (elección del módulo, muestra de la pantalla con el botón, etc). ¿Puede ser que los pines de TX y RX del módulo bluetooth estén al revés con respecto a arduino? tendría que ser el TX del módulo al RX del arduino y el RX del módulo al TX del arduino.

      • Andrea says:

        Hola Oscar!
        Muchas gracias por tu respuesta, tras haber intentado varias cosas, utlice el codigo de Javier el cual es el tuyo con unas pequeñas modificaciones, y me funciono :), gracias.
        Tengo otra pregunta, programe un nuevo boton, para manipular otro Led (Pin 12), sin embargo, no importa el boton que oprima siempre prende el Pin 13.

        Codigo arduino:

        boolean estado;
        byte a = 0;
        void setup()
        {
        Serial.begin(9600);
        pinMode(12, OUTPUT);
        digitalWrite(12, LOW);
        randomSeed(analogRead(0));
        estado = false;
        estado1 = false;
        }
        void loop()
        {
        delay(100);
        Serial.write(random(40));
        while(Serial.available() > 0)
        {
        a = Serial.read();
        if (a == 0)
        {
        estado = !estado;
        digitalWrite(12, estado);
        }
        if (a == 1)
        {
        estado1 = !estado1;
        digitalWrite(13, estado1);
        }
        }
        }

        Codigo Processing (parte modificada):
        void compruebaBoton()
        {
        if( mouseY 640)
        {
        try
        {
        ons.write(1);
        }
        catch(Exception ex)
        {
        estado = 4;
        error = ex.toString();
        println(error);
        }
        }
        }

        Lo que quiero hacer es que si oprimo cualquier punto sobre la mitad superior de la pantalla prendo un led (13), y si oprimo un punto sobre la mitad inferior de la pantalla prendo el otro led (12).
        ¿Es correcto el código que estoy implementando para lo que intento hacer?
        Hice una prueba aparte, con solo 1 botón, cambie solamente el pin 13 por el 12. Y no funciona, no importa que pin modifique en el código de arduino, siempre se prende solo el 13.

        Nuevamente muchas gracias por el tutorial y foro, me han sido de mucha ayuda.

        • Andrea says:

          Ya resolví el problema, el código esta correcto, el problema era el siguiente: tenia que desconectar el dispositivo bluetooth de la tarjeta arduino para que el programa pudiese ser quemado correctamente en la tarjeta. Gracias :). Excelente tutorial!!

  104. miguel says:

    hola me gustaría saber si cuando tu pones la función de recibir el dato del dispositvo bluetooth y lo muestras en tu celular tu instrucción
    valor = (byte)ins.read(); declaras tu valor como byte y la siguiente no la entiendo por ejemplo si yo mando una cadena de caracteres de mi dispositivo bluetooth como declararía mis variables, mi problema es el siguiente hice un programa en arduino y lo enlazo con processing para graficar temperatura y humedad relativo, por medio del puerto serial, arduino manda una cadena de caracteres separados por comas los datos de temperatura y humedad teniendo un punto como terminación de datos, processing ve esto los separa y los grafica, ejemplo 30,40. como tendría que declarar mis variables de valor y leer los datos para que lleguen completos y pueda procesarlos, gracias

    • Oscar says:

      Puedes ir convirtiendo los enteros que devuelve read en carácteres (chat) y anexarlos a una variable tipo String. Cuando el programa vea que llega el carácter retorno de carro entonces es momento de procesar los datos de la variable String y volver a dejarla vacía.

  105. miguel says:

    la aplicación se baja correctamente a mi celular sin errores pero a la hora de correrla se queda con la pantalla negra y letras verdes que dice}
    elija dispositivo pero no se ve nada mas, me podrias orientes a lo que pudiera ser gracias

    • Oscar says:

      ¿Tienes el dispositivo bluetooth emparejado al móvil previamente?

      • miguel says:

        hola oscar gracias por responder, mira apenas comienzo con processing android blue2, baje algunas aplicaciones donde me enciende el blue2 de mi móvil y busca las disponibles en el área y si funcionan pero quise probar la tuya y me pregunta si quiero habilitar mi blue2 y si lo hace pero se queda en elija dispositivo y no funciona nada mas se queda como bloqueada la función, nho muestra las disponibles tampoco, solo habilita mi blue2 y manda ese mensaje, gracias

  106. Fabián says:

    Hola, primero agradecer el esfuerzo de Oscar y demas personas que a partir de el colaboran en enseñarnos algo muy trabajado.
    Les cuento que hace bien poco descubri Arduino, y he podido seguir todos los pasos para crear sketch diversos y mezclarlos para crear otros o agregarles cosas, lo cual me ha entusiasmado mas aun.
    Comunicarme por BT tampoco es problema mediante el entorno arduino, pero en este ejercicio con android me ha pasado de todo, hace tres dias que leo y he solucionado un error para pasar a otro, el caso es que al querer correrlo en el simulador he tenido como 5 errores distintos hasta que este ultimo:
    Build Failed
    C:\Program Files\Android\android-sdk\tools\ant\build.xml:680: The following error occurred while execute this line:
    C:\Program Files\Android\android-sdk\tools\ant\build.xml:693: Error running javac.exe compiler
    Yo no se si soy muy torpe para aprender esto, si ya me tare por leer demasiado en tan poco, pero el asunto es que no encuentro la solucion, asi que disculpadme si mi pedido de ayuda es un poco estupido y la solucion la tengo delante, pero les aseguro que he leido hasta el artazgo.
    Necesito ayuda, por favor.

  107. miguel says:

    hola oscar una pregunta respecto al problema que me encontré, tu programa detecta cualquier blue2 incluso los blue2 de los otros móviles si están activados o solo detecta blue2 externos, disculpa por mi pregunta.

    • Oscar says:

      Muestra los dispositivos bluetooh que haya emparejado previamente al móvil. En la imagen puedes ver un Parrot CK3100 que es un manos libres para el coche, en el momento de hacer el artículo no estaba cerca de mi coche ni estaba arrancado, pero como ya estaba emparejado hace tiempo en mi móvil aparecía en la lista.

  108. Fabián says:

    Hola Oscar, gracias por contestar, tengo Windows 8 con Java SE version 7 actualizacion 45. Los scratch en modo Java se ejecutan, cuando paso a Android sale en un renglon marron: Error from inside the Androids tool, check the console.
    Luego en la parte de abajo lo que escribi en el mensaje anterior. Lo peor fue cuando tenia instalado el Android SDK r.23, los errores eran varios, luego instale el r.18, para actualizar solo la API 10 y el Google USB driver. Ya que lei en varios lugares que Processing no funcionaba con las ultimas r.
    En fin en Android SDK manager tengo, A. SDK tools rev. 20; platform tools en 12; SDK platform API10 rev2; Googles Apis 10, rev. 2 y el driver.
    Ultimo, segun tengo entendido JSE 7 u45 incluye JDK mas JRE, estoy equivocado y debo descargarlos aparte.
    De nuevo gracias por tu tiempo. Es muy amable de tu parte.

  109. miguel says:

    hola oscar ya ando aquí de enfadoso otra vez, mira ya he activado varios blue2 móviles pero no los detecta solo se queda en elija dispositivo y no muestra nada

    • Oscar says:

      Cuando dices que has activado te refieres a que has emparejado? En Ajustes/Bluetooth/Dispositivos Sincronizados te aparece una lista de los que has emparejado? Si es así tendría que salirte la misma lista en la pantalla de “Elija Dispositivo”

  110. miguel says:

    hola oscar y nuevamente gracias te lo agradezco, efectivamente cuando yo en mi móvil me voy a ajustes/blue2/dispositivos sincronizados me aparece la lista de los dispositivos detectados en la función del móvil, ahora bien, cuando ejecuto la aplicación de tu programa no aparecen en ella, solo se queda en elija dispositivo y no las muestra, es lo único que me hace falta para acceder a tu aplicación y probar tu programa para hacer pruebas con los datos que necesito enviar del blue2 externo a mi móvil y procesarlos, gracias nuevamente

    • Oscar says:

      Prueba a cambiar la función listaDispositivos por esta y dime que número aparece a la derecha del texto:

      void listaDispositivos(String texto, color c)
      {
      background(0);
      textFont(f1);
      fill(c);

      if(dispositivos != null)
      {
      text(texto + " " + dispositivos.size(), 0, 20);
      for(int indice = 0; indice < dispositivos.size(); indice++)
      {
      BluetoothDevice dispositivo = (BluetoothDevice) dispositivos.get(indice);
      fill(255,255,0);
      int posicion = 50 + (indice * 55);
      if(dispositivo.getName() != null)
      {
      text(dispositivo.getName(),0, posicion);
      }
      fill(180,180,255);
      text(dispositivo.getAddress(),0, posicion + 20);
      fill(255);
      line(0, posicion + 30, 319, posicion + 30);
      }
      }
      else
      {
      text(texto + " 0",0, 20);
      }
      }

  111. miguel says:

    oscar gracias la probare y te digo lo que pasa,

  112. miguel says:

    oyes oscar cual fue el modulo de bluetooth que usaste en tu proyecto

  113. miguel says:

    Hola oscar ya probe la rutina que me pasaste y shgue igual no detecta y dice
    Elija dispositivo y enseguida el 0 y en el bluetooth d mi movil
    Si aparecen

  114. luis says:

    hola
    estoy teniendo un error en la linea

    socket = dispositivo.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

    la consola me dice,

    cannot find symbol

    ayudaaa!!
    mucgas gracias

  115. miguel says:

    Si oscar los dos permisos desde bluetooth desde procesgsing

  116. miguel says:

    lo voy a probar oscar para ver si es mi móvil, lo raro es que he bajado otras aplicaciones parecidas a mi móvil de processing android bluetooth y si las detecta, voy a probar y estare por aquí para decirte los resultados, muchas gracias oscar, oscar el numero 0 que aparece a la derecha significa que no encontró dispositivos para la coneccion o que significa

    • Oscar says:

      Me gustaría ver alguna de ellas, sobre todo las de processing, ¿podrías pasarme los enlaces?. El 0 indica que algo ha ido mal en el método empieza.

  117. miguel says:

    claro que si oscar
    este es el tutorial que me encontré y ya casi probe todos los sketches
    http://arduinobasics.blogspot.com.au/2013/03/arduino-basics-bluetooth-android.html

  118. miguel says:

    una pregunta oscar en este enlace que te mande en Android/Processing Sketch 5: ConnectBluetooth hay una instrucción
    if(discoveredDeviceName.equals(“SeeedBTSlave”)){ donde el programa processing android le da el nombre del dispositivo blue2 con el cual se tiene que emparejar ahora bien en el sketch de abajo ARDUINO Sketch 1: Bluetooth Pair and Connect tiene el nombre que se le dio al dispositivo blue2 esto es para que se conecte automatico con nuestro android cuando lo encuentra, y no se conecte con otro aunque los detecte, te pregunto es Ahora si yo cambio en mi programa processing android el nombre del dispositvo por algún otro que detecte se conectara mi móvil con otro móvil si pongo si nombre en el programa processing android, gracias oscar, porque este programa los probe y si me da todos los dispositivos blue2 que se encuentran alrededor junto con sus nombres, pero vi que como tiene otro nombre con el que supuestamente se tiene que enlazasr no se enlaza con ninguno, poco a poco trato de entender todo este funcionamiento

  119. miguel says:

    no te nos pierdas oscar que eres nuestro maestro y tutor

  120. Miguel Carrasco says:

    Excelente trabajo Oscar!!, lo probé con éxito en una placa Arduino compatible (elecrow.com) y una antena Bluetoth RN42-I/RM tipo Xbee. Respecto al código comenté tu línea ” socket = dispositivo.createRfcommSocketToServiceRecord(…” y descomenté las dos que seguían. De esta forma me funcionó perfecto y sin errores. A propósito, mi celular tiene una pantalla más chica y por ello no veía el botón. Sería una buena idea dejar la posición del botón relativa al tamaño de la pantalla. Me tomó un buen tiempo en entender porqué no veía el botón hasta que entendí que lo dejaste en una posición fija. Mil Gracias nuevamente por este excelente tutorial!!

  121. miguel says:

    que te has hecho oscar aun andas por aca

  122. miguel says:

    oscar o alguien que me ayude volvi a instalar el processing y el SDK para anddroid y a la hora que querer cargar el programa a mi móvil me sale que error a la hora de cargar que tiene un error el las tolos, dice exactamente error from inside the android tolos,check the console alguien me podría ayudar con eso que hago para que funcione bien

  123. […] software de este tercer prototipo partió de este código al que le añadimos la librería apwidgets para poder poner botones, cajas de texto y botones de […]

  124. Pedro says:

    Buenas Oscar, estoy probando tu programa para una conexion con pic, y me corre en el emulador de android pero en el momento que inicia la aplicacion me salta el mensaje de Elija dispositivos y no me sale ninguno.
    Y probe si era problema del emulador y lo instale en el movil y se me instalo bien pero en el momento de arrancar la aplicacion me salta un error diciendo que la aplicacion se cerro de forma imprevista. Queria saber si me podias hechar una mano, muchas gracias.

  125. Pedro says:

    No no con otros moviles no e probado pero se supone que la aplicacion en el emulador tendria que funcionar, esque en el emulador tampoco me encuentra ningun bluetooth.
    Y aparte una cosa para sacar el apk de la aplicacion tengo que hacer que funcione la apliacion en el emulador y de ai sacarla verdad o ai otras formas??

  126. Pedro says:

    Buenas e probado con otro movil y se me sigue cerrando, puedes tener alguna idea de que puede ser??

    • Oscar says:

      Según la documentación de google acerca del emulador de Android: http://developer.android.com/tools/devices/emulator.html#limitations dice expresamente No support for Bluetooth, así que por eso no te funciona en el emulador.

      Por otra parte que no te funcione en ninguno de los dos móviles que has probado me resulta raro, ya que si miras los comentarios a todo el mundo que lo ha probado le arranca la aplicación (independientemente de si luego conectan por bluetooth o no). Mira el comentario de Cesar Arellano que es el único que comenta que le pasa algo parecido, pero sólo cuando cambia de orientación el dispositivo.

  127. Pedro says:

    E estado probando si podia ser por lo de la pantalla, pero aun asi no es por eso.
    Dos errores que me da aunque me funciona en el emulador son estos:

    Emulator process exited with status 1.
    onStart
    Inefficient font rendering: use createFont() with a TTF/OTF instead of loadFont().

    Y cuando cojo el apk y lo paso al movil me pasa lo mismo aunque en el emulador me vaya.
    Quiero saber si podia ser por la version de android si es demasiado nueva en comparacion con la que uso en el emulador.
    El unico cambio que hago en tu programa es que no utilizo el socket que utilizas, pongo las lineas que hay debajo comentadas para que me arranque.

  128. Pedro says:

    Si estos ejemplos los e probado y me funcionan en el movil, la cosa esque el programa de aqui nose porque me da ese error no lo entiendo.
    Ya que hago lo mismo que con los del ejemplo, por eso se me hace raro que no me funcione. Alguna cosa mas que se te pueda ocurrir, esque e probado alguna cosa mas pero me sigue dando el mismo error.

    • Oscar says:

      Prueba en el método onStart a borrar todo y a poner esto:

      super.onStart();
      estado = 4;
      error = "Se lee este mensaje?";

      Instalalo en tu móvil y ejecútalo. ¿Ves una pantalla roja con el texto Se lee este mensaje?

  129. Pedro says:

    Si si que me funciona en el movil.
    ¿Que puedo cambiar si esto me va para que me vaya la aplicacion?

    • Oscar says:

      Ok

      Ahora quita todo en el método onStart y pon esto:

      super.onStart();
      println("onStart");
      adaptador = BluetoothAdapter.getDefaultAdapter();
      if (adaptador != null)
      {
      if (!adaptador.isEnabled())
      {
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
      }
      else
      {
      estado = 4;
      error = "Se lee este mensaje?";
      }
      }

  130. Pedro says:

    Esta vez no me funciona se me cierra de imprevisto como me pasaba antes y en el emulador en vez de leerse el mensaje, me sale arriba a la derecha “Buscando Dispositivos”.
    ¿Esto puede ser por el modelo del movil o por la version de android?

  131. Pedro says:

    Muchas gracias e conseguido que me vaya, ya que el problema esque tenia que actualizar el software de mi movil.
    Muchas gracias por todo, funciona con el programa original que esta en la pagina lo unico que e cambiado es lo del socket pero va bien lo unico que tengo que regular es la dimension de pantalla ya que me sale muy pequeño pero eso es cambiando los parametros y ya esta.
    Muchas gracias por todo me has ayudado mucho.

  132. Pedro says:

    Buenas de nuevo, una pregunta, estoy teniendo problemas al enviar un valor flotante desde un PIC16F876A.
    La cosa esque necesito que me llegue valores con decimales de 0 a 30V y ya e cambiado que el valor me llegue como un float en vez de como un byte y aun asi no me llegan bien los datos al programa y cuando lo miro con el bt terminal si que me llegan bien los datos.
    Se te ocurre alguna idea de si puede ser del processing o del programa en C.
    En el programa en C lo envio asi:
    printf(“%f “,c);
    c es el la variable flotante.

  133. Pedro says:

    Si e cambiado un el byte por el float y me sigue llegando el mismo valor pero con tres decimales.

  134. Pedro says:

    ¿Como lo modifico?

  135. Pedro says:

    ¿Quieres decir en el muestra datos que pone un byte que lo cambie por un float?

  136. Oscar says:

    Quiero decir que ins.read() devuelve sólo un byte, y ahora que lo miro la función printf que usas en el pic devuelve un número variable de bytes en forma de cadena: No es lo mismo 4,37 (4 bytes) que 2567,5683 (9 bytes).

  137. Pedro says:

    ¿Y como modifico el ins.read?

  138. Oscar says:

    Tienes cómo hacerlo aquí en otro comentario: http://webdelcire.com/wordpress/archives/1045#comment-55057 Pero para hacerlo con float ya te animo a que lo hagas tu para no hacerte yo todo el trabajo.

  139. Pedro says:

    Perdona pero en ese comentario es para el tema de horas minutos y segundos y lo que estoy intentando hacer esque me envie un dato en decimal que va variando en valor de un voltaje que meto en mi microcontrolador, entonces como puedo variar el muestra datos, porque en el tema de processing llevo poco tiempo.

  140. Pedro says:

    Esque aparte no entiendo lo que me quieres decir refiriendote a ese comentario, porque nose como ponerlo y por lo que me parece a mi es de horas minutos y segundos o eso me parece y nose donde ponerlo en el processing ya que yo quiero que siempre me multiplique por el mismo valor.

  141. Oscar says:

    Cuando se es programador hay que extrapolar los ejemplos. En lo que te menciono se trata de un unsigned long (la función millis de Arduino) que se convierten en 4 bytes para enviarse por el puerto serie uno por uno y desde processing recuperar esos 4 bytes para transformarlos otra vez en un unsigned long, para tu caso sería con un float.

    Haciendo yo por ti una búsqueda por Internet me he encontrado con esto que te servirá para hacer esas conversiones:

    Para el PIC:

    http://www.todopic.com.ar/foros/index.php?topic=23144.0

    Para processing:

    http://stackoverflow.com/questions/14308746/how-to-convert-from-a-float-to-4-bytes-in-java

  142. angel says:

    hola oscar si que te nos habias perdido pero gracias a tus consejos pude lograr demasiado, la aplicación me funciono y puede lograr mandar datos del arduino al móvil y con un programa processing los grafico en forma de barras además hice otra App para que guade los datos durante 24 horas y con el móvil puedo accesar a ellos a cualquier hora todo gracias a tus consejos, pero te tengo una preguntototota en mi programa de processing utilizo la instrucción save(“imagen.jpg”) la cual si lo corro en serial por pc me genera la imagen de la pantalla que quiero grabar, cuando la convierto a android, no puedo ver la imagen porque esta en el sistema del android donde no puedo accesar, utilice también para direccionarla
    save(“//sdcard//DCIM//Camera//imagen.jpg”) pero no la genera o si la genera no la veo, ahí es donde me atore ya, y lo quiero hacer para que cuando reciba los datos del arduino pueda generar una imagen y poderla imprimar al accesar a las imágenes del celular, alguna recomendación que me puedas dar, ya habilite también el write_external_storage en los permisos pero nada, que puedo hacer

    • Oscar says:

      Nunca he hecho un snapshot desde Processing en Android. Pero me choca que la cadena de la ruta que uses sea //sdcard//DCIM//Camera//imagen.jpg en vez de //sdcard//DCIM/Camera/imagen.jpg

  143. miguel says:

    gracias a los consejos de oscar, pude lograr muchas cosas, ya puedo tener control total de la aplciacion y usarla para mis proyectos, envio datos a través de un arduino y los recibo con el celular y manda a graficarlos enforma de barras en el programa processin, además hice otro programa con arduino que almacena datos cada hora durante 24 horas del dia y puedo accesar a ellos con una App que hice gracias a oscar para acceder a los datos y mostrarlos en una grafica horas contra temperatura, este programa me sirvió de antemano para hacer las primeras pruebas de envio de datos y recivierlos en el móvil para darme cuenta como es que se realiza el envio de información y que tipo de datos quisiera mandar y que tipo quisiera recibir agradezco a oscar por todos sus consejos

  144. miguel says:

    a perdón tienes razón me equivoque ahí pero no funciona

  145. miguel says:

    alguna pagina donde pueda ver la información oscar

  146. miguel says:

    ya le encontré oscar, cada vez que mando generar una imagen la ruta esta bien y la genera pero no las podía ver, y baje una aplicación al android que se llama astro para poder accesar al lugar donde las guarda la aplicación que realice y de ahí las puedo seleccionar y las mando a mostrar solamente y asi ya quedan grabadas en la misma ruta que le di y las puedo ver para poderlas bajar e imprimir, gracias estaremos en contacto para cualquier duda que tenga

  147. Pedro says:

    Buenas,espero que me podáis ayudar. Me gustaría saber si existe alguna manera de, una vez desarrollada la aplicación, ajustar el tamaño de la misma automáticamente, dependiendo del teléfono sobre el cual la ejecutemos. Estoy buscando información, pero no encuentro nada referente a esto. Muchas gracias.

    • Oscar says:

      Tendrías que obtener las medidas de la pantalla y ajustar dinámicamente.

      • Pedro says:

        ¿Existe alguna función u opción para obtener estas medidas automáticamente, o tendría que modificar cada vez que se instale en un determinado dispositivo la aplicación?. Muchas gracias de nuevo.

          • Pedro says:

            Como bien dices width y height te permiten obtener el ancho y alto, pero de lo que tu defines previamente en size(). Lo que necesitaría sería saber si existe, que igual no es factible de hacer, no lo se, es obtener los valores de size(x,y), pero automáticamente, para poder referenciar las dimensiones a estos valores x e y.De esta manera podría adecuar la aplicación y dependiendo de las dimensiones del teléfono, mostrarla correctamente, y no más chica o grande.
            Muchas gracias de nuevo.

Leave a Reply

Subscribe to RSS Feed Follow me on Twitter!