Arduino + Java: Tabular y exportar datos a Excel

30
2454

Desde la versión 3.0.0, la librerí­a PanamaHitek_Arduino cuenta con una clase especial para facilitar la tabulación y exportación de datos a una hoja de cálculo de Excel. Esta clase, llamada PanamaHitek_DataBuffer, permite almacenar datos, crear una interfaz gráfica con un JTable que tabula la información recibida y permite exportar los datos almacenados a Excel.

En el siguiente artí­culo voy a tratar de explicar, paso por paso, como crear una sencilla interfaz que permita tabular los datos recibidos desde Arduino, con la posibilidad de exportar los datos a Excel al presionar un botón.

Creación de proyecto e importación de librería en Netbeans

Para el ejemplo que voy a mostrar en este post voy a crear un proyecto al que voy a llamar excel_test. Será un proyecto Maven, al que voy a agregar las dependencias de la librerí­a PanamaHitek_Arduino, tal como se explica en este post.

Especificando el tipo de proyecto en Netbeans
Especificando el nombre del proyecto en Netebeans

Recordemos que para poder utilizar la librerí­a, es necesario agregar lo siguiente al fichero pom.xml (generado por defecto a la hora de crear el proyecto en Netbeans):

Archivo pom.xml

Luego de agregar las dependencias, al hacer clic derecho sobre el proyecto y seleccionar «Clean and Build» se descargaron todas las dependencias de manera automática. También haciendo clic en Dependencies/Download Declared Dependencies se descarga todo lo necesario para el uso de la librería.

Las instrucciones sobre este proceso se muestran en este video.

Creación de la interfaz gráfica

La interfaz gráfica que utilizará para este ejemplo será muy sencilla. Se trata de un JFrame, con un JPanel y un botón, tal como se muestra en la siguiente imagen.

Interfaz gráfica

La clase PanamaHitek_DataBuffer utiliza un JPanel para visualizar la tabla en la cual se van a recibir los datos.

Código en Arduino

Para poder probar que nuestra aplicación funciona, será necesario escribir un pequeño código en Arduino y estar seguros de qué es lo que hace este código. En base a esto es que en Java se configura el comportamiento de la aplicación.

Lo que hace este código es, básicamente, generar datos de temperatura de manera aleatoria. Al número generado se le agregan 50 unidades para producir un dato de humedad. Luego los dos números se imprimen en el monitor serie de dos en dos.

Es muy importante tomar en cuenta que los datos deben ser impresos utilizando Serial.println y en el mismo orden en el que se espera recibirlos en Java.

Programación en Java

La programación en Java requiere de la declaración de instancias de 4 clases:

  • PanamaHitek_Arduino, para la gestión de la conexión con Arduino y para recibir los datos en Java
  • PanamaHitek_MultiMessage, para discriminar los datos recibidos cuando se trata de múltiples envíos de manera simultánea.
  • PanamaHitek_DataBuffer, para almacenar los datos recibidos en la memoria dinámica. Esta clase también permite renderizar un JTable en el que se insertan los datos de manera dinámica. También es la clase encargada de exportar los datos a Excel a voluntad del usuario.
  • SerialPortEventListener, para gestionar los eventos de recepción de datos y la inserción de la información en el DataBuffer.

Toda la programación que se necesita para darle funcionalidad a esta interfaz estará ubicada en el constructor de la clase, es decir, en void JFrameWindow().

Es un código relativamente sencillo, en el que se inicia una conexión con el Arduino a través del puerto COM15. El buffer tendrá 3 columnas (tiempo, temperatura y humedad), pero se le podrán agregar más si se desea.

Con la instrucción buffer.insertToPanel(jPanel1) nos aseguramos que los datos del buffer sean mostrados en una tabla en el jPanel1, tal como se muestra en la siguiente imagen.

Los datos serán insertados en la tabla cada vez que se utilice el método buffer.printRow(), mientras que para insertar la información en cada columna se debe utilizará buffer.addValue(2, 15) (esto permitirá insertar el valor 15 en la columna 2. Debemos recordar que las columnas se enumeran a partir de 0, por lo que la columna 2 será la tercera).

Para exportar los datos almacenados en el DataBuffer a Excel, se utiliza la instrucción buffer.exportExcelFile(), la cual abrirá una ventana que permitirá escoger la ruta en la que se desea almacenar el fichero. Esta instrucción debe colocarse en el botón de exportar.

A continuación presento para ustedes un video en el cual se resume todo lo explicado en este post. El video inicia en el minuto 7:00, donde ya se muestra el resultado de la ejecución del código:


El código utilizado en este artículo se encuentra completo en nuestro repositorio de Github, especí­ficamente en este enlace.

