Medidor Dual de Humedad/Temperatura con JFreeCharts

18
1696

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.

18 Comentarios

  1. Después de estar revisando el código y ver algunas modificaciones que le hice por fin funciono, ahora si pudieras ayudarme con los valores de humedad y temperatura, no se por que me los cambia uno y uno:
    prueba————————-
    Humedad:28.0
    Temperatura:95.0
    prueba————————-
    Humedad:75.0
    Temperatura:28.0
    prueba————————-
    Humedad:28.0
    Temperatura:64.0
    prueba————————-
    Humedad:58.0
    Temperatura:28.0
    prueba————————-

    Si observamos va cambiando los valores quizá no se vea tan claro es decir primer dato que me arroja para humedad es de 58 y para temperatura es 28 a los dos segundos restantes, vuelve a mostrar los valores pero ahora los invierte, temperatura me arroja 58 y humedad 28… podrías ayudarme??

    Tuve que hacer esta modificacion en esta linea ya que si no me arroja un error
    –Exception in thread «EventThread COM4» java.lang.IndexOutOfBoundsException: Index: 2, Size: 2–
    La adecuación solo fue aumentando en vez del 2 el 3 no se si eso cause el problema de intercambio de valores
    PanamaHitek_MultiMessage multi = new PanamaHitek_MultiMessage(3, Arduino);

    • Hola amigo. Veo que has estado trabajando bastante con la librería.
      Te quiero comentar que hace algún tiempo he agregado nuevas funciones a mi código, hasta el punto en el que el medidor dual que deseas hacer ahora se puede construir muy fácil mente con mi librería. El problema es que no he podido documentar estas nuevas funciones. Lo único que he podido hacer es hacer escribir algunos ejemplos de uso. Te recomiendo que veas el siguiente código: https://github.com/PanamaHitek/PanamaHitek_Arduino/blob/master/src/test/java/examples/liveplots/AutomaticDualDialChart.java

      Copia el código de esa clase en un proyecto en Netbeans y ejecútalo y verás que podrás construir la gráfica mucho más rápido y fácil de lo que estás haciendo ahora. Me avisas como te va. Saludos.

  2. A U X I L I O !!!
    No puedo agregar el objeto arduino y los demas…
    Arduino Arduino = new Arduino();
    MultiMessage multi = new MultiMessage(2, Arduino);
    He estado revisando y se que ahi que agregar la libreria Arduino Panama_Hite 3.0.0

    Pero a la hora de agregarla igual sigue sin detectarme las clases de arduino como tales que tengo que hacer???

    ya intente agregar el repositorio con el otro tutorial pero la carpeta pom no la tengo orientame porfavor… saludos

  3. Funciona igual para un sensor dht11???
    tendras algo parecido donde expliques como se usa sensor de humedad de suelo??? Módulo Sensor De Humedad Del Suelo Arduino Cdmex

    Doy clases en una preparatoria soy ing. Agronomo y me ando metiendo en este mundo de la programación le echo muchas ganas pero no es fácil, podrías apoyarme con algo de esto te lo agradecería muchísimo, el trabajo que realizo y las nuevas cosas que quiero crear es para que los alumnos salgan mejor preparador. Saludos

  4. Muy buen aporte ojala exista mas gente como tu dispuesta a entregar sus conocimientos a la sociedad, doy clases en una preparatoria y me ha servido de mucho …. saludos y muchísimas gracias tienes face personal

  5. 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

  6. 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

  7. 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.

  8. 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.??

Dejar respuesta

Please enter your comment!
Please enter your name here