viernes, 10 de abril de 2020

Visualizar y procesar datos en AppInventor desde sensores Arduino (Segunda Parte)



Esta entrada corresponde a la segunda parte del proyecto iniciado en Arduino, que tenía por objeto medir la temperatura dentro de un tostador de café. Ahora, con el circuito funcionando, y entregando el valor de la temperatura mediante un módulo bluetooth pasaremos a desarrollar una aplicación móvil que sea capaz de recibir estos valores y graficarlos.
La aplicación se desarrollará a través de AppInventor (https://appinventor.mit.edu), y será compatible con cualquier dispositivo Android. En este caso lo hice pensando para ser utilizada especialmente en un Tablet.

Diseño:

Visualmente la aplicación contendrá los siguientes elementos ordenados en las siguientes disposiciones:

En BarraSuperiorHorizonal estarán los elementos necesarios para iniciar la conexión vía bluetooth. Corresponde a: 

  • Etiqueta de texto Conectar
  • Etiqueta de texto EstadoBT
  • Botón "Buscar" (SelectorBT)
  • Botón Conectar.
El botón “buscar” corresponde a un selector, que nos mostrará los dispositivos bluetooth disponibles para iniciar la conexión. Los cuadros de imagen tienen únicamente función de separadores de los demás elementos.

En VisorTiempoTemp se contienen dos diposiiciones: una correspondiente al cronómetro y otra a la temperatura. Ambas contienen etiquetas de texto que mostrarán los datos a graficar, en tiempo real. 
La temperatura se mostrará desde que se realice la conexión bluetooth. El cronómetro sólo comenzará a correr desde que se presione el botón inicio. Al presionar este botón, también se comenzarán a graficar los datos en el Canvas.

DisposicionGrafico, contiene el Canvas a través del cual graficaremos los datos.

La aplicación además contendrá los siguientes componentes no visibles:
  • Cliente de Bluetooth
  • Reloj1
  • Reloj2
  • Notificador1
  • Componentes de almacenamiento TinyDB y File, pero esos por ahora no los utilizaremos, ya que son parte de una extensión a este proyecto, que quizás suba en una próxima entrada. 
En resumen, nuestra paleta de componentes debiera verse así:

Programa:

Lo primero será iniciar la conexión bluetooth con el Arduino. Es necesario recordar que previo a cualquier intento de conexión por parte de nuestra aplicación, el dispositivo bluetooth a conectar debe estar enlazado al tablet o celular que utilizaremos.

Teniendo en cuenta lo anterior, para programar el enlace de la aplicación utilizaremos los siguientes bloques:

  1. El primer bloque se ejecuta al clickear el SelectorBT, antes de seleccionar, y consultará las direcciones y nombres de los dispositivos bluetooth enlazados al dispositivo Android en que estamos ejecutando nuestra aplicación, y los ubicará como elementos del SelectorBT. Es decir, los mostrará como elementos disponibles para ser seleccionados.
  2. El segundo bloque se ejecuta una vez seleccionado un elemento del SelectorBT, es decir, tras seleccionar el dispositivo bluetooth. Este bloque pondrá la dirección y nombre del dispositivo bluetooth en la etiqueta EstadoBT.
  3. El tercer bloque se ejecuta al clickear el boton ConectarBT. Este realiza la conexión al dispositivo indicado a través del ClienteBluetooth1.
En definitiva, para realizar la conexión a nuestro Arduino vía bluetooth, presionaremos en nuestra aplicación el botón "Buscar" que corresponde al SelectorBT. Éste nos mostrará el listado de dispositivos bluetooth enlazados a nuestro dispositivo Android. Seleccionamos el que corresponde a nuestro Arduino (en mi caso "MiBT"), y luego damos clic al botón "Conectar" que corresponde a ConectarBT.
Con todo esto, nuestra aplicación ya estará recibiendo los datos de temperatura.

Para mostrar estos datos haremos lo siguiente:


Definimos una variable global llamada Temp como texto.

Utilizamos el timer de Reloj2 (configurado para ejecutarse cada un segundo) para desencadenar las siguientes acciones:

  • Si el cliente de Bluetooth se encuentra conectado: 
    • Se cambiará el texto de la etiqueta EstadoBT a "Conectado". 
    • Se verificará si es que existen bytes disponibles para recibir (si es que son superiores a 0), y en tal caso: 
      • La variable global Temp almacenará la información recibida.
      • La etiqueta Temperatura mostrará los valores guardados en la variable.

De esta manera recibimos la temperatura desde Arduino y que es enviada a través de bluetooth, y es mostrada a través de una etiqueta en la pantalla de nuestro Android.

  • Ahora, si al ejecutarse el timer de Reloj2 el cliente de bluetooth no está conectado, simplemente se pondrá como texto de la etiqueta EstadoBT como "Desconectado".
(Aquí en algún momento tuve un problema que me costó varias tardes: realizada la conexión y recibiendo datos a través de bluetooth, estos se encontraban aparentemente en un formato desconocido, y al mostrarlos en la etiqueta Temperatura aparecía, en vez de los números de la temperatura medida, una fila de 6 a 8 signos de interrogación (???????). Finalmente este problema se debió a que el módulo bluetooth de Arduino se encontraba configurado a una velocidad incorrecta. En la entrada anterior dejé indicado paso a paso cómo configurar correctamente el módulo para evitar este problema).

Para graficar los datos trabajaremos ahora en el componente canvas Gráfico, que se encuentra en la disposición DisposicionGrafico. Este canvas se encuentra vacío, por lo que lo primero que haremos será trazar en él líneas de referencia, que nos permitan visualizar los valores que luego graficaremos.
Nuestro gráfico tendrá dos variables: tiempo y temperatura. El primero irá en el eje X de nuestro canvas, y el segundo en el eje Y.
Trazaremos entonces a lo largo del eje X las líneas que nos indicarán los minutos y en el eje Y trazaremos líneas correspondientes a la temperatura.
Para este proyecto yo necesito a lo más graficar 15 minutos. La escala será de 1 pixel por segundo, por lo que necesitaré trazar líneas para 900 segundos (15 min x 60 seg.), y pondré entonces el canvas con una extensión horizontal total de 900 pixeles.
En cuanto a la temperatura, necesitaré graficar valores desde 0 a 300 °C, los que también se graficarán a proporción de 1 pixel por grado °C. Quedará entonces el canvas con un tamaño de 300 x 900 pixeles.

Los bloques para trazar estas líneas los haremos a través de los siguientes procedimientos:


  • Para trazar las líneas correspondientes a los minutos:

El procedimiento LineasMinutos contiene dos variables locales, que funcionarán como contadores: ContadorMinutos y ContadorSegundos. Ambas variables son definidas como númericas y su valor inicial es 0.
Se creó una lista con los valores en segundos de cada uno de los minutos que se graficarán en nuestro canvas, y se ejecutará la acción por cada uno de estos elementos de la lista.
La acción comienza aumentando en 1 la variable ContadorMinutos, llevándonos así el conteo de los minutos (para el elemento 60, el contador será 1, para el elemento 120 será 2, para el elemento 180 será 3... etc.); luego define las propiedades del trazado que se hará (tamaño de letra, color de trazado y grosor de la línea).
Se dibuja la línea, tomando como puntos x1 y x2 la cantidad de pixeles que equivalen a la cantidad al elemento de la lista (es decir, a la cantidad de segundos del minuto a trazar); como punto y1 se utiliza la altura del canvas y como punto y2 cero, de tal manera que cada línea de dibujará de arriba a abajo del canvas y a la altura en el eje X que corresponderá a nuestro minuto, tomando como proporción de desplazamiento un pixel por segundo.
Luego, se cambia el color de trazado a negro, para indicar en letras el minuto al que corresponde la línea. Esta escritura se realiza a 30 pixeles de la orilla del canvas.

  • Para trazar las líneas correspondientes a la temperatura el procedimiento será prácticamente el mismo:



Como se puede ver, este procedimiento se diferenciará del anterior básicamente en que los elementos serán los que corresponden a las temperaturas que es de nuestro interés trazar, y los trazos irán en el eje contrario, es decir, aquí para referenciar valores del eje Y irán líneas paralelas al eje X.

Ambos procedimientos serán llamados al iniciar nuestra aplicación.


Con estos dos procedimientos ejecutandose al iniciar la aplicación, se habrá trazado una cuadrícula en el canvas con las líneas de los minutos en un sentido, y en el otro, con las líneas de temperatura.


Para trazar el gráfico de tueste, que corresponderá a la temperatura alcanzada por mi tostador en cada segundo, utilizaremos el Reloj1, que será el componente que utilizaremos para ejecutará las acciones cada 1 segundo que nos petmitirán trazar el gráfico.
Reloj1 lo definiremos como activado en propiedades, pero las acciones que se desencadenarán en él estarán sujetas a una condición. Crearemos una variable global llamada Listo y la definiremos como falsa. Las acciones contenidas en Reloj1 sólo se ejecutarán en el caso de que Listo sea verdadero.
El botón Inicio (contenido en la disposición VisorTiempoTemp) pondrá la variable Listo como verdadera, y entonces el Reloj1 comenzará a ejecutar las acciones que pondrán a correr el cronómetro en pantalla, y a su vez, graficarán la temperatura de cada segundo en nuestro canvas. 



Para trazar líneas en el canvas, debemos utilizar el mismo bloque visto antes (call Grafico.DrawLine), en el cual recibe coordenadas "x1" e "y1", y "x2" e "y2" para trazar una línea.


Para designar estos valores, crearemos las siguientes variables globales:

  • Variable global Antes, se definirá como una lista vacía, pero al iniciar se le asignará como valor una lista de dos elementos numéricos, en los que ambos serán 0.

Esta variable corresponderá al valor de x1 e y1, es decir, los valores de la temperatura en el "segundo anterior al actual". Se definen ambos como cero al iniciar, pues si sólo se quedasen como una lista vacía, el el primer segundo (al no tener asignado ningún valor) el programa no los reconocería como coordenadas y nos arrojaría error.
  • Variable global Ahora, se define como una lista vacía. Corresponderá al valor de x2 e y2, valores de la temperatura en el segundo actual.
  • Variable global Timer, se definirá como valor numérico 0. Llevará un conteo de los segundos transcurridos.
  • Variable global Linea, se definirá como una lista vacía. Guardará un "historial" de los valores de la temperatura en cada uno de los segundos. Espero más adelante utilizarlos para trazar en el canvas los valores de tostados anteriores, y así usarlos de referencia en un tostado actual, pero no será parte de esta entrada.
El bloque que ejecutará Reloj1 será el siguiente:



El bloque Reloj1 ejecuta cada un segundo las acciones que en él se contienen.
Lo primero que realiza es comprobar si la global Listo es verdadera. Sólo en el caso de que así sea ejecutará las demás instrucciones en él contenidas
  • Pondrá a correr el Timer, sumando cada segundo +1.
  • Asignará a la variable Ahora una lista de dos elementos, compuesto el primero por el valor de Timer (es decir, del segundo actual), y el segundo valor será el de la temperatura.
    • Aquí realiza una operación, debido a que canvas cuenta los valores en el eje Y (que es el de la temperatura en nuestro gráfico) desde el extremo superior, y para nuestros fines queremos graficarlos desde abajo.
    • Se multiplica por -1 el valor de la temperatura (contenido en la variable global Temp) y entonces se resta a la altura del canvas, teniendo así, como un espejo, la posición que le correspondería a la temperatura contado desde abajo.
    • Estos dos valores (tiempo y temperatura actuales) servirán para luego ingresarlos a x2 e y2 del bloque Draw.Line que trazará cada una de las líneas del gráfico.
  • Se realiza una operación para llevar la cuenta en el cronómetro que está en la disposición VisorTiempoTemp:
    • El conteo del tiempo, se realiza en la variable Timer, y este lleva directamente el conteo de la cantidad de segundos, por lo que debemos transformar ese número en minutos y segundos para mostrarlos en pantalla:
      • Una condición verifica si en ese momento el valor visible en la etiqueta de texto Seg es igual a 59.
      • Si lo es, significa que en este segundo (que es el posterior al que se muestra en la etiqueta) se está pasando a un nuevo minuto. Por tanto, harán las siguientes acciones:
        • Se pondrá la etiqueta Seg en 0 y sumará +1 al valor contenido en la etiqueta Min.
      • Si el valor visible en la etiqueta Seg no es igual a 59, significará que aun no es tiempo de contar un nuevo minuto, por lo que sumará un segundo al visor.
        • Existe ahí dentro una nueva condición, que verifica la extensión de carácteres del visor, pues los primeros diez segundos (de 0 a 9) serán de sólo un carácter, por lo que por estética se corregirá, anteponiendo un cero a estos carácteres, de tal manera que se muestren como 00, 01, 02 y no cómo 0, 1, 2, etc.
  • En el bloque siguiente, se agrega a la variable Linea el par de coordendadas del segundo actual, de tal manera que así llevará un historial de toda la medición.
  • En los bloques siguientes se realizará el gráfico propiamente tal: aquí me tocó corregir dos cuestiones que me sucedieron al probar la apliación: 

    1. En el primer segundo no hay un valor para x1 y x2, y estos se asignaron como 0,0 al iniciar, por lo que el gráfico mostraba una gran caída desde el punto superior al valor del primer segundo. Opté por que el gráfico sólo se inicie a partir del tercer segundo, y esto se hizo con la condición de que las acciones del gráfico sólo se ejecuten una vez que la variable Timer sea mayor a 3.
    2. La termocupla de Arduino, genera a veces mediciones "fantasma": registra valores muy altos o muy bajos en ciertos segundos, que no son reales, y hacen que el gráfico quede muy "saltado", debiendo ser una curva: para esto programé una especie de estabilizador: el gráfico ignorará las variaciones de temperatura que sean superiores o inferiores a 5 grados, y tal es la labor de las variables variacion1 y variacion2, y la condición que las contiene.

  • El programa define el grosor y color de la línea a trazar y toma las coordenadas contenidas en las variables Antes (x1, y1) y Ahora (x2, y2), trazando una línea entre el valor medido en el segundo anterior y el valor medido en el segundo actual.
  • Finalmente, se reemplaza el valor de Antes con el de Ahora, y el ciclo vuelve a comenzar, trazando el gráfico segundo a segundo.
Con esto queda completa la aplicación, y el resultado debiera ser un gráfico como el siguiente:


Es posible que en próximas entradas desarrolle algunas otras funcionalidades que agregaré a esta aplicación, que principalmente estarán orientadas a guardar los valores del gráfico para poder utilizarlos de referencia en futuras mediciones, así como generar algunas alertas en el caso de que las mediciones traspasen algunos rangos.

miércoles, 1 de abril de 2020

Visualizar y procesar datos en AppInventor desde sensores Arduino (Primera Parte)




Inicié un proyecto en Arduino para controlar la temperatura en un tostador de café.

Para esto desarrollé un circuito con una placa Arduino que me permitió tomar la temperatura a tiempo real dentro del tostador, y enviarla vía bluetooth hasta un Tablet, donde la temperatura es registrada y graficada a través de una aplicación móvil, desarrollada a través de AppInventor.

Este proyecto cuenta entonces de dos etapas:
  1. La implementación de un circuito con Arduino y su programa, a través de los cuales tomaremos los datos de temperatura desde el tostador, las muestre en una pantalla física, y sean enviadas a través de Bluetooth.
  2. El desarrollo de una aplicación móvil para Android a través de AppInventor, que recibirá los datos desde el Arduino vía Bluetooth, las grafique y podamos procesarlos.

Primera Parte: circuito Arduino y Programa

Para esta primera etapa, utilicé los siguientes elementos:
  1. Una placa WAVGAT UNO R3 (es una Arduino Uno pirata de fabricación alternativa),
  2. Un módulo Bluetooth HC-05,
  3. Una pantalla LCD 12x6 y un módulo I2C,
  4. Una termocupla tipo K y un módulo Transmisor Max6675,
  5. Una mini protoboard de 400 puntos,
  6. Cables DuPont macho-macho.

Revisaremos la conexión y programación por separado de cada uno de los elementos al Arduino, para finalmente revisar conexión y programa de todo el conjunto.

A) Conexión de termocupla y módulo MAX6675

