Arduino+Java: Graficadora de datos de Sensores

38
16261

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.

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.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

38 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
Antonio Lopez
Antonio Lopez
4 years ago

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.

Andrés Mora B
Andrés Mora B
6 years ago

Cómo puedo aplicar esto si lo que necesito es medir potencia, ayuda por favor

Antony García González
Antony García González
6 years ago
Reply to  Andrés Mora B

Usa medidores de voltaje y corriente

Martin Marquez
Martin Marquez
6 years ago

hola quisiera adquirir datos de este sensor de color TCS3200, tenes algun ejemplo para mandar?
Dejo mi mail: [email protected]. Cualquier idea y/o ejemplo voy a estar muy agradecido. Saludos!

Javier
Javier
6 years ago

Me dice que Mensaje y DatoEntrada no estan declarados

Antony García González
Antony García González
6 years ago
Reply to  Javier

Verifica las librerías

Angel Marino Pineda Sánchez
Angel Marino Pineda Sánchez
6 years ago

Gracias por su aporte, me sirvió mucho 🙂

Angel Marino Pineda Sánchez
Angel Marino Pineda Sánchez
6 years ago

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.

jean jativa
jean jativa
7 years ago

Hola, en que unidades estaria la temperatura?

jean jativa
jean jativa
7 years ago
Reply to  jean jativa

tengo el siguiente problema:
WARNING: RXTX Version mismatch
Jar version = RXTX-2.2pre1
native lib Version = RXTX-2.2pre2

jean jativa
jean jativa
7 years ago
Reply to  jean jativa

Por ultimo tambien me sale esto:

C:UsersjeancarloDesktopGraficadora con sensor HC-SR04JavaGraphicsnbprojectbuild-impl.xml:1040: The following error occurred while executing this line:
C:UsersjeancarloDesktopGraficadora con sensor HC-SR04JavaGraphicsnbprojectbuild-impl.xml:805: Java returned: 64

Rodrigo Escobar
Rodrigo Escobar
7 years ago

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

jean jativa
jean jativa
7 years ago

Hola pudiste componer el error?

Isc Dave
Isc Dave
7 years ago

Puedes compartir el diagrama o cirtuito por favor. Saludos

Bryan Valencia Suárez
Bryan Valencia Suárez
10 years ago

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!

Bryan Valencia Suárez
Bryan Valencia Suárez
10 years ago

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… Read more »

tony
tony
10 years ago

me sale un error en los gnu ?

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

Theginnger
Theginnger
10 years ago

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.. = ( !!!

antonygarciagonzalez
10 years ago

Necesitas aprender como leer el LM35 (con analogRead()) y luego lo cambias donde dice h=readHumidity() en el código Arduino. Lo demás todo se queda igual

fernando
10 years ago

amigo disculpa como podria hacer sto de graficar pero con un lm35

Krishna Kal-el
10 years ago

oye crees que pueda servir para un electrocardiografo…. ya tengo la parte analogica, y ya la conecte al arduino pero no se como graficarla, esto ayudaria?

Krishna Kal-el
10 years ago
Reply to  Krishna Kal-el

gracias por tu ayudaa

antonygarciagonzalez
10 years ago
Reply to  Krishna Kal-el

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

Krishna Kal-el
10 years ago

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

antonygarciagonzalez
10 years ago
Reply to  Krishna Kal-el

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

fernando
10 years ago

disculpa en vez del dht11 necesito usar un moisture como seria la libreria o que modificaciones se deben hacer

antonygarciagonzalez
10 years ago
Reply to  fernando

Hasta ahora no he trabajado con moisture por lo que no te podría decir que debes hacer. Necesitaría tener uno de esos sensores, estudiarle y luego publicar

fernando
10 years ago

vale se agradece la atención

fernando
10 years ago

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?

antonygarciagonzalez
10 years ago
Reply to  fernando

Necesitas hacer un cambio en el código Arduino. En vez de usar dth.readHumidity usas dht.readTemperature

Tadeo
Tadeo
10 years ago

Puede funcionar en vez de el sensor que usar un potenciometro? como por ejemplo para calcular la posicion del potenciometro?

antonygarciagonzalez
10 years ago
Reply to  Tadeo

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

Edson Ballestas E.
Edson Ballestas E.
10 years ago

amigo como seria para conseguir el codigo fuente???

con que otro sensor puedo remplazar el q usas?

antonygarciagonzalez
10 years ago

Aquí puedes encontrar el proyecto de Netbeans:
http://docs.google.com/folder/d/0B0hsUkhqWH97elQtOU42aTlHTGc/edit?usp=sharing

Esto se puede usar con cualquier sensor. Yo lo he usado en este blog con DHT11 y HC-SR04. Pero funciona con cualquier sensor