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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <dht.h> //Se importa la librería dht DHT; //Se crea una instancia de la clase DHT #define DHT22_PIN 10 //Pin del sensor DHt22 void setup() { Serial.begin(9600); } void loop() { int chk = DHT.read22(DHT22_PIN); //Se lee el sensor Serial.println(DHT.temperature, 1); //Se imprime la temperatura Serial.println(DHT.humidity, 1); //Se imprime la humedad delay(2000); //Pausa de dos segundos } |
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:
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í:
El archivo pom.xml en el que se especifican las dependencias de Maven debe lucir así:
Ahora vamos a agregar un JFrame a nuestro proyecto y en su interior vamos a colocar un JPanel.
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:
1 2 |
PanamaHitek_ThermometerChart chart = new PanamaHitek_ThermometerChart(); chart.insertToPanel(jPanel1); |
El código en la ventana debe lucir mas o menos así:
Cuando se ejecuta este código, el resultado es el siguiente:
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:
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.
Buenas noches. Cómo puedo obtener el dato exacto con decimales de la temperatura para ponerlo en una caja de texto?
Fíjate en la documentación de la librería. Mira este ejemplo: https://github.com/PanamaHitek/PanamaHitek_Arduino/blob/master/src/test/java/examples/arduino/rxSimple.java
Perdon por enviar el mismo comentario, soy nuevo en esta plataforma.
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 »
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 »
Buenas tardes.
¿Cómo se cambia el color de fondo del termómetro?
Por ahora no le he agregado esa función a esta clase. El color por defecto es gris oscuro. Quizás este fin de semana le pueda agregar esa función a la librería
Buenas tardes.
¿Cómo cambio el color de fondo del termómetro? Siempre tiene el color de fondo gris.
Buenas tardes.
¿Cómo puedo cambiar el color de fondo del termometro?
Siempre está en gris.
Gracias.
Por lo pronto no es posible. Trataremos de agregar esa función
Hola tengo una pregunta, como seria para cambiar el color de la letra y los colores de diferencia de temperaturas?
Gracias.
Hay instrucciones para eso. Ve a nuestro repo de github y mira los archivos de ejemplo
Se puede usar su librería con micro controladores sin el bootloade?
Esta librería puede ser utilizada con cualquier dispositivo que se pueda comunicar por medio de comunicación serial (RS-232) con la computadora