La termocupla tipo K que utilicé consta de una sonda sensor con una rosca y de dos cables de conexión, uno positivo y uno negativo. Esta termocupla permite medir temperaturas de entre -200°C a 1300 °C. Para poder utilizarla, se necesita conectarla a un módulo transmisor MAX6675, conectando los terminales de la termocupla a los correspondientes del módulo transmisor (+  y -). El módulo transmisor limita el rango de medición a entre 0ºC a 1023ºC.
Termocupla y módulo MAX6675
El módulo transmisor, MAX6675, debe a su vez ser conectado al Arduino.
El módulo cuenta con cinco entradas, dos de alimentación (GND y VCC) y tres de comunicación (SCK , CS y SO).


Montaje

La conexión que utilicé es la siguiente:

Módulo | Arduino
SO Pin 11
CS  Pin 12
SCK  Pin 13
VCC  5v
GND  GND

Las entradas de comunicación del módulo transmisor irán a los pines 11 (SO), 12 (CS) y 13 (SCK), mientras que las entradas de alimentación irán a 5v (VCC) y tierra (GND).

Programa

Para configurar el módulo transmisor MAX6675, será necesario incluir su librería. Para esto, en la interfaz de programación de Arduino nos dirigiremos a la pestaña Programa > Incluir Librería > Administrar Bibliotecas.
Aquí nos abrirá la ventana “Gestor de Librerías”.
En ella buscaremos “MAX6675 Library” y la instalaremos. Una vez instalada, nos aparecerá esta librería en el menú anterior “Incluir Librería”, donde al hacer clic se incorporará a nuestro código.

