Menu
in , ,

Termómetro Digital Remoto (Domótica)

¿Qué temperatura habrá en el cuarto de los niños? ¿Arrancará el coche con este frío? ¿Está fresca esta botella de vino? ¿Este refrigerador funciona bien? ¿Qué temperatura tiene el invernadero? Las preguntas que nos hacemos a diario y que involucran a la temperatura llegan a ser incontables. Es muy económico y sencillo comprar un termómetro digital y llevarlo contigo donde vayas para saber qué temperatura hace. Pero cuando la temperatura a controlar se encuentra a más de mil metros de donde tú estás, la situación se pone más compleja. Si no puedes estar en el lugar ni en el momento de la medición, la solución está muy cerca de ti. Ya has aprendido a construir el instrumento de medición de calor y también hemos visto todo acerca de las redes RS485. Llegó la hora de ensamblar las ideas y poner en marcha el sistema remoto de control de temperatura que necesitas.

Según Wikipedia, el término Domótica proviene de la unión de las palabras domus (que significa casa en latín) y tica (de automática, palabra en griego, que significa “que funciona por sí sola”). Además agrega que se entiende por Domótica al conjunto de sistemas capaces de automatizar una vivienda, aportando servicios de gestión energética, seguridad, bienestar y comunicación, y que pueden estar integrados por medio de redes interiores y exteriores de comunicación, cableadas o inalámbricas, y cuyo control goza de cierta ubicuidad, desde dentro y fuera del hogar. Se podría definir como la integración de la tecnología en el diseño inteligente de un recinto.

Automatizar una casa y hacer que funcione por sí sola de manera inteligente puede interpretarse de innumerables maneras. No existe un “piso” que determine de manera fehaciente dónde comienza el concepto de inteligencia de un sistema, es decir, cuál sería la funcionalidad mínima que debería tener. Por lo tanto, si este fundamento no está definido, mucho menos lo estará la forma en que deba hacerse. En función de esto debes tener en cuenta que es el ojo del observador, y no un estándar definido, el que cuantifica la magnitud de automación de un sistema. Un ejemplo claro de esto es Manolo, mi vecino, que se imagina enormes y poderosos ordenadores que hacen funcionar un sencillo interruptor crepuscular.

Desde X-10 o RS485 hasta ZigBee, pasando por USB, WiFi o FireWire, puedes elegir a tu conveniencia la arquitectura y la tecnología de la capa física que utilizarás en la red de tu casa automatizada. Puedes definir la capa Física con los medios que tengas a tu alcance o según tus preferencias; también puedes hacerlo con la capa de Comunicación y de Aplicación (las tres categorías comprendidas dentro del modelo de referencia de la OSI). Todos los sistemas tienen virtudes y desventajas, y si lo que deseas es aprender a descubrir esta fascinante rama de la tecnología, tienes una Web llena de ejemplos y datos técnicos. En este artículo aprovecharás el termómetro I2C que ya has conocido, y a través del estándar RS485 lo incorporarás a lo que podrá considerarse tu primera experiencia en el mundo de la Domótica. Luego, si deseas, puedes comprar (a miles de euros) un sistema completo de automatización del hogar, o puedes optar por seguir disfrutando del que ya tienes. Lo importante es que con este artículo aprenderás un poquito más acerca de lo que ya eres capaz de construir tú mismo.

Completando el circuito del Termómetro I2C
Si comparas la imagen del circuito que te mostramos aquí con la del Termómetro por I2C ya publicado, notarás el agregado del MAX487 que, como te explicamos antes, es compatible pin a pin con el MAX485 y con el económico SN75176, que es el que utilizaremos en el proyecto de este artículo.

No profundizaremos en la explicación del funcionamiento del programa, ni del estándar RS485, sino que te invitamos a que leas sus respectivos artículos para ayudarte a comprender acerca de lo que aquí se habla y explica.

Agregados al programa del PIC
Hasta ahora habíamos utilizado 37 líneas en el programa inicial del termómetro I2C que cargamos en el microcontrolador. Es decir, aún disponemos de 13 líneas para agregar al firmware y permitir la incorporación de nuestro termómetro a una red RS485.