Debo recordar a todos nuestros lectores que esta compilación de código ha sido diseñada para facilitar las tareas de interacción entre Arduino y Java para todas aquellas personas que con pocos conocimientos de programación podrán lograr cosas interesantes y sacar sus proyectos e ideas adelante.

30 Comentarios

  1. Hola ingeniero Antony. Tengo un problema cn la programación; al momento de correr el «ExcelExport» descarga un par de cosas y finaliza instantáneamente, aparece el mensaje de «Build Success», en ningún momento se muestra la ventana cn los datos ni mucho menos me deja finalizarla.

    Cuál puede ser el problema?

    Muchas gracias

  2. Hola tengo un problema, cuando ejecuto en netBeans sin conectar el arduino se ejecuta el codigo y muestra la interfaz, pero cuando tengo conectado el arduino enviando datos se produce un fallo de ejecucion.
    A fatal error has been detected by the Java Runtime Environment:
    #
    # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000007110b5db, pid=11040, tid=19924
    #
    Podrias decirme que error puedo haber cometido. Puedo enviarte el .log si lo deseas.
    Muchas gracias, un Saludo.

  3. Saludos ingeniero, mi duda es la siguiente:
    Estoy tratando de utilizar este mismo ejemplo, solo que en vez de mostrar los datos en una tabla, quiero dividirlos en JLabels, mis preguntas son: ¿Es posible hacerlo? Si es posible, ¿Como podría hacerlo?, ya que lo he intentado pero no me es posible. Le agradecería mucho su ayuda.

    Saludos cordiales desde México.

  4. Ingeniero buenas tardes, estoy intentando agregar el buffer a un scroll para correr los datos, es posible o el buffer ya viene con su scroll
    y como hago para guardar esos datos en la base de datos?

  5. Buenos días estoy intentando utilizar la libreria, pero la verdad no se mucho de java ni de base de datos pero hice todo lo del video pero corro la aplicacion de excel y me aparece la ventana pero no me captura datos y reviso y el arduino si esta enviando datos, no se si ademas del netbeans se debe estar corriendo otro programa

    • com.panamahitek.ArduinoException: Nomrbe del puerto – COM9; Nombre del método – arduinoRX(); Tipo de excepción – Puerto no abierto.
      at com.panamahitek.PanamaHitek_Arduino.arduinoRX(PanamaHitek_Arduino.java:260)
      at examples.excel.ExcelExport.(ExcelExport.java:128)
      at examples.excel.ExcelExport$3.run(ExcelExport.java:242)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
      at java.awt.EventQueue.access$500(EventQueue.java:97)
      at java.awt.EventQueue$3.run(EventQueue.java:709)
      at java.awt.EventQueue$3.run(EventQueue.java:703)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

  6. Hola Ingeniero quiero utilizar la libreria pero no quiero hacerlo con maven sino crear un programa java normal. Es decir descargue la libreria y la coloque en las librerias del proyecto, pero la clase PanamaHitek_DataBuffer da errores de complicación aunque las reconoce en el codigo como que si las hubiera importado.
    El error empieza como sigue:
    Exception in thread «AWT-EventQueue-0» java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Row
    at ExcelExport.(ExcelExport.java:62)

    Las clases PanamaHitek_Arduino y PanamaHitek_MultiMessage si corren bien y es lo que me extraña porque probe el programa sin usar el objeto buffer

    • Creo que tienes que importar la librería POI a tu proyecto. Maven lo hace automáticamente, pero en tu caso creo que debe hacerse manualmente

  7. Saludos Ingeniero Antony, muchísimas gracias por sus aportes.
    Tengo una inquietud que puede se errada, es con relación a la librería PanamaHitek_Arduino-3.0.1 la cual en su clase PanamaHitek_DataBuffer hace referencia a las clases
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    las cuales generan error ya no se encuentran en poi.3.17 sino en poi 3.7
    Al realizar el ejemplo con la versión PanamaHitek_Arduino-3.0 genra errores.
    Gracias por su aclaración.
    Por ultimo, todavía esta disponible la librería par el manejo del sensor HCSR04.

    Gracias

      • Saludos ingeniero, la librería PanamaHitek 3.1 hace uso de poi 3.17 en la clase PanamaHitek_DataBuffer, y se generan los siguientes errores
        import org.apache.poi.xssf.usermodel.XSSFSheet;
        import org.apache.poi.xssf.usermodel.XSSFWorkbook;
        Al descargar de Maven, el pom hace referencia al poi 3.17 y las clases anteriores aparecen pero en la versión 3.7

Dejar respuesta

Please enter your comment!
Please enter your name here