#include "max6675.h" //se incluye la librería para controlar el módulo MAX6675
float temperatura=0; //Se crea una variable flotante para almacenar la temperatura


//Se definen los pines a usar para conectar el modulo MAX6675

int ktcSO = 11;

int ktcCS = 12;

int ktcCLK = 13;

MAX6675 ktc(ktcCLK, ktcCS, ktcSO);



void setup() {

  //activa comunicacion serial.
  Serial.begin(9600);
}

void loop() {
   //Leer temperatura.
   temperatura=ktc.readCelsius();
   //temperatura=ktc.readFahrenheit();
   
   //Enviar dato de temperatura por el puerto serial.
   Serial.println(temperatura);
   //Pausa de medio segundo para repetir el proceso
   delay(500);
}

Con este programa se configura el módulo MAX6675 a través del cual realizaremos la lectura de temperatura desde la termocupla, y, por ahora, la temperatura es enviada a través del puerto serial. Puedes comprobar que funciona correctamente abriendo el monitor serie, en donde aparecerán cada 0,5 s. la temperatura medida.

B) Conexión de pantalla LCD y visualización de la temperatura en pantalla.

Para visualizar la temperatura obtenida en la termocupla en tiempo real, instalé una pantalla LCD de 16x2. En realidad con la aplicación móvil que luego veremos se hace prescindible, pero es útil contar con ella para algunas tareas, por lo que opté por mantenerla dentro del proyecto y darle utilidad autónoma al circuito construido en Arduino.
Este tipo de pantallas poseen 16 pines y su conexión se hace un poco complicada y aparatosa, pero con la ayuda de un módulo I2C, conectado a la pantalla obtenemos una entrada de sólo 4 pines, lo que simplifica enormemente la instalación y nos ahorra un montón de cables. En mi caso, la pantalla de LCD que compré venía con el módulo ya soldado, por lo que también me ahorré ese trabajo. En caso de que requieran profundizar en el funcionamiento del módulo I2C, les recomiendo ver este tutorial en el que me apoyé realizando mi proyecto:

Montaje

Con el módulo I2C ya soldado a la pantalla LCD únicamente debemos conectar los pines del módulo al Arduino. La conexión que realicé fue la siguiente:
Módulo | Arduino
GND = GND
VCC = 5v
SDA = A4
SCL = A5

Se debe tomar en consideración además que el brillo y contraste de la pantalla se puede regular girando la cruceta celeste que está en el módulo, por lo que si no se visualiza el texto correctamente, el problema pudiera solucionarse ahí. Existe también en el módulo I2C un jumper en el extremo contrario a los pines. Este jumper permite encender o apagar la luz de fondo de la pantalla. Hay una manera de realizar este apagado a través de sofware que podrás ver en el código de más abajo.


Programa

El control de este módulo I2C requiere la instalación de una librería que no se encuentra disponible en el gestor de librerías de Arduino, por lo que es necesario descargarla de una web externa: 

https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/

Deberás descargar la última versión de esta librería y descomprimirla y, luego, ponerla en reemplazo de la librería "LiquidCrystal" con que ya cuenta el ID de Arduino.
Para esto, puedes hacer click derecho en el ícono del ID de Arduino > Abrir Ubicación del Archivo. 
Ahí encontrarás la carpeta "libraries" y, dentro, la carpeta "LiquidCrystal". Quitamos esta carpeta y pegamos en su lugar la carpeta que acabamos de descargar. Con esto ya podremos utilizar la nueva librería en nuestro código. Esta librería nueva es una extensión de la anterior, por lo que las funciones contenidas en la anterior también podrán utilizarse.
Haremos uso también de la librería "Wire", pero esta ya se encuentra incorporada en el ID de Arduino, por lo que la llamaremos directamente en nuestro código.