Lo primero que tenemos que agregar son las declaraciones de los parámetros de trabajo de una de las secciones internas del microcontrolador conocida con el nombre USART (acrónimo de Universal Synchronous/Asynchronous Receiver Transmitter, cuyo equivalente en castellano sería Transmisor y Receptor Sincrónico/Asincrónico Universal). Se trata de un periférico para la transmisión de datos en formato serie, que utiliza técnicas de transmisión sincrónica o asincrónica, según se configure el periférico. Nosotros utilizaremos el modo asincrónico, a una velocidad de 38400 bps.
También vamos a sumar al listado del firmware una nueva variable que llamaremos ACCIÓN (debido a su desempeño dentro de la comunicación entre el ordenador y el termómetro).

Escuchar: uno de los pilares del funcionamiento de la red
Una vez que el firmware haya ejecutado la rutina de medición de temperatura y la haya mostrado en el display, procederemos a “escuchar” durante medio segundo la posible actividad existente en la red RS485. Si durante ese lapso de tiempo “nadie nos llama”, la rutina reiniciará el ciclo. Esta compleja e inteligente operación se realiza en Protón Lite mediante una sola línea de código:

A pesar de que la ayuda (Help) del programa es muy buena, repasemos brevemente la instrucción, ya que es una de las bases del buen funcionamiento de la red: la instrucción HSERIN indica que vamos a recepcionar datos seriales con la USART del microcontrolador, en los pines asignados para tal fin. 500 son los milisegundos que esperará la USART en estado de recepción antes de continuar con su trabajo y abandonar la instrucción. Es decir, en este punto el programa se detiene y “escucha” durante medio segundo. Si no recepciona ningún dato útil en ese periodo de tiempo, saltará (cual si fuese una instrucción GOTO) hacia la etiqueta que tiene a continuación del tiempo de espera, que en nuestro caso es 500 milisegundos. La etiqueta o label es INICIO, por lo que saltará a reiniciar el ciclo.

Si, en cambio, durante ese lapso de tiempo recibe algún dato útil, lo cargará en la variable ACCIÓN en forma de dato decimal mediante el fragmento de código [DEC ACCION]. Si esto ocurre, el programa no retornará a la etiqueta INICIO sino que seguirá hacia la siguiente línea para procesar el dato recibido y almacenado en la variable ACCIÓN. En síntesis, el programa entra en un intervalo de escucha durante un tiempo determinado. Si no escucha nada, reinicia el ciclo del programa. Si en cambio escucha algo útil, lo almacena en una variable y sigue su curso para procesar el dato ingresado.

Una vez obtenido el dato y cargado éste en la variable, nos fijamos si es nuestro “nombre”, es decir, controlamos si el ordenador nos está llamando a nosotros o si está hablando con otros terminales conectados a la red. En nuestro caso le asignaremos a nuestro termómetro el nombre “89”. ¿Por qué 89? Por azar, porque te dará suerte en la Lotería, y porque es cualquier número comprendido dentro de un BYTE (0-255). Con una sencilla instrucción de condicionamiento IF – THEN comprobaremos el valor almacenado en la variable, y si es nuestro nombre, continuaremos con la siguiente línea del programa. Si no es nuestro nombre, haremos caso omiso al valor leído y retornaremos a reiniciar el ciclo de lectura de temperatura con la instrucción GOTO INICIO. De la real comprensión y ejecución de las instrucciones detalladas dependerá el buen funcionamiento de la red.
Si el dato recibido coincide con nuestro nombre sabremos que tenemos un trabajo por hacer: transmitirle al ordenador la información que tenemos almacenada en las variables que guardan los datos de temperatura leída. Para este proceso debemos seguir una secuencia muy elemental que vemos a continuación:

En esta etapa final, el primer paso es vaciar la variable ACCIÓN para que, cuando se repita el ciclo de instrucciones, esté vacía y no quede cargada con el dato residual de la llamada a nuestra unidad. Si esto sucediera, el microcontrolador quedaría enviando, a cada paso del programa por ese sector de instrucciones, la información allí almacenada sin que el ordenador se lo haya pedido. Esto provocaría sin dudas una colisión permanente de datos que dejaría a la red inutilizada. Luego, activamos el SN75176 para transmisión, ponemos en estado lógico alto el pin correspondiente del microcontrolador, según el esquema (PORTB 0), y esperamos un lapso de tiempo de 100 milisegundos hasta que los circuitos internos del SN75176 efectivamente entren en modo transmisión. Debes tener en cuenta que si no esperas este tiempo, el microcontrolador estará enviando datos mientras el transceptor (el SN75176) aún se encuentra a la escucha o tornando su funcionamiento hacia el modo de transmisión, es decir, aún cuando se encuentra en una fase indeterminada de funcionamiento. Una vez pasado este tiempo, el ordenador estará esperando los datos que le enviemos. Atención en este punto: “nadie transmite cuando se le antoja”. Los dispositivos conectados a la red transmitirán sólo cuando el ordenador les indique hacerlo. Mientras tanto estarán haciendo sus respectivos procesos: esperando un llamado o estudiando si fue a uno de ellos a quien el ordenador llamó. Por lo tanto, la red estará libre de intercambio de datos, y el ordenador aguardará la llegada de nuestros datos (porque fue a nosotros a quienes llamó).

Para transmitir los datos utilizamos la instrucción HSEROUT de una manera muy simple: transmitiendo BYTE a BYTE los datos que se encuentran entre comas:

HSEROUT [DEC C, 44, F]

La instrucción transmite los valores de las variables en forma decimal gracias a la utilización del modificador DEC. Cuando éste no es utilizado, se transmite el símbolo o caracter ASCII que corresponde a dicho número. El 44 es la coma (símbolo gramatical).

La variable F se transmite de igual forma e indica si la información decimal de temperatura a mostrar termina en cero o en cinco. Una vez transmitidos todos los datos, el sistema vuelve al estado de recepción colocando en estado bajo al PORTB 0 y esperando 10 milisegundos a que el SN75176 haga efectivo el estado de recepción. Luego de esta acción final, el ciclo se reinicia y vuelve a repetirse hasta desconectar la energía al sistema.

Programa a utilizar en el ordenador
Al igual que con el software empleado para desarrollar el firmware del microcontrolador, la aplicación que hará funcionar nuestra red puede realizarse con cualquiera de las múltiples opciones gratuitas que se encuentran en la Web. En nuestro caso, y manteniendo una línea de coherencia (continuar trabajando en BASIC), hemos optado por utilizar Visual Basic 6 Working Model. Si tienes la versión completa de este software, podrás crear tus propios archivos ejecutables (.EXE) para distribuir y hasta comercializar tus proyectos. La apariencia final que puede adquirir la aplicación dependerá del gusto personal de cada realizador.

Si decides incorporar varios termómetros al bus I2C o a la red RS485, tal vez necesites varias presentaciones simultáneas. Nosotros te mostramos el ejemplo para una sola medición, con la inclusión de una sencilla indicación en dígitos de la temperatura en formato de texto. Para una mejor impresión visual colocamos inmediatamente arriba un gráfico que varía en función del tiempo de medición transcurrido y que muestra la evolución de la temperatura a través de los minutos y las horas. Solicitando datos cada 1 minuto, la visualización del gráfico se torna más amplia y no se pierde su derrotero tan rápidamente.

El ejemplo propuesto en la imagen muestra de manera clara varias etiquetas con texto fijo, un Picture Box donde se graficará la evolución de las mediciones, y un espacio para la representación numérica del último dato de temperatura leído. Se trata de un termómetro ideal para un criadero de animales, donde la temperatura nunca será superior a 65°C ni menor a 0°C. También es una buena opción para el monitoreo inteligente de la temperatura interior de nuestra casa o de alguna dependencia específica dentro de ella.

Otra ampliación muy útil sería colocar dentro del Picture Box (o debajo de él) el lapso de tiempo que ocupa la línea dibujada por el registro obtenido. De esta forma podemos informarnos de la temperatura que había en el lugar una o dos horas antes. El método comentado ahorraría la utilización de un RTC (DS1307 o similar) y muchas líneas de código.

Al programa que hemos desarrollado a modo de ejemplo puedes descargarlo desde aquí. La aplicación se basa en solicitar (mediante una única instrucción formada por un byte) el valor de temperatura que esté registrando el sistema ubicado en la locación remota. Este “trabajo” se realiza periódicamente cada un intervalo de tiempo que tú predefines al desarrollar la aplicación funcional en el ordenador.

