Panama Hitek Logo
Panama Hitek Logo

Arduino+Java: Graficadora de datos de Sensores

Hola amigos. En este post estaré explicando como crear un programa que nos servirá para graficar los datos que obtenemos de un sensor conectado a Arduino. La verdad es un programa básico que podría ser mejorado por cualquiera de ustedes que sepa de programación.

En lo personal yo soy un aficionado a la programación y apenas se construir aplicaciones a partir de secuencias lógicas y algoritmos basados en la matemática. Carezco de formación académica en el campo de la programación (como la gran mayoría de los grandes programadores) por lo que desconozco muchos conceptos que podrían facilitar la creación de este tipo de aplicaciones.

En fin, empecemos.

Creamos un proyecto en Netbeans al que llamaremos Graphics. Colocamos un JForm y agregamos un jPanel de color blanco.

Netbeans

El color blanco se coloca en la propiedad «Background». También sugiero cambiar el borde a «Etched Border».

A mi me gusta que la ventana quede del tamaño de la pantalla, por lo que crearemos un método llamado ScreenDImension() con el que «setearemos» nuestra ventana al tamaño de  la pantalla.

Declaramos las variables globales del tipo entero ancho y alto.

La función ScreenDimension():

Con esto lo que hacemos es que obtenemos el tamaño de la pantalla y ajustamos la ventana a dichas medidas. Necesitamos invocar este método luego del initComponents().

Netbeans

Al ejecutar el programa obtenemos lo siguiente:

NetbeansAhora queremos que el panel blanco se ajuste al tamaño de la ventana.

Crearemos un método con al cual le indicaremos al Panel su posición y  tamaño. Yo he decidido dejar un espacio de 200 pixels a la izquierda de la ventana para luego colocar unos controles.

 El método setControls() coloca el panel a 200 pixeles a la derecha del borde de la ventana. Además le da el ancho y el alto. Con el comando this.setLayout(null) eliminamos el Layout que es una propiedad que tienen los controles en Java como los panel y los frame que asigna posiciones a los controles que se encuentren dentro. Esto a veces nos limita un poco por lo que le quitamos el Layout al jFrame para que nos deje hacer lo que queremos sin restricciones.

Netbeans
Netbeans

Ahora dibujaremos los ejes X y Y de nuestra gráfica.

Para ello utilizaremos la interfaz Graphics. Declaramos una variable pública:

Se importará java.awt.Graphics.

Ahora debajo del método setControls() le indicamos a la variable que ella estará ligada al panel blanco que ya colocamos.

Netbeans

Dibujar con Graphics es muy fácil la verdad. Hagamos una prueba: dibujaremos un cuadrado y un círculo. El método que hará esto seria Graficar():

Colocamos un botón al que llamaremos «Graficar». En él invocaremos a Graficar().

Netbeans

Al ejecutar la aplicación y hacer clic en el botón se obtiene lo siguiente:

Netbeans

Ahora crearé el eje Y de nuestra gráfica utilizando un rectángulo de 2 de ancho por el alto de la ventana.

Ahora colocaremos las «rayitas en el eje».

Las rayas estarán de 25 en 25 pixeles, para que halla espacio entre una y otra y se entienda la gráfica.

El código es el siguiente:

En un ciclo for, se dibujará una línea que vaya del 36 al 45 (7 pixeles) y la coordenada y estará dada por i*25 siendo la variable i el contador del ciclo for. Cuando colocamos (alto/25)-4 le indicamos al programa que divida el alto de la ventana del panel entre 25 y que le quite 4 rayitas para que al final quede un espacio en donde se colocará el eje x en condiciones normales.

Todo esto lo colocaremos en un método al que llamaremos setGrid(). Grid significa cuadrícula, osea que este método preparará la cuadrícula para graficar.

Netbeans
Netbeans

Ahora colocamos los números. Declararé 2 variables públicas, GraphMax y GraphMin, osea, el máximo y el mínimo de la gráfica:

Ahora con esto podemos implementar el siguiente código:

Netbeans
Netbeans

Cuando ejecutamos el código obtenemos lo siguiente:

Netbeans

Si cambiamos el Máximo y el Mínimo podemos ver que nuestro algoritmo se adapta a los cambios.

Netbeans

Sólo nos falta agregar el eje X a nuestro método setGrid(), sin embargo primero trabajaremos en el algoritmo para graficar.

Primero buscamos la coordenada de la rayita de más abajo. Creamos una variable del tipo entero llamada cero

Ahora creamos un método al que llamaremos Graph(int input) que será el encargado de graficar. En el parámetro input metemos el número a graficar.

Por el momento utilizaremos el siguiente código:

Netbeans
Netbeans

Netbeans

Netbeans 

Netbeans

Con este código, si colocamos la sentencia Graph(tiempo); y luego setGrid() en el botón Graficar, entonces obtendremos lo siguiente:

Netbeans

Con esto estamos listos para graficar datos provenientes de Arduino. Yo he preparado un código para graficar datos de humedad.

Aquí solamente utilizamos un DHT11, igual al que utilizamos en el post DHT11: Sensor de Humedad/Temperatura para Arduino.

Una variable del tipo boolean (started) le indicará a Arduino si envía datos o no. Nuestro programa en Java le indicará la frecuencia a la que tiene que enviar datos.

Cargamos el código a nuestro microcontrolador. Ahora necesitamos agregar ArduinoConnection(), EnviarDatos(), RecibirDatos() y el SerialEventListener.

Aquí están los imports (recuerden agregar la librería RXTX)

Ahora las variables:

Los métodos:

Por último, el EventListener. Desde aquí invocamos el método Graph().