El código es el siguiente:


#include <Wire.h>      // libreria de comunicacion por I2C
#include <LCD.h>      // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h>    // libreria para LCD por I2C
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
void setup() {
  lcd.setBacklightPin(3,POSITIVE);  // puerto P3 de PCF8574 como positivo
  lcd.setBacklight(HIGH);   // habilita iluminacion posterior de LCD
  lcd.begin(16, 2);     // 16 columnas por 2 lineas para LCD 1602A
  lcd.clear();      // limpia pantalla

  //activa comunicacion serial.
  Serial.begin(9600);
}
void loop() {
   lcd.setCursor(0, 0);
   lcd.print("Aquí mostraremos ");   // escribe texto
   lcd.setCursor(0, 2);
   lcd.print(la temperatura); //texto en segunda línea
}

Con este programa, de momento, podremos visualizar un mensaje a través de la pantalla LCD, donde posteriormente mostraremos en tiempo real la temperatura.


C) Conexión de módulo Bluetooth, configuración y envío de datos

Para la comunicación de los datos al dispositivo Android utilicé un módulo Bluetooth HC-05. Este módulo cuenta con 6 pines de salida, pero sólo utilizaremos 4.

Montaje

Módulo | Arduino
STATE = (Libre)
RXD = Pin 9 (funcionará como TX de Arduino)
TXD = Pin 8 (funcionará como RX de Arduino)
GND = GND
VCC = 5v
EN = (Libre)