La transmisión de datos dentro del bus se realizará a 38400 bps. Cada un minuto (60000 milisegundos), el puerto serie le enviará al termómetro (a través de la interfaz RS232-RS485) la instrucción para que éste le responda con la información esperada. Cada un minuto, el software colocará en estado bajo al terminal RTS de la salida RS232, para que el MAX232 lo transforme en un valor TTL de estado alto y para que, de esta forma, se active la transmisión del MAX485 (SN75176 en nuestro caso). Una vez realizada esta operación de colocar la interfaz en modo transmisión, se procederá a transmitir la instrucción que recibirá el módulo o el terminal en el lugar donde se encuentre instalado. La información enviada será un solo byte, al que enviaremos en 20 oportunidades para asegurarnos de que sea escuchado en el destino deseado. Todo lo explicado se efectiviza en VB6 con las instrucciones mostradas en el siguiente gráfico:

Cuando Proton+ LITE recibe la información enviada, ésta debe estar seguida de un carácter “no numérico”. Es decir, si deseamos enviar desde el ordenador un valor comprendido entre 0 y 255, éste debe ir acompañado inmediatamente después de un caracter ASCII no numérico. Si enviamos la información 34 sin otro dato adicional, el firmware del microcontrolador quedará esperando indefinidamente el final de la instrucción con un caracter “no numérico” cualquiera. Un envío correcto sería 34X, 34B o 34$, etc. Para nuestra aplicación decidimos utilizar 89# como instrucción maestra que le indicará al microcontrolador que le estamos solicitando el dato de temperatura. (Observa la imagen anterior para ayudarte a comprender)
Este dato se cargará en la variable “buferentrada” y luego será utilizado por el programa para visualizarlo tanto en forma numérica como en forma gráfica (gráfico generado dentro del Picture Box). Si además tuviéramos otro termómetro, podríamos nombrarlo y otorgarle la instrucción 78; o 56=. Pero cualquiera sea la instrucción enviada en forma de byte, deberá estar terminada por un caracter “no numérico” para ser interpretada por el firmware empleado en el microcontrolador.
Esto ejemplifica el orden que puede llevar un protocolo de comunicación RS485:

  • Se abre el bus y se pone la interfaz en transmisión, colocando el terminal RTS del COM1 en estado bajo.
  • Se transmite el byte, seguido de un caracter no numérico: 89# (en reiteradas oportunidades para asegurar su llegada al módulo de destino).
  • Se pasa el bus a modo recepción y se espera a que el módulo 89 responda con la información almacenada.
  • Si hubiese más de un módulo “colgado” del bus, éstos serían interrogados (cuando dispongamos ) dentro del programa más apropiado.

De esta forma, y organizando los tiempos de interrogación y respuesta de los módulos conectados al bus, nos aseguramos de que nunca habrá colisión de datos, ni errores de transmisión o recepción.

En el video puedes ver en marcha el programa, la interfaz, y el termómetro armado sobre un protoboard. La consulta de datos se realiza en el video cada 100 milisegundos para poder mostrar de manera rápida cómo se ven los cambios de temperatura, tanto en el gráfico como en el texto.

Para finalizar, podemos agregar que la aplicación mostrada es la implementación más elemental de un protocolo de comunicación. Existen tantos métodos como cantidad de información que se quiera intercambiar a través del bus. Otro método podría incluir la dirección o nombre del módulo interrogado para que el mismo responda indicándole al ordenador que se encuentra listo para recibir una instrucción (para los casos en que el terminal pueda recibir varias instrucciones diferentes).

Si dispones de las versiones completas de los programas utilizados, podrás ampliar las prestaciones del sistema consultando al módulo remoto acerca del estado en que se encuentra el relé RL1 (activado o no) para saber si la ventilación (o calefacción) se ha puesto en funcionamiento, por ejemplo.
Por supuesto que abordaremos la mayor cantidad de opciones posibles en futuras aplicaciones para que puedas ver y experimentar el intercambio de datos a través del bus RS485. Nuestro próximo objetivo será trabajar con Audio: potenciómetros digitales y preamplificadores con controles de tono, ambos manejados por I2C y conectados vía RS485 para lograr una súper-consola de audio que jamás hayas soñado. ¿Te interesa? ¡Pues, te esperamos!

Escrito por Mario

Leave a Reply