Medidor Dual de Humedad/Temperatura con JFreeCharts

9
121
Un medidor dual de humedad y temperatura alimentado por información recibida directamente desde Arduino con el sensor DHT22

 

Antes ya he mostrado como graficar datos de sensores en Arduino por medio de Java y la librería JFreeCharts.

Ejemplo de ello son los siguientes aportes:

En esta ocasión voy a mostrar como mostrar los datos obtenidos por un sensor DHT22 de Humedad y Temperatura en un Medidor Dual Análogo.

 Veamos una imagen de cómo nos quedaría nuestro medidor.

DialPlotSample

Vamos a registrar la Temperatura en el medidor externo (aguja grande) y la Humedad en el medidor Interno (aguja pequeña, de color rojo).

Vamos a necesitar para esto descargar los ejemplos o “demos” de la librería JFreeChart. Esto no encontraremos en el siguiente enlace.

JFreeCharts Demo

Vamos a descargar el archivo y a abrir Netbeans para crear un nuevo proyecto. Llamaré a mi proyecto MedidorDual. En el paquete principal voy a cargar dos clases de las que se encuentran en el archivo comprimido de los “demos” de JFreeChart. Estas son DemoPanel y DialDemo (A esta altura ya debemos haber agregado las librerías JFreeCharts a nuestro proyecto).

DialDemo2

Ahora necesitamos instanciar la clase DialDemo2 en la clase principal MedidorDual.

DialDemo2

 

Ahora estamos listos para ejecutar nuestro código. El resultado es el siguiente.

DialDemo2

 

Como podemos observar, los valores que marcan las agujas están determinados por los “sliders” de la parte inferior. Lo que haremos será modificar ligeramente nuestro código para que en vez de obedecer los jSliders obedezca los datos que le enviemos desde Arduino.

Vamos a ir al código y eliminaremos los slider 1 y 2.

DialDemo2

 

Al eliminar los slider nos aparecerá una serie de errores en nuestro código. Vamos a eliminar todas esas líneas donde nos aparezcan errores.

DialDemo2

 

Al eliminar todas las líneas con errores estamos eliminando cualquier rastro de los jSlider.

Necesitamos eliminar los jLabel que dicen “Inner Needle” y “Outer Needle” ya que no los vamos a necesitar.

DialDemo2

 

Vamos a probar nuestro código a ver como nos va quedando.

DialDemo2Vemos que los Sliders han desaparecidos y ahora no tenemos forma alguna de mover los valores de las agujas. Sigamos haciendo otros cambios.

Vamos a modificar la escala de la aguja exterior, para que los valores que se muestren estén entre 0 y 100 ºC.

DialDemo2

 

También podemos cambiar una serie de parámetros como el título del gráfico, los colores, el tamaño, la fuente, etc. Por ahora, sólo mostraré cómo comunicar nuestro gráfico con Arduino.

Necesitaremos importar nuestra Librería Arduino para Java.

Vamos a instanciar la librería en el código del medidor. Crearemos un objeto llamado Arduino. También invocaremos la clase MultiMessage para la lectura de los sensores. En esta ocasión se leerá dos parámetros, humedad y temperatura. Esto necesitamos establecerlo en la instancia de la clase MultiMessage.

DialDemo2

Ahora hay que crear un objeto invocando la clase SerialPortEventListener para recibir los datos desde Arduino en tiempo real. Esta clase cuenta con un método abstracto (SerialEvent) que se ejecuta cada vez que Java recibe un mensaje desde Arduino.

DialDemo2

Vamos a asignarle los valores que recibamos de Arduino a cada una de las agujas. El primer valor que recibiremos será de Temperatura y el segundo de Humedad. Utilizaremos la clase MultiMessage.

DialDemo2

Lo que la clase multi hace es regresar un valor “true” a través del método DataReceptionCompleted cuando se ha terminado de recibir la cantidad de datos establecida en la creación del objeto, en este caso 2.

Cuando dicha condición se cumple, podemos leer los datos almacenados en un arreglo a través del método getMessage(int index), donde index es el número de dato que deseamos leer. En este caso, el dato 1 es temperatura y el 2 es humedad. El orden de prioridad lo decidimos en el código Arduino que veremos más adelante.

Asignamos los valores al los DataSet por medio de setValue. Al final, cuando hemos terminado de darle el tratamiento requerido a la información recibida utilizamos el método flushBuffer() para eliminar los datos almacenados en el arreglo y prepararnos para una nueva lectura.

Ahora el último paso que necesitamos hacer es declarar la conexión con Arduino. Esto lo haremos al final del método que crea nuestro medidor (MyDemoPanel).

DialDemo2

Con esto hemos terminado de programar nuestro Medidor Dual en Java. Para mi caso el puerto que estoy utilizando es el 8, pero esto puede cambiar de PC a PC.

Vamos a preparar nuestro código en Arduino. Nos vamos a basar en el programa que publiqué una vez en el post del sensor DHT22, con ligeras modificaciones.

Vemos que primero imprimimos la Temperatura y luego la Humedad, ya que en ese orden es que esperamos leer los datos con el MultiMessage

Cargando este código en Arduino estamos listos para probar nuestro Medidor Dual.

DialDemo2

 

Eso es todo por ahora. Espero que la información suministrada sea de su agrado y comprensión.

Saludos.

  • victor capote

    hola, muchas gracias por tu aporte me ha servido mucho para un proyecto. quiero preguntarte, ¿es que al gráfico se le pueda anexar otras interacciones? (me explico) yo deseo crear un Jframe que lleve una animación de reloj o un calendario lo puedo hacer todo en conjunto, lo que pasa es que estoy creando una interfaz grafica y con tu aporte, necesito agragar mas cosas a la ventana. gracias

    • Antony García González

      Si se puede, haciendo buen uso de los conceptos asociados a orientación a objetos

  • Antonio Gómez

    Hola! Antes que nada muy buen proyecto, me ha servido bastante. Solo una pregunta, en esta aplicación que versión de tu librería (PanamaHitek_Arduino) utilizaste? ya que me da error con la 2.82 y anteriores. Gracias

    • Antony García González

      Se utilizó una versión antigua. Hay que actualizar el código para que se acople a la 2.8.2

  • Jesus Zanelli

    hola. respecto al proyecto en Java ¿lo hiciste tú o lo sacaste de internet? Es que me parece muy bien hecho, hacer algo así toma días, quería saber. Muchas gracias.

    • Antony García González

      Todo lo que se publica aquí es producto de nuestro trabajo. No tomamos trabajos de otros para postearlos como nuestros

    • Antony García González

      En este caso usamos un ejemplo de la librería JFreeCharts y agregamos/modificamos algunas cosas para darle funcionalidad.

  • Cruz Juarez

    hola quisiera saber si las librerias han sido modificadas o hay algo diferente ?? no me funciona el codigo y estoy siguiendo as instrucciones como aparecen.??

    • Antony García González

      Si las librerías han sufrido algunas modificaciones. Es necesario revisar el codigo