Los pines TX y TXD, y RX y RXD corresponden a pines de transmisión y recepción, de Arduino y del Módulo, respectivamente.
Arduino ya cuenta con pines asignados como TX y RX, sin embargo, utilizaremos los pines 9 y 8 con esa funcionalidad, lo que se hará a través de una librería del ID de Arduino.
Así entonces, es de notar que las conexiones de comunicación están cruzadas entre Arduino y el Módulo, de tal manera que el pin TXD del módulo va al RX de Arduino y viceversa, el pin TX de Arduino irá al RXD del módulo.

Configuración

Previo a programar nuestro módulo, es necesario configurarlo, para ello debemos ingresar al modo de configuración del módulo.
Este modo se activa presionando un pequeño pulsador durante los primeros 5 segundos de energizado el módulo, por lo que deberás mantener pulsado este botón antes de conectar la energía del Arduino o del pin VCC del módulo.
Un parpadeo más lento del led del módulo nos indica que ingresó a modo configuración.
Ya en este modo, podemos soltar el pulsador e ingresamos al ID de Arduino, donde abriremos el Monitor Serie.
En él, el módulo Bluetooth será configurado a través de comandos AT:

AT+NAME Nombre del dispositivo
AT+PSWD Contraseña (PIN)
AT+UART Parámetros de comunicación
AT+ROLE Rol del dispositivo
0 = esclavo (slave)
1 = maestro (master)
AT+ORGL Restaura a valores de fábrica
AT+RESET Vuelve a modo usuario

