PROYECTO: Control de Dispositivo con App Bluetooth

PROYECTO: Control de Dispositivo con App Bluetooth

tecnoingenia / diciembre 20, 2019

De vuelta con el proyecto de la entrada anterior, ahora he añadido un módulo bluetooth «HC-06», este funciona como esclavo y se comunica con nuestro microcontrolador por medio de puerto Serie (UART). El módulo es el siguiente:
Como indica el mismo su conexión es bastante sencilla, cuenta con 4 pines 2 de alimentación (5V y GND) y otros 2 de comunicación, es importante recordar que los pines de comunicación del módulo deben ir cruzados con los del Atmega, es decir TX(BT) – RX(ATm) y RX(BT) – TX(ATm).
Para poder comunicarnos con este módulo he diseñado una aplicación muy sencilla para Android, utilizando la plataforma de AppInventor, esta es un desarrollo del MIT, que permite diseñar una aplicación Android de manera Fácil y rápida, cuando tienes pocos o ningún conocimiento de programación, es una herramienta gratuita y puedes acceder con tu cuenta de google en el siguiente link http://ai2.appinventor.mit.edu/
No es mi intención en esta entrada el hacer un manual de uso de esta plataforma, solo echar un pequeño vistazo y contarles y poco de lo que pueden hacer con ella.
Al crear un nuevo proyecto en AppInventor haremos dos tipos de diseños uno es el diseño «gráfico» o la parte visible de la aplicación (Designer) y otro es el «código» (Blocks). La siguiente imagen muestra una captura del lado del Designer, podremos observar como del lado izquierdo de la pantalla podemos arrastrar elementos (Botones, cuadros de texto, etiquetas, listas, etc.) al display del disposiitivo móvil.  
Si accedemos en la parte de bloques, podremos programar la lógica de que ejecutará nuestra aplicación según los eventos que sucedan (presionar botones, introducir texto, seleccionar opciones, etc.).
Podremos arrastrarlas funciones y elementos del lado izquierdo de la pantalla a el área de trabajo.
En estos primeros bloques de código declaro las variables a utilizar, inicializo la visibilidad de los elementos en la pantalla y programo que al presionar el ListPicker llamado buscar, le asigno los nombres de los dispositivos bluetooth disponibles.
En seguida al seleccionar una red de la lista «BUSCAR», se conecta a la red seleccionada, en el bloque siguiente le indico que al seleccionar el modo «AutoManual», se envía un mensaje «SET AUTOMATIC MODE» para modo automático y «SET MANUAL MODE» para el modo manual al dispositivo bluetooth.
Después, este bloque se trata de un temporizador que se ejecuta cada segundo para ver si hay un nuevo mensaje del dispositivo bluetooth si es así lo lee y lo decodifica.
Por último estos dos bloques corresponden a dos botones en los que se enciende o apaga el relevador cuando se está en modo manual.
El siguiente video ilustra el funcionamiento de la aplicación conectándonos al módulo bluetooth, por default viene configurado con el nombre de «HC-06» pero yo lo he cambiado en el código para que aparezca como «TecnoIngenia»
Como se observa en el video ahora somos capaces de configurar los parámetros de funcionamiento o encender/apagar en modo manual por medio de la aplicación y el dispositivo nos confirma cuando a recibido los datos o cambia de color los botones según el estado en que se encuentre.
Algo importante a tomar en cuenta es que hay que vincular el dispositivo antes de poder utilizarlo como vinculamos cualquier otro aparato bluetooth, el pin por default es «1234».
Para implementar esto al código anterior se le agregaron estas funciones:
void bluetooth()
{
  if (Serial.available())
  {
    String mensajeBt = Serial.readString();
    decodificarMensajeBt(mensajeBt);
  }
}

void decodificarMensajeBt(String m)
{
  if (m.indexOf(F("SET AUTOMATIC MODE")) >= 0)
  {
    paginaActual = 0;
  }
  else if(m.indexOf(F("SET MANUAL MODE")) >= 0)
  {
    paginaActual = 3;
    if(digitalRead(RELAY))
    {
      Serial.print("RELAYTRUE");
    }
    else
    {
      Serial.print("RELAYFALSE  ");
    }
  }
  else if(m.indexOf(F("SETCONFIG")) >= 0)
  {
    byte hora_on = extraerDato(m, F("he="), F("&me="));
    byte minuto_on = extraerDato(m, F("me="), F("&ha="));
    byte hora_off = extraerDato(m, F("ha="), F("&ma="));
    byte minuto_off = extraerDato(m, F("ma="), F("ETX&"));
    EEPROM.write(ADDRESS_HORA_ON, hora_on);
    EEPROM.write(ADDRESS_MINUTO_ON, minuto_on);
    EEPROM.write(ADDRESS_HORA_OFF, hora_off);
    EEPROM.write(ADDRESS_MINUTO_OFF, minuto_off);
    Serial.print("Datos Recibidos");
  }
  else if(m.indexOf(F("CONFIGREQUEST")) >= 0)
  {
    String dataRequest = "CONFIG?he=";
    if(EEPROM.read(ADDRESS_HORA_ON) < 10){dataRequest += "0";}
    dataRequest += EEPROM.read(ADDRESS_HORA_ON);
    dataRequest += "&me=";
    if(EEPROM.read(ADDRESS_MINUTO_ON) < 10){dataRequest += "0";}
    dataRequest += EEPROM.read(ADDRESS_MINUTO_ON);
    dataRequest += "&ha=";
    if(EEPROM.read(ADDRESS_HORA_OFF) < 10){dataRequest += "0";}
    dataRequest += EEPROM.read(ADDRESS_HORA_OFF);
    dataRequest += "&ma=";
    if(EEPROM.read(ADDRESS_MINUTO_OFF) < 10){dataRequest += "0";}
    dataRequest += EEPROM.read(ADDRESS_MINUTO_OFF);
    Serial.print(dataRequest);
  }
  else if(m.indexOf(F("SETSTATUS")) >= 0)
  {
    boolean estado = extraerDato(m, F("RELAY="), F("ETX&"));
    digitalWrite(RELAY, estado);
    if(estado)
    {
      Serial.print("RELAYTRUE");
    }
    else
    {
      Serial.print("RELAYFALSE  ");
    }
  }
 }

 byte extraerDato(String mensaje, String inicio, String fin)
 {
  return mensaje.substring(mensaje.indexOf(inicio) + inicio.length(), mensaje.indexOf(fin)).toInt();
 }
Fueron 3 funciones adicionales las que se programaron, la primera llamada «bluetooth» se ejecuta en el loop principal y está a la de recibir mensajes en el puerto serie, al recibir un nuevo mensaje llama a la función «decodificarMensajeBt» cuyo trabajo es como su nombre lo explica decodificar el mensaje y tomar las acciones según el tipo de mensaje, por último usamos una función auxiliar llamada «extraerDato» para extraer un numero que se encuentra en entre dos extractos de texto.
Si somos observadores veremos que en realidad la comunicación es enteramente como comunicarnos con otro microcontrolador por puerto serie y el módulo bluetooth hace las veces del cable, está forma de recibir, enviar y decodificar datos por el puerto serie es una forma muy básica y hasta cierto punto ineficiente porque no hay manera de identificar si se ha corrompido el mensaje, si hay errores o se trata simplemente de ruido, pero para aplicaciones tan sencillas nos funciona perfectamente.
En una entrada próxima espero profundizar en el tema de la comunicación serial (UART) y hablar de como aplicarla de una forma más efectiva, con encabezados, final de trama, checksum para confirmar la integridad de los datos y confirmación de acknowledge.
Por lo pronto les comparto como siempre, los códigos completos, diagramas, archivos de fabricación de la PCB y el proyecto de la aplicación en formato .aia para que puedan importarlo a appInventor y modificarlo a su gusto, sigan ingeniando.

CÓDIGO ARDUINO

APK APLICACIÓN ANDROID (INSTALADOR)

PROYECTO DE APLICACIÓN EDITABLE

DIAGRAMA ELECTRONICO

PCB FORMATO PDF

ARCHIVOS DE FABRICACIÓN DE PCB (GERBER)

1 Comment

    • tecnoingeniaPosted on : octubre 30, 2022 at 7:57 pm

      Hola!! Su proyecto me intereso demasiado, podrían enviarme si no es mucha molestia el código de arduino ide?, de antemano muchas gracias!

Leave a Reply

TecnoIngenia | Blog personal -israel.barreras@tecnoingenia.com