BLE String – Arduino101 y App Inventor ( Part II )

En este tutorial vamos a extender la misma aplicación que hemos utilizado anteriormente para escribir cadenas de texto.

Y es que en el momento que queramos utilizar el bloque definido desde la extensión de App Inventor para escribir una cadena de texto, el programa anterior solo atenderá a números o a caracteres.

Así que si queremos intercambiar información en formato de texto, modificaremos ligeramente la aplicación anterior. Para ello, vamos a añadir una caja de texto para escribir un mensaje y un botón de envío una vez que hayamos editado.

Para este apartado deberemos definir nuestro servicio y nuestro mensaje con los siguientes UUIDs elegidos

UUID del servicio : 19B10010-E8F2-537E-4F6C-D104768A1214

UUID del mensaje: 19B10011-E8F2-537E-4F6C-D104768A1215

Una ve hecho esto, nos queda programar la placa con los mismos UUIDs, pero esta vez utilizaremos unos bloques diferentes, que son los siguientes.

El primero crea el código para definir el UUID del mensaje, los permisos y el tamaño máximo de la cadena de texto. 16 es más que suficiente para realizar un control mediante cadenas de texto.

Realmente lo que hacen estos bloques es crear una variabe local que rellena con los datos que le llegan de la comunicación con el BLE del dispositivo móvil. Es por ello, que se ha de ejecutar el segundo bloque, siempre que se detecte que se ha escrito el mensaje para recopilar el mensaje sobre la variable LocalString.

Para realizar la evaluación y el control del mensaje obtenido hay que utilizar el tercer bloque para operar con la información que hemos comunicado desde la aplicación definiendo cuántas letras queremos obtener.

De tal manera que al final el programa en ArduBlockly nos quedará de la siguiente manera.

 

Y el código creado para esta programación es el siguiente:

#include <CurieBLE.h>

char LocalString[32];

BLEPeripheral ble;
BLEService BLEService("19B10010-E8F2-537E-4F6C-D104768A1214");
BLECharacteristic BLE_String("19B10011-E8F2-537E-4F6C-D104768A1215",BLEWrite ,16);

void setup() {
  Serial.begin(9600);
  ble.setAdvertisedServiceUuid(BLEService.uuid());
  ble.addAttribute(BLEService);
  ble.addAttribute(BLE_String);
  ble.setLocalName("BLE_APP");
  ble.begin();

  Serial.println("BLE_APP Init");

}

void loop() {
  BLECentral central = ble.central();
  if (central.connected()) {
    Serial.print("Central Connected");
    Serial.println((central.address()));
    while (central.connected()) {
      if (BLE_String.written()) {
        sprintf(LocalString,"%16c",NULL);
        strncpy(LocalString,(char *)BLE_String.value(),BLE_String.valueLength());
        Serial.print("Message Received ");
        Serial.println((LocalString));
      }
    }
  }

}

En el momento que activemos el monitor serie, podremos observar cómo se intercambian los datos desde la aplicación móvil a la placa. Por lo que nos quedaría por hacer, sería realizar un control de acciones en función de la cadena de datos ingresada.

Por ejemplo para controlar un robot por Bluetooth lo único que tendremos que hacer será asociar las cadenas de texto a acciones definidas.

Fijaros en que las comparaciones, deben de coincidir el número de letras. Si no, no realizará la comparación correctamente. Si queremos que nos haga caso siempre yo recomiendo incluir mensajes con el mismo tamaño para evtar equívocos.

Hasta aquí sería suficiente para poder crear una aplicación con BLE y hacer un control remoto de cualquier robot. Pero aún nos queda una parte un poco más sofisticada.

En el siguiente tutorial vamos a realizar una modificación para que nuestra placa también se maneje mediante eventos. Si nos hemos dado cuenta, ejecutamos un bucle while cuando conectamos el dispositivo BLE de nuestra placa. Y cuando se pierde la conexión hay que resetear la placa para volver a conectar y hacer funcionar nuestro robot.

Al menos para la placa Arduino101 funciona así. De manera que veremos otra forma de definir eventos dentro de nuestra placa sin necesidad de depender de estos bucles internos.