Configuraremos el módulo escribiendo los siguientes comandos en el monitor serie:

  1. Restauraremos la configuración a valores de fábrica:
AT+ORGL
2. Asignaremos un nombre al dispositivo, en este caso lo llamé "miBT":

AT+NAME=miBT
3. Podemos comprobar el cambio realizado consultando el nombre del dispositivo con el siguiente comando:
AT+NAME?
El módulo debería respondernos indicando a través del monitor serie el nombre que asignamos previamente.

4. Asignaremos un pin o contraseña. En este caso, asigné el clásico "1234":
AT+PSWD=1234
Puedes comprobar el cambio de la misma manera que en el ejemplo anterior, esta vez con el comando AT+PSWD?

5. Asignaremos el rol de esclavo (slave) al dispositivo:
AT+ROLE=0
6. Asignaremos los parámetros de comunicación del dispositivo. Lo que nos interesa aquí es la velocidad de comunicación. El dispositivo Bluetooth funciona a 38400 baudios, velocidad bastante mayor a diferencia de la mayoría de los componentes Arduino que funcionan a 9600, por lo que tendremos que configurarlo luego también en el programa, como se indicará. Para esto ejecutaremos el siguiente comando:
AT+UART=38400,0,0
7. Finalmente, volvemos al modo usuario:
AT+RESET
Tras cada uno de los cambios realizados, el módulo debiera habernos respondido "OK" en el monitor serial.

El módulo conectado a Arduino y ya en modo usuario mostrará un parpadeo rápido. Esta modalidad permite al módulo realizar su comunicación y uso normal.

Programa

#include <SoftwareSerial.h>     //librería para utlizar pines como tx y rx para bluetooth
SoftwareSerial miBT(8, 9);    //define los pines que se utilizarán como rx y tx para bluetooth, creando un objeto llamado miBT
void setup() {
 //activa comunicacion serial.
  Serial.begin(9600); // configura en general la velocidad de comunicación
  miBT.begin(38400); // configura velocidad de módulo bluetooth
}
void loop() {
   miBT.println("Mensaje"); //aquí podremos enviar la temperatura registrada
 
   //Pausa de medio segundo para repetir el proceso
   delay(500);
}
Es muy importante aquí la utilización de la librería SoftwareSerial que nos permitirá utilizar los pines 8 y 9 como RX y TX para lograr la comunicación que anteriormente se señaló. Así también, esta librería nos permite crear un objeto, aquí denominado "miBT", el cual luego con la función .begin nos permitirá configurar el módulo a una velocidad de 38400 baudios, distinta a los demás componentes del Arduino que se mantendrán a 9600 baudios.