Netbeans

Con esto ya podemos iniciar nuestro programa y empezar a recibir datos desde Arduino.

Netbeans

Ahora solo tenemos que agregar unos pequeños detalles para que nuestra graficadora se vea un poco más completa.

Agregaré un panel con los siguientes controles:

Netbeans

La programación de estos controles está disponible aquí:

https://docs.google.com/folder/d/0B0hsUkhqWH97elQtOU42aTlHTGc/edit?usp=sharing

Lo que hice fue que agregué los títlos de los ejes, el máximo y el mínimo de la gráfica, la frecuencia con la que Arduino enviará datos. Se podrá pausar el recibimiento de datos y reanudarlo. También agregué una tabla en la cual se irán registrando los datos que se irán recibiendo.

En el archivo que subí está disponible todo el código de estos controles con su respectiva explicación. Ahora es hora de probar nuestra aplicación.

[youtube https://www.youtube.com/watch?v=tMEekJcYY-U]

Lamento no poder incluir el audio en este video por el blower, pero se logra apreciar el funcionamiento del programa. Con el desodorante aumento un poco la humedad, luego con el blower la bajo. Cambio los datos de humedad a temperatura y la bajo para luego subirla nuevamente con el blower.

Espero sus comentarios.

Saludos.

Antony García González
Antony García González
Ingeniero Electromecánico, egresado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.

Posts relacionados

38 COMENTARIOS

    • Sí es posible, sin embargo tendrías que utilizar un principio un poco diferente, la lectura analógica de datos en donde le aplicas un voltaje al potenciómetro y con las caídas determinas la resistencia en el mismo

  1. excelente publicacion estoy apunto de entregar un proyecto y ha sido de mucha ayuda, solo quisiera saber como modificas el programa para que en vez de humedad lea temperatura?

    • Necesitarías hacer conversión análogo-digital y registrar los datos en intérvalos muy cortos en el orden de los milisegundos, quizás mirosegundos. Pero sí es posible y sí se puede hacer con este programa. También podrías usar MatLab y Excel

      • gracias… oye disculpa no tengo el programa para hacer el codigo que tu pones…. tengo matlab pero la verdad no se como ocuparlo, sabes como pasar los datos que arroja el arduino a matlab y graficarlos???, ya hice la conversion analogo-digital en intervalos de 5ms… pero no se como pasar esos datos a tu programa…. y bueno en este caso a matlab… me ayudarias con eso

        • Para pasarlos a MatLab necesitarías investigar como se logra comunicación serial en esa plataforma. Yo no tengo experiencia en eso, planeo algún día publicar algo de MatLab pero como estoy en la Universidad no tengo mucho tiempo aparte de los fines de semanas para dedicarme a este blog. Para usar mi programa necesitarías usar analogRead() en Arduino y luego usar Serial.println() para mandar los datos a Java y graficar

  2. como haria para una comunicacion con bluetooth rs232 (HC-06) ? …porque con este no se conecta..o que podria hacer o cambiar en en el codig fuente.. = ( !!!

  3. me sale un error en los gnu ?

    import gnu.io.CommPortIdentifier;
    import gnu.io.SerialPort;
    import gnu.io.SerialPortEvent;
    import gnu.io.SerialPortEventListener;

  4. Excelente esta ayuda. Estoy trabajando en un proyecto en mi universidad y necesito graficar una señal de un sensor de distancia marca Sharp pero no he podido porque a pesar de que el proyecto que usted nos facilita no me genera errores simplemente cuando le doy «graficar» no lo hace, no sé cómo debe ser el contenido de la instrucción Serial.print(«contenido») para que el proyecto que usted nos facilita funcione porque tampoco sé si sea necesaria la implementación de la librería «Ultrasonido» si es así dónde la puedo descargar y además no sé si sea posible utilizarla con un sensor de distancia.

    Muchas gracias!

    • Recomiendo utilizar la graficadora de datos de sensores con jFreeChart que se encuentra en este blog. Es mucho más versátil que este programa. Recomiendo probar el sensor en Arduino antes de acoplarlo a Java. Debemos recordar que Arduino no es programado en Java sino que interactúan ambos lenguajes entre sí a través de comunicación serial. Si se logra imprimir los datos de los sensores en el monitor Serial, Java podrá recibir dichos datos y graficarlos

  5. Muchas gracias Antony por tu ayuda, ya solucioné el inconveniente, ahora me gustaría aprender a finalizar la conexión con Arduino sin tener que cerrar la aplicación, pues tengo dos diferentes programas que ya están configurados independientemente con su conexión serial a Arduino y quiero conservarlos así, pero para poder ejecutar uno y luego el otro debo finalizar la conexión con Arduino del primero, cómo se puede hacer esto?

    Muchas gracias!

  6. alguien mas tiene este error?

    …Graphicsnbprojectbuild-impl.xml:1040: The following error occurred while executing this line:
    …Graphicsnbprojectbuild-impl.xml:805: Java returned: 64
    BUILD FAILED (total time: 4 seconds)

    necesito ayuda 🙁

    1040

    805

  7. Buenas, tengo un problema, estoy usando el mismo sensor y me lee y grafica, el problema está en el eje y, porque me salen valores que no concuerdan con los que leen, es decir me sale que lee 40,41,42… De humedad, pero en la parte de la gráfica salen valores -5,-6…
    ¿Cuál podría ser el problema? He usado vuestros archivos de esta guía.

  8. Necesito ayuda por el siguiente error:
    java.lang.NumberFormatException: For input string: «nan,nan,nan,nan,nan,nan,-10»
    El programa sigue intacto pero no logro que grafique.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Post relacionados