Sensor de humedad y temperatura con Arduino. Cuarta parte: Gadget para Windows 7

Este artículo es una continuación de los siguientes:

Utilizando la base desarrollada en artículos anteriores, se construyó un gadget para el escritorio de Windows 7 que nos muestra información sobre la temperatura y la humedad y cuyo aspecto se puede ver en la figura siguiente.

Gadget para Windows 7 para medición de Humedad y Temperatura con Arduino y sensor SHT15

Además del manifiesto que le define, el gadget está compuesto de Html/CSS, JavaScript e imágenes que definen su background. El siguiente artículo que explica como desarrollar un gadget para Windows resultó muy útil.

Toda la lógica ha sido implementada en JavaScript utilizando Jquery y las APIs de visualización de Google.

El gadget establece un timer que ejecutará una medición de forma periódica cada minuto utilizando ajax. Si la petición tiene éxito se ejecutará la función measureReceived.

petición de medicion de temperatura y humedad ajax

En la función measureReceived, ejecutada después de cada medición, se actualizarán los valores de las medidas, así como del gráfico que representa su historia. También se calcularán y actualizarán los estadísticos valor medio, mínimo y máximo de la humedad y temperatura.

El código fuente se adjunta al artículo.

Sensor de humedad y temperatura con Arduino. Tercera parte: HttpRelay.

Este artículo es una continuación de los siguientes:

El acceso a través del puerto serie resulta inconveniente para el propósito de crear un gadget para el escritorio de Windows 7, por lo que se hace necesario escribir un pequeño programa que nos permita trasladar peticiones HTTP convencionales a peticiones a través del puerto serie. Se ha escrito dicho programa y se ha denominado HttpRelay.

Diagrama de bloques de HttpRelay

Dicho programa se queda residente como un icono en la barra de notificaciones encargándose de trasladar las peticiones HTTP GET a comandos a través del puerto serie que se haya configurado. De esta forma, podemos comunicarnos con el Arduino a través de HTTP.

pantalla principal del programa HttpRelay

El programa se configura a través de un archivo xml que indica la URI en la que se debe escuchar y el puerto serie COM al que se delegará la respuesta, así como, la velocidad en bits por segundo a la que se debe utilizar el puerto.

configuración xml del programa HttpRelay

El programa traslada al puerto serie el parámetro de query llamado ‘q’ por lo que si deseamos obtener mediciones de temperatura y humedad con la configuración anterior, utilizando el comando ‘g’ definido en el firmware, deberemos utilizar la URL: ‘http://localhost:8080/?q=g’

image

El programa HttpRelay, escrito en c#, utiliza la clase HttpListener para realizar la escucha en una URL determinada. Su código fuente se adjunta en este artículo.

Sensor de humedad y temperatura con Arduino. Segunda parte: firmware.

En un artículo anterior se describió el hardware. En este artículo nos centraremos en el programa que se ejecutará en el Arduino, también llamado firmware.

El programa de Arduino que utilizaremos para obtener la medición de temperatura y humedad del sensor SHT15 proporcionará un sencillo interface a través del puerto serie. Dicho programa está basado en el código de Hobby robotics, aunque ha sido fuertemente modificado para adaptarse a nuestras necesidades.

En el principio del programa se definen las constantes que representan a cada uno de los comandos que utilizaremos del sensor, así como a los pines a los que están conectadas las líneas DATA y SCK del sensor. La función shiftIn nos permite leer un numero arbitrario de bits del sensor.

Sensor de humedad y temperatura con arduino y SHT15 - constantes y helpers

La función sendCommand contiene toda la lógica que envía un comando al sensor SHT15 siguiendo el protocolo descrito en el artículo anterior.

Sensor de humedad y temperatura con arduino y SHT15 - envío de comandos

Después de enviar un comando es necesario esperar unas cuantas decenas de milisegundos a que se realice la medida. Una vez que la medida se ha completado, el sensor avisará poniendo la línea DATA a 0. El esperar el resultado de la medida, es el objetivo de la siguiente función.

Sensor de humedad y temperatura con arduino y SHT15 - espera de resultados

Por último, la función getResult obtiene el resultado de la medida del sensor siguiendo el protocolo descrito en el artículo anterior. Dicha medida se obtiene como un entero de 16 bits que será necesario procesar para obtener la medida en las unidades de humedad y temperatura.

Sensor de humedad y temperatura con arduino y SHT15 - lectura de resultados

Ese es el objetivo de las siguientes funciones printTemperature y printHumidity; envían el comando correspondiente al sensor obteniendo el resultado como un entero de 16 bits, convierten dicho entero a un valor de temperatura en grados centígrados y a un valor de humedad relativa, imprimiendo dichos valores a través del puerto serie.

Sensor de humedad y temperatura con arduino y SHT15 - impresión de resultados

La última parte del sketch de arduino es la configuración que simplemente establecerá el pin SCK como de salida y configurará el puerto serie a 9600 bps.

Sensor de humedad y temperatura con arduino y SHT15 - configuración

y el bucle principal que define una serie de comandos para obtener la medición de la temperatura y la humedad. El comando que utilizaremos en artículos posteriores es el comando ‘g’. Al recibir una ‘g’ en ASCII por el puerto serie, el programa realizara mediciones de la temperatura y de la humedad y las imprimirá por el puerto serie separadas por el carácter ‘|’ y finalizadas por ‘\r\n’.

Sensor de humedad y temperatura con arduino y SHT15 - bucle principal

La implementación de dicho programa en el Arduino ya nos permite obtener los valores de temperatura y humedad utilizando un programa de terminal tal y como se muestra en la figura siguiente.

Sensor de humedad y temperatura con arduino y SHT15 - resultados por consola serie

En un artículo posterior utilizaremos esta base para construir un gadget para el escritorio de Windows 7.

Sensor de humedad y temperatura con Arduino. Primera parte: El hardware.

Utilizamos un sensor de temperatura y humedad SHT15 y un Arduino. El interface de datos con el sensor requiere únicamente de 2 pines, un pin de reloj (SCK) y un pin de datos (DATA).

esquemático arduino con SHT15

El interface con el sensor consiste de lógica estática y por lo tanto no existe una frecuencia de reloj mínima. El pin de datos triestado es utilizado para escribir y leer datos del sensor. Los datos se validan en el pulso de subida del reloj y deben permanecer estables mientras el reloj esté en estado alto.

En el datasheet del sensor se muestran las frecuencias máximas de operación que soporta el sensor, sin embargo, los comandos para modificar los pins del arduino imponen la suficiente sobrecarga para que en este caso no nos tengamos que preocupar de sobrepasarlas, y por lo tanto, no es necesario introducir ningún retraso a la hora de modificar los pins del interface para operar con el sensor.

foto de la conexión sensor SHT15 a Arduino

En las siguientes figuras se muestra una traza del comando para medir la temperatura. El trazo superior de la figura representa el reloj (SCK) y el inferior los datos (DATA). El comando para medir la humedad es muy parecido por lo que solo se ilustrará el de temperatura.

La secuencia para enviar un comando consiste en poner DATA a 0 mientras SCK es 1, seguido por un pulso de reloj de 1 a 0 y de 0 a 1 para a continuación poner de nuevo DATA a 1 con SCK aún a 1.

Posteriormente a la secuencia de inicio de comando se envían 3 bits de dirección (que deben ser 000) y 5 bits de comando, que en el caso del comando para medir la temperatura son 00011.

El sensor indica la correcta recepción del comando estableciendo DATA a 0 durante la parte activa del siguiente pulso del reloj y liberando la línea en la caída de dicho pulso lo cual hace que DATA quede a 1 después del noveno pulso de reloj. A partir de ese momento el sensor realiza la medida, que tardara unas decenas de milisegundos. El sensor avisará de que ha completado la medida estableciendo DATA a 0.

Traza lógica del envio de un comando al sensor de temperatura y humedad SHT15

En el momento que DATA vale 0 podemos proceder a leer los datos de la medida realizada por el sensor.

traza lógica de la lectura de datos de temperatura sensor SHT15 con arduino

Se lee el primer byte, que en el caso anterior corresponde a 00011000 = 0×18 y se envía un ACK poniendo la línea de datos a cero durante el siguiente pulso de reloj. A continuación se lee el segundo byte correspondiente a 00011010 = 0x1A y en este caso no enviamos un ACK debido a que no vamos a utilizar el CRC que nos podría enviar el sensor como un tercer byte si le diéramos un ACK. El mantener DATA activo después de leer el segundo byte indica al sensor que hemos terminado y le permite pasar a modo SLEEP.

Después de leer el valor hexadecimal 0x181A que equivale a 6170 obtenemos la temperatura mediante la siguiente fórmula: T= –40.1 + 6170 * 0.01 = 21.6ºC

Efecto Sepia con WPF 3.5 SP1

Una de las novedades introducidas en el service pack 1 de la versión 3.5 de Windows Presentation Foundation es la posibilidad de utilizar ‘Pixel shaders’ personalizados como efectos para cualquier componente visual.

En los comienzos de la fotografía, se aplicaba el tonado sepia a las fotografías en blanco y negro, debido a que dicho proceso hacía más duraderas a las fotografía, y es por ello que muchas de las fotografías antiguas tienen ese característico aspecto basado en tonos marrones.

El siguiente fragmento de código define un ‘pixel shader’, el cual al aplicarle como efecto a cualquier elemento Visual de una aplicación WPF, le dará esa característica tonalidad sepia.

pixel shader para el efecto sepia

La variable lumaCoeffs es un vector cuyo producto escalar con el vector que define los valores RGB en una pixel de la imagen, nos da el valor de luminancia que corresponde a ese punto. El valor de luminancia se utiliza para posteriormente obtener el color en tono sepia correspondiente a ese valor utilizando la función lerp, que se utiliza para hacer una interpolación lineal entre los dos colores que definen los ‘extremos’ de la gama de tonalidades sepia.

Por el momento, no podemos utilizar el efecto directamente desde Visual Studio y se necesita compilarle primero utilizando la utilidad fxc del SDK de DirectX. Si hemos guardado el código de la figura anterior en un fichero con el nombre sepia.fx podemos compilarle a un archivo sepia.ps que se podrá utilizar directamente desde WPF de la siguiente manera:

  • fxc  /T ps_2_0 /E main /Fosepia.ps sepia.fx

Una vez compilado el efecto podemos utilizarlo derivando una clase de ShaderEffect llamada, por ejemplo, SepiaEffect, y asignado el archivo sepia.ps a su propiedad PixelShader. Dicho archivo, habrá tenido que ser incluido previamente en el proyecto de Visual Studio y se deberá haber establecido su ‘build action’ como resource.

Para más detalles consultar el código fuente que acompaña a este artículo, que utiliza el efecto tal y como se muestra en la siguiente figura.

Demo del efecto sepia

Referencia:

El efecto mariposa

Según cuenta Edward Norton Lorenz en su libro, la esencia del caos, el origen de esta expresión como símbolo del caos es un poco oscuro. Parece haber surgido a raíz de un artículo que presentó en Washington en 1972 titulado “¿Puede el aleteo de las alas de una mariposa en Brasil generar un tornado en Texas?”.

En dicho artículo, Lorenz evitó responder esta cuestión, pero apuntó que si el aleteo de una mariposa pudiera generar un tornado que de otra forma no se hubiera producido, también podría prevenir un tornado que de otra forma se hubiera formado.

Un probable origen de la expresión es debido a una peculiaridad del primer sistema caótico que Lorenz estudió en detalle, conocido como atractor extraño de Lorenz o atractor de Lorenz, cuya representación se muestra en el siguiente vídeo.

Sin embargo, un relato corto de Roy Bradbury, “Un sonido  de trueno”, escrito mucho antes de la reunión de Washington, narra la historia de como debido a la extinción de una mariposa prehistórica se cambia el resultado de unas elecciones presidenciales en la actualidad.

Se puede encontrar el código fuente que generó el vídeo de este artículo adjunto, el cual esta basado en uno de los ejemplos que se proporcionan con XNA Game studio 2.0.

Código fuente de el efecto mariposa

El juego de la vida

Resulta interesante observar como partiendo de un estado inicial y de unas reglas sencillas, el juego de la vida evoluciona exhibiendo complejos patrones.

Ejemplo de autómata celular, concebido por John Horton Conway y popularizado por Martin Gardner en un artículo de Scientific American aparecido en 1970, el juego de la vida, desde su aparición, ha sido plasmado por los programadores en multitud de sistemas.

Utilizando la plataforma XNA y tomando como base uno de los ejemplos que se proporcionan consistente en un sistema de partículas 2D, se realizó una implementación del juego de la vida. La implementación funciona tanto en sistemas Windows como en Xbox 360 suponiendo que contemos con una licencia para ejecutar código en dicha consola. Para compilar el código es necesario disponer de XNA Game Studio Express 1.0 Refresh, el cual se puede descargar gratuitamente.

En el siguiente vídeo se puede observar la evolución del autómata celular para un estado inicial concreto establecido al azar. 

La implementación consta de una rejilla de 50×50 celdas o ‘células’. Cada célula puede estar en uno de dos posibles estados: viva o muerta.

Para cada iteración se calcula el siguiente estado utilizando las reglas descritas a continuación:

  1. una célula ‘nace’, es decir, pasa al estado de viva si y solo si tres células vecinas suyas están vivas.
  2. Si una célula viva tiene como vecinas a dos o tres células vivas, seguirá viva. En caso contrario la célula morirá.
¿Desea saber más?
  1. Completo artículo en Wikipedia

Código fuente de el juego de la vida