Personalmente en este proyecto se me presentó problema, debido a un error: en un principio conecté el módulo de Bluetooth directamente a los pines TX y RX de Arduino, y no configuré la velocidad del módulo de forma separada, manteniendo la configuración general de 9600 baudios. Al transmitir los datos al dispositivo Android, éste los recibía, pero en un formato desconocido, apareciéndome únicamente caracteres de interrogación (�������) en pantalla del dispositivo que los recibía. Al configurar correctamente la velocidad en el programa con ayuda de la librería SoftwareSerial, el problema se solucionó.

D) Conexión conjunta del circuito y programa

Hasta aquí hemos conectado y programado cada módulo por separado. Veremos ahora la conexión y programación final del proyecto, haciendo funcionar conjuntamente todos los componentes, a fin de tomar la temperatura, mostrarla en pantalla y enviarla vía Bluetooth.

Montaje

Para la conexión conjunta de todos los componentes he utilizado una mini protoboard de 400 puntos, en la que he montado el módulo HC05, el módulo MAX6675 al que va conectada la termocupla, y la pantalla LCD la he dejado con una extensión en la que sus pines de comunicación van directamente al Arduino.
La conexión de los pines no ha variado en nada a lo señalado precedentemente. La protoboard sólo se ha utilizado a fin de ordenar relativamente los cables.

Programa

En el programa final, básicamente se ha incluido todo lo explicado anteriormente y se ha compartido el valor de la temperatura entregada por la termocupla a través de la variable flotante temperatura. El código utilizado:
#include <SoftwareSerial.h>     //librería para utlizar pines como tx y rx para bluetooth
#include "max6675.h"
#include <Wire.h>      // libreria de comunicacion por I2C
#include <LCD.h>      // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h>    // libreria para LCD por I2C
SoftwareSerial miBT(8, 9);    //define los pines que se utilizarán como rx y tx para bluetooth
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
float temperatura=0; //Se crea una variable flotante para almacenar la temperatura
//Se definen los pines a usar para conectar el modulo MAX6675
int ktcSO = 11;
int ktcCS = 12;
int ktcCLK = 13;
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

void setup() {
  lcd.setBacklightPin(3,POSITIVE);  // puerto P3 de PCF8574 como positivo
  lcd.setBacklight(HIGH);   // habilita iluminacion posterior de LCD
  lcd.begin(16, 2);     // 16 columnas por 2 lineas para LCD 1602A
  lcd.clear();      // limpia pantalla

  //activa comunicacion serial.
  Serial.begin(9600);
  miBT.begin(38400); // configura velocidad de módulo bluetooth
  delay(500);

}
void loop() {
   //Leer temperatura.
   temperatura=ktc.readCelsius();

   //int temp = temperatura;
   Serial.println(temperatura);
   lcd.setCursor(0, 0);
   lcd.print("Temperatura: ");   // escribe texto
   lcd.setCursor(0, 2); // ubica el cursor para escribir en la segunda línea
   lcd.print(temperatura); // toma la variable temperatura y la muestra en la pantalla LCD
   lcd.print(" C");
   miBT.println(temperatura); //toma la variable temperatura y envía su valor por Bluetooth
 
   //Pausa de medio segundo para repetir el proceso
   delay(500);

}

Aquí queda concluida la primera etapa de este proyecto. 
En la segunda parte se desarrollará una aplicación móvil a través de AppInventor, comprendiendo principalmente:
  1. Recepción de datos a través de Bluetooth en un dispositivo Android.
  2. Visualización de datos a través de un gráfico.
  3. Otros procesamientos de datos.