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:
- Gráficas de sensores en tiempo real con Arduino, Java y JFreeChart
- Sensor MQ-3, un detector de alcohol
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.
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.
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).
Ahora necesitamos instanciar la clase DialDemo2 en la clase principal MedidorDual.
Ahora estamos listos para ejecutar nuestro código. El resultado es el siguiente.
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.
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.
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.
Vamos a probar nuestro código a ver como nos va quedando.
Vemos 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.
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.
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.
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.
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).
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "DHT.h" //cargamos la librería DHT #define DHTPIN 2 //Seleccionamos el pin en el que se conectará el sensor #define DHTTYPE DHT22 //Se selecciona el DHT22(hay otros DHT) DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por Arduino para comunicarse con el sensor void setup() { Serial.begin(9600); //Se inicia la comunicación serial dht.begin(); //Se inicia el sensor } void loop() { float t = dht.readTemperature(); //Se lee la temperatura float h = dht.readHumidity(); //Se lee la humedad Serial.println(t); Serial.println(h); delay(2000); //Se espera 2 segundos para seguir leyendo //datos } |
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.
Eso es todo por ahora. Espero que la información suministrada sea de su agrado y comprensión.
Saludos.
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.??
Si las librerías han sufrido algunas modificaciones. Es necesario revisar el codigo
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.
Todo lo que se publica aquí es producto de nuestro trabajo. No tomamos trabajos de otros para postearlos como nuestros
En este caso usamos un ejemplo de la librería JFreeCharts y agregamos/modificamos algunas cosas para darle funcionalidad.
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
Se utilizó una versión antigua. Hay que actualizar el código para que se acople a la 2.8.2
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
Si se puede, haciendo buen uso de los conceptos asociados a orientación a objetos
Hola…. oye esta muy bueno tu proyecto crees que sea posible que me puedas pasar tu código fuente??? mi correo es [email protected]
El post explica como se hace
Enlace caido del Demo de Jfreechart
No me aparece como enlace caido
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
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
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
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.