Bluetooth HC-05 y App Inventor «slider», Pic C Compiler

En esta sección aprenderás a establecer una comunicación inalámbrica en modo simplex, utilizado un módulo Bluetooth HC-05 y el Bluetooth de un teléfono celular. El objetivo es enviar valores desde un teléfono celular utilizando una aplicación que se programara en App Inventor a un microcontrolador PIC para mostrarlos en una pantalla OLED.

Bluetooth HC-05 

El Bluetooth HC-05 es un módulo de comunicación inalámbrico que utiliza la tecnología Bluetooth para establecer un enlace de comunicación serie entre dos dispositivos. Es un dispositivo muy popular en proyectos de electrónica y robótica, ya que permite la comunicación inalámbrica entre un microcontrolador, como Arduino, y otros dispositivos como un ordenador, smartphone o tablet. El HC-05 puede funcionar como maestro o esclavo y utiliza el perfil serial port profile (SPP) de Bluetooth, lo que lo hace compatible con una amplia variedad de dispositivos que soportan este perfil.

Características:

  • Tecnología: Bluetooth 2.0 + EDR (Enhanced Data Rate)
  • Alcance de comunicación: hasta 10 metros (en condiciones ideales)
  • Velocidad de transmisión: 2.1 Mbps máx. en modo EDR, 721 kbps máx. en modo estándar
  • Frecuencia: 2.4 GHz a 2.4835 GHz banda ISM
  • Potencia de transmisión: Clase 2, hasta 4 dBm (2.5 mW)
  • Sensibilidad de recepción: -80 dBm típico
  • Protocolos de soporte: Bluetooth serial port profile (SPP)
  • Modo de operación: Maestro o Esclavo
  • Compatibilidad: Compatible con dispositivos que soportan Bluetooth SPP
  • Interfaz: UART (Universal Asynchronous Receiver/Transmitter)
  • Voltaje de alimentación: 3.3V a 5V DC
  • Consumo de energía: 30 mA en modo de operación, 1 mA en modo de espera
  • Dimensiones: 28 mm x 15 mm x 2.35 mm

Circuito de conexión

Configuración Bluetooth 

Inicialmente se debe configurar el módulo Bluetooth en modo esclavo para poder recibir los datos mediante una comunicación inalámbrica.

Programación 

Inicialmente se establecen los parámetros de la comunicación RS232.

  • baud = Velocidad de transmisión y recepción configurada en el módulo Bluetooth.
  • stop = Bits de parada.
  • parity = Bit de paridad. 
  • xmit = Pin de transmisión.
  • rcv = Pin de recepción. 
  • bits = Datos de transmisión.
  • stream = identificación de transmisión.

#use rs232(baud=38400, stop=1, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

Se habilita la interrupción para la recepción de datos en el puerto rs232.


   enable_interrupts(int_rda);
   enable_interrupts(global);

Cuando se reciben datos en el pin de recepción RS232, se activara la interrupción y entrara a la subrutina «recibe()» donde recibirá la cadena de caracteres y se guardara en la variable recibido[].


#int_rda
void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         datos();
         mostrar();
         return;
      }
      i++;
   }
}

Cuando termine de recibir los datos, es necesario obtener el identificador del slider y el valor del slider. 

Utilizamos una sentencia «for()» para obtener los primeros 7 caracteres e identificar el slider si es «slider1» o «slider2».

Utilizamos otra sentencia «for()» para obtener los siguientes 3 caracteres que contienen el valor correspondiente al slider de «0 a 100».


      for (int i=0; i<=6; ++i)
      {
         ID_slider[i] = recibido[i]; //identifica el slider
      }

      for (int i=0; i<=2; ++i)
      {
         num[i] = recibido[i+7]; //guarda el valor del slider
      }

Se compara el identificador para saber si es «slider1» o «slider2».

Inicialmente si la variable «ID_slider» contiene el identificador «slider1», resultado=0 y entra a la sentencia «if()» donde el valor que contiene la variable «num»  en cadena de caracteres se convierte en un numero de 8 bits y se guarda en la variable «val_slider1».


      result = strcmp(ID_slider, Slider1);//compara, si son iguales (0), no (+-1)

      if(result==0)
      {
         val_slider1 = (int8)atoi(num);  //convierte la cadena en un numero de 8bits
         return;
      }

Si la variable «ID_slider» contiene el identificador «slider2», resultado=0 y entra a la sentencia «if()» donde el valor que contiene la variable «num»  en cadena de caracteres se convierte en un numero de 8 bits y se guarda en la variable «val_slider2».


      result = strcmp(ID_slider, Slider2);

      if(result==0)
      {
         val_slider2 = (int8)atoi(num); //convierte la cadena en un numero de 8bits
         return;
      }

Finalmente se muestran el valor de cada slider en la pantalla OLED.


void mostrar()
{
   char texto[20];

   sprintf(texto,"Slider1=%03u",val_slider1);
   OLED_DrawText(1,1,texto,1);

   sprintf(texto,"Slider2=%03u",val_slider2);
   OLED_DrawText(1,10,texto,1);

   OLED_Display();//Muestra la información en pantalla;
}

Código completo 


#include "stdlib.h"

#FUSES NOMCLR

#use i2c(Master, Fast, sda=PIN_B0, scl=PIN_B1,force_sw, stream=OLED_stream)//parametros I2C
#use rs232(baud=38400, stop=1, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

#define SH1106_128_64 //DEFINE EL MODELO DE LA PANTALLA OLED
//#define SSD1306_128_64

#include "OLED_I2C.c" //libreria oled I2C

char recibido[20];

int8 val_slider1=0;
int8 val_slider2=0;

void datos();
void mostrar();

#int_rda
void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         datos();
         mostrar();
         return;
      }
      i++;
   }
}


void datos()
{
   signed int8 result;

   char ID_Silder[10];
   char num[10];

   char Slider1[10] = "slider1";
   char Slider2[10] = "slider2";

   memset(ID_Silder, 0, sizeof(ID_Silder)); //limpia los registros de la varible ID_Silder
   memset(num, 0, sizeof(num)); //limpia los registros de la varible num


       for (int i=0; i<=6; ++i)
      {
         ID_Silder[i] = recibido[i]; //identifica el slider
      }

      for (int i=0; i<=2; ++i)
      {
         num[i] = recibido[i+7]; //guarda el valor del slider
      }

      result = strcmp(ID_Silder, Slider1);//compara, si son iguales (0), no (+-1)

      if(result==0)
      {
         val_slider1 = (int8)atoi(num);  //convierte la cadena en un numero de 8bits
         return;
      }

      result = strcmp(ID_Silder, Slider2);

      if(result==0)
      {
         val_slider2 = (int8)atoi(num); //convierte la cadena en un numero de 8bits
         return;
      }
}


void mostrar()
{
   char texto[20];

   sprintf(texto,"Slider1=%03u",val_slider1);
   OLED_DrawText(1,1,texto,1);

   sprintf(texto,"Slider2=%03u",val_slider2);
   OLED_DrawText(1,10,texto,1);

   OLED_Display();//Muestra la información en pantalla;
}


void main()
{

   enable_interrupts(int_rda);
   enable_interrupts(global);

   OLED_Begin();
   OLED_ClearDisplay();

   mostrar();

   while(TRUE)
   {


      //TODO: User Code
   }

}

App Inventor

MIT App Inventor es un entorno de programación visual e intuitivo que permite a todos, incluso a los niños, crear aplicaciones completamente funcionales para teléfonos Android, iPhones y tabletas Android/iOS. La herramienta basada en bloques facilita la creación de aplicaciones complejas y de alto impacto en mucho menos tiempo que los entornos de programación tradicionales. El proyecto MIT App Inventor busca democratizar el desarrollo de software al empoderar a todas las personas, especialmente a los jóvenes, para pasar del consumo de tecnología a la creación de tecnología.

Aplicación 

Para que el microcontrolador tenga el tiempo suficiente para procesar los datos, se utiliza un reloj que establece un tiempo de espera en milisegundos.

Scroll al inicio