Termómetro en tiempo real con Arduino y Java

14
8019

En la versión 3.0.0 de la librería PanamaHitek_Arduino he incluido nuevas y mejoradas funciones que permiten lograr resultados muy interesantes de manera fácil y rápida. Una de estas funciones permite renderizar un termómetro en tiempo real con la capacidad de ser actualizado a partir de los datos de temperatura recibidos desde Arduino.

El propósito de este artículo es explicar cómo construir una sencilla aplicación en base a la librería que he diseñado para mis trabajos personales y que he decidido compartir con ustedes. Con la inclusión de nuevas clases en la última versión de mi librería se ha hecho muy fácil lograr cosas que antes requerían conocimientos avanzados de programación.

Programación en Arduino

Para enviar los datos de temperatura a Java, Arduino debe ser programado para cumplir con este propósito. Para este ejemplo en específico, se utilizará el sensor DHT22, con el siguiente código:

El resultado de este código imprime datos de temperatura y humedad en el puerto serie. Esto se puede comprobar entrando al Monitor Serie del Arduino IDE:

Resultados en el Monitor Serie

Arduino enviará pares de datos de forma constante, siempre y cuando el se mantenga encendido.

Programación en Java

La programación en Java requiere la utilización de la librería PanamaHitek_Arduino. Para ello recomiendo la utilización de Maven como gestor de repositorios. Maven se encuentra integrado de forma nativa en Netbeans IDE, por lo que es muy fácil crear un proyecto y agregar dependencias. Estas dependencias (o librerías) se descargan e instalan automáticamente. Este procedimiento ya lo explicamos en este post.

Una vez creado el proyecto Maven en Netbeans y luego de agregar las dependencias de la librería PanamaHitek_Arduino 3.0.0 (ver post), nuestra ventana debe lucir así:

Árbol del proyecto de pruebas en Netbeans

El archivo pom.xml en el que se especifican las dependencias de Maven debe lucir así:

Archivo pom.xml con las dependencias declaradas para Maven

Ahora vamos a agregar un JFrame a nuestro proyecto y en su interior vamos a colocar un JPanel.

Vista general del proyecto en Netbeans

Dentro del código del JFrame (que se llama MainWindow) encontraremos el método principal, justo donde aparece la instrucción initComponents(). Dentro colocaremos el siguiente código:

El código en la ventana debe lucir mas o menos así:

Instrucciones en el constructor de la clase MainWindow

Cuando se ejecuta este código, el resultado es el siguiente:

Ventana con el termómetro renderizado

Como se puede observar, la creación del gráfico del termómetro es extremadamente sencilla. Son apenas dos líneas de código las que nos permiten lograr este resultado. También se pueden modificar ciertos aspectos asociados a la apariencia del termómetro. Por ejemplo, en la siguiente imagen se muestran algunos métodos que permiten cambiar aspectos como la escala y los colores.

Este código produce como resultado la siguiente ventana:

termómetro en tiempo real con Arduino y Java
Ventana con el termómetro renderizado

Las instrucciones mostradas son los principales elementos que se pueden modificar de este tipo de gráfico. Si se desea modificar otros aspectos, como el color de fondo y el tipo y tamaño de la letra, el método getChartObject() devolverá un objeto de la clase JFreeChart con todos los elementos del gráfico contenidos en su interior.

Interacción del termómetro en tiempo real

Para lograr que el termómetro responda a los datos del sensor conectado al Arduino, existen dos métodos: uno muy fácil y el que es un poco más complicado.

La forma fácil consiste en utilizar el método createArduinoFollowUp que básicamente se encarga de gestionar una conexión con Arduino a través de RS-232 y recibir los datos. Funciona de la siguiente manera:

Este código se encarga de actualizar el termómetro cada vez que recibe un dato. La desventaja de este código es que el Arduino solamente debe enviar un dato de temperatura a la vez, razón por la cual habría que modificar el código en Arduino para que no envíe los datos de temperatura. Con el modo followUp la clase PanamaHitek_ThermometerChart simplemente se limita a recibir un dato y a graficarlo. Es muy útil si lo que se desea es crear una aplicación sencilla.

Si la aplicación es más compleja, se puede utilizar la clase PanamaHitek_Multimessage para recibir varios mensajes a la vez y discriminar lo que se quiere graficar.

 

 

 

 

 

 

 

 

 

Estas instrucciones permitirán discriminar lo que le llega al Arduino y decidir que se desea insertar en el gráfico. En la declaración de MultiMessage se especifica que se a a recibir datos de dos sensores (humedad y temperatura). En la línea resaltada se especifica que el sensor en el índice cero (temperatura; humedad está en el índice 1) será transformado a Double e insertado en la gráfica (con setValue). Los dos ejemplos, tanto el primero como el segundo se encuentran disponibles en nuestro repositorio de Github.

Espero que la información presentada en este post sea de su completo agrado y les permita aprender un poco más sobre la librería para comunicación entre Arduino y Java. Son muchos y muy interesantes los proyectos que se pueden construir cuando se logra integrar ambas plataformas.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

14 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
Hernán Mina
Hernán Mina
3 years ago

Buenas noches. Cómo puedo obtener el dato exacto con decimales de la temperatura para ponerlo en una caja de texto?

Miguel Angel Rodriguez O.
Miguel Angel Rodriguez O.
4 years ago

Perdon por enviar el mismo comentario, soy nuevo en esta plataforma.

Miguel Angel Rodriguez O.
Miguel Angel Rodriguez O.
4 years ago

Buenas tardes, he intentado con exactamente lo mismo pero con aplicación de Java por que copiando el código en Maven no me descarga ninguna librería, por tanto quiero preguntas: este ejercicio solo funciona con Maven? Aparte, he puesto el código exactamente igual con el Jframe e introduciendo el panel tal como lo explicaste pero me sale el siguiente error: Exception in thread «main» java.lang.NoClassDefFoundError: org/jfree/data/general/ValueDataset at com.panamahitek.liveinterfaces.PanamaHitek_ThermometerChart.(PanamaHitek_ThermometerChart.java:373) at termo.NewJFrame.(NewJFrame.java:24) at termo.Termo.main(Termo.java:18) Caused by: java.lang.ClassNotFoundException: org.jfree.data.general.ValueDataset at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) … 3 more C:\Users\Miguel Angel\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 1 second) Con esto también… Read more »

Miguel Angel Rodriguez O.
Miguel Angel Rodriguez O.
4 years ago

Buenas tardes, he intentado con exactamente lo mismo pero con aplicación de Java por que copiando el código en Maven no me descarga ninguna librería, este ejercicio solo funciona con Maven? Aparte, he puesto el código exactamente igual con el Jframe e introduciendo el panel tal como lo explicaste pero me sale el siguiente error: Exception in thread «main» java.lang.NoClassDefFoundError: org/jfree/data/general/ValueDataset at com.panamahitek.liveinterfaces.PanamaHitek_ThermometerChart.(PanamaHitek_ThermometerChart.java:373) at termo.NewJFrame.(NewJFrame.java:24) at termo.Termo.main(Termo.java:18) Caused by: java.lang.ClassNotFoundException: org.jfree.data.general.ValueDataset at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) … 3 more C:\Users\Miguel Angel\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 1 second) Con esto también quisiera preguntar, aparte de… Read more »

Frank
Frank
4 years ago

Buenas tardes.
¿Cómo se cambia el color de fondo del termómetro?

Frank
Frank
4 years ago

Buenas tardes.

¿Cómo cambio el color de fondo del termómetro? Siempre tiene el color de fondo gris.

Frank
Frank
4 years ago

Buenas tardes.
¿Cómo puedo cambiar el color de fondo del termometro?
Siempre está en gris.
Gracias.

Jofre Rodríguez
Jofre Rodríguez
5 years ago

Hola tengo una pregunta, como seria para cambiar el color de la letra y los colores de diferencia de temperaturas?
Gracias.

Antonio Nieblas
Antonio Nieblas
6 years ago

Se puede usar su librería con micro controladores sin el bootloade?