A veces es necesario cuando realizamos proyectos con Arduino y sensores, enviar la información obtenida a algún otro software para su análisis y utilización. Aprende a exportar datos de sensores desde Arduino a Excel, por medio de una interfaz en Java. Se utilizará las librerías Arduino para Java y la librería POI para generar los archivos de Excel.
Para exportar datos de sensores desde Arduino a Excel yo recomiendo utilizar Java. Aquellos que frecuentan este blog saben acerca de mi librería Arduino para Java.
Normalmente cuanto escribo un post acerca dealgún proyecto en la línea Arduino/Java, empiezo por Java, pero esta vez voy a iniciar con Arduino.
Se va a utilizar para esta experiencia el sensor de humedad/temperatura DHT11, del cual ya he escrito lo suficiente en mis anteriores aportes.
El código a utilizar en Arduino es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
**************************************************** #include "DHT.h" //cargamos la librería DHT #define DHTPIN 2 //Seleccionamos el pin en el que se //conectará el sensor #define DHTTYPE DHT11 //Se selecciona el DHT11 (hay //otros DHT) DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por Arduino para comunicarse con el sensor boolean Start=false; int mensaje=0; void setup() { Serial.begin(9600); //Se inicia la comunicación serial dht.begin(); //Se inicia el sensor } void loop() { if (Serial.available()>0){ mensaje =Serial.read(); if (mensaje=='1'){ Start=true; } else { Start=false; } } if (Start==true){ float h = dht.readHumidity(); //Se lee la humedad float t = dht.readTemperature(); //Se lee la temperatura //Se imprimen las variables Serial.println(h); delay(10); //Este delay nos servirá para la lectura de datos en Java Serial.println(t); delay(2000); //Se espera 2 segundos para seguir leyendo //datos } } **************************************************** |
Es un código sencillo. Se lee la humedad y la temperatura y se envían por medio del puerto serie. Es importante utilizar Serial.println() y un pequeño delay de 10 milisegundos. A la hora de leer los datos Java a veces se confunde. El método que utilizo yo para enviarme series de datos de Arduino a Java requiere de una secuencia, y ese pequeño delay es el que hace que todo me funcione correctamente. A continuación se muestra a que me refiero. Le he colocado una «lave», una variable del tipo boolean que iniciará o detendrá la toma de datos.
Vamos a Netbeans y creamos un proyecto, colocamos un jTable y 2 botones, uno para iniciar/detener la toma de datos y el otro para exportar a Excel.
Ahora se necesita implementar la librería Arduino para Java PanamaHitek_Arduino. La librería RXTX será necesaria en esta ocasión.
Se debe utilizar la conexión RXTX debido a que se transmitirán y se recibirán datos.
Ahora hay que establecer cómo se van a recibir los datos. En Arduino primero se envía la Humedad y luego la Temperatura. Se debe crear una variable, a la cual llamará Slot. Dependiendo del valor de Slot, se ejecutará determinada acción.
Analicemos lo que sucede aquí. La variable Slot, inicialmente tiene valor 1. Si hay un mensaje disponible, es decir, si se ha invocado el método Serial.println en Arduino, Java reconocerá que debe leer el mensaje. Se le asigna a la variable «Humedad» y se aumenta el valor de Slot hasta 2. El próximo mensaje que se reciba, se le asignará el valor a la Temperatura y el valor de Slot volverá a ser 1 y así sucesivamente.
El SerialEvent se ejecuta hasta que se lee el valor, por lo que cualquier instrucción que se coloque después del PrintMessage será despreciada. Lo que voy a hacer es lo siguiente: crearé un método que sea el que introduce en el jTable la humedad y la temperatura «al leer la humedad». Pero esto debe suceder luego de la segunda lectura, así que se declara una variable llamada Lecturas que al ser mayor que 1, permita que se desencadene el jTableUpdate.
De esta forma, al leerse el dato de temperatura, se disparará el método jTableUpdate. Agregamos las instrucciones para agregar los datos a la tabla.
Para cada ejecución del jTableUpdate, se debe agregar una fila al jTable. Esto ya lo expliqué en uno de mis anteriores aportes.
Se declara el modelo y en el jTableUpdate se agrega la fila, a la vez que se insertan los valores en las celdas. Hay que insertar el tiempo, por lo que es necesario invocar una librería en Java. Se trata de Calendar, que nos permite declarar un objeto al que yo he llamado Calendario y obtener hora, minutos y segundos para agregarlos a la tabla.
Ahora hay que programar los botones. Primero el botón de iniciar la toma de datos.
Se crea otra llave, una variable del tipo boolean para condicionar el comportamiento del botón. Si es falso, se envía un «1» para iniciar la toma de datos. De lo contrario se envía un «0» para detener la toma de datos.
Hasta aquí, el proyecto es funcional. Ya se puede apreciar lo que sucede cuando se presiona «Iniciar Toma de Datos».
Ahora estamos listos para pasar a Excel.
Uso de la Librería POI
La librería POI (que está disponible en este enlace). Ha sido diseñada especialmente para exportar documentos a Excel. Ahora voy a explicar como funciona.
Lo primero que le vamos a agregar al botón «Exportar a Excel» es un jFileChooser que nos entregue la dirección en la cual queremos guardar el fichero.
Ahora vamos a crear un método donde se cree el fichero.
Hay que crear algunos objetos: un libro, una hoja, una fila y una celda, todos elementos de Excel.
Ahora si se quiere crear una fila, se debe modificar el parámetro del método createRow(int row). Si se quiere modificar la columna entonces se debe cambiar la celda en el parámetro de createCell(int celda).
Lo primero que haré es colocar un título. Luego empezaré a imprimir todos los datos del jTable en la hoja de Excel utilizando un ciclo for. Por último, generaré un fichero que se guardará en la ruta que escogí.
En el código del botón de exportar a Excel he colocado lo siguiente:
Esto es todo. Se puede hacer la prueba y se obtendrá lo siguiente:
Los archivos que forman este proyecto los puedes descargar desde este enlace.
Por último, el tutorial completo en video:
Enhorabuena por el trabajo y la capacidad de explicarlo a nivel de 10! Saludos desde euskadi , gracias por compartirlo!
Me dedico a las telecom/informatica etc.. Me ha sido muy util tu tutorial y la verdad que da gusto la calidad y claridad de tus explicaciones; buscare los archivos y seguro que me son muy utiles!! pero sobre todo lo importante que das todas las pautas para que alguien sin excesivos conocimientos de programacion java (como yo) se animecon ello y los pueda adaptarlos a su proyecto 😉 Estoy empezando con arduino y me acabas de ayudar muchisimo con mi primer proyecto. Lo dicho , muchas gracias!! voy a hechar un vistazo mas por tu web y si alguna vez pueda ayudar o compartir algo… cuenta conmigo.
Saludos!!
Gracias por tus buenos comentarios. Saludos
Buenas tardes, aunque veo que los comentarios son de hace tiempo, me gustaria si me podrías resolver una duda. Bueno, lo primero, increible post, super explicativo y profesional, todo un placer ver estas cosas por la red. Mi problema es que de Java no se practicamente nada, y tengo un proyecto con Arduino en el cual estoy registrando datos de varios sensores electroquimicos (NO,NO2 y O3) y con uno similar al tuyo SHT75 de temp y humedad, y guardo los datos en una SD, pero me a encantado tu entorno grafico de Java que lo guarda todo en columnas en excel, yo lo estaba haciendo simplemente en un TXT de forma lo mas ordenada posible, en cada registro una linea con todos los datos obtenidos.
Bueno mi problema es un error en la funcion public Window(), me dice esto invalid method declaration; return type required. No si si me faltara alguna llave o que pasa, pero te lo agradeceria muchisimo si pudieras ayudarme.
Saludos desde Valencia
El return tipe required se debe a que probablemente el nombre de la clase donde está el método Window no es la propia palabra Window. Es un error en el nombre de la clase
No es tan sencillo con un Arduino común y corriente
Que tal buenas noches, buen post pero yo tengo una duda respecto a las librerias descargue la libreria de arduino desde sourceForge la version 2.7.3 la guarde en mi proyecto, luego baje la RXTX la descomprimi y segui un post tuyo bien explicado sobre esta libreria despues las añadi al proyecto (Libraries -> jar/folder), pero como la de arduino tenia un nombre muy largo (PanamaHitek_Arduino-2.7.3) lo deje en Arduino con su extension ,jar, despues hice como en tu video puse Ardunio arduino = new Arduino(); me marco el error y quiero importar la libreria pero no me da la opcion que puedo hacer? gracias de antemano
Tienes que instanciarla como PanamaHitek_Arduino arduino = new PanamaHitek_Arduino()
amigo por favor una pregunta por que cuando lo importo la libreria me sale package arduino does not exist ayuda por fa
Verifica la documentación de la librería
[…] Aprende a exportar datos de sensores desde Arduino a Excel, por medio de una interfaz en Java y el sensor de humedad/temperatura DHT11 […]
Hay que cambiar algunas líneas de código
Que líneas se deben modificar?
Las de la conexión Arduino-Java
Muchas Gracias Antony, me ha servido mucho con un proyecto que llevo a cabo, una pregunta, podriamos hacer una Grafica a partir de esos mismos Datos que hay en la Tabla de Java en vez de un Excel?
Sí es posible. Con JFreeCharts
Hola no puedo importar esta libreria import org.apache.poi.hssf.usermodel.HSSFWorkbook; por lo tango no me deja crear un libro
HSSFSheet hoja = libro.createSheet();
que estoy haciendo mal??
una confusion mia problema solucionado
Hola que tal este proyecto me intereso mucho, estoy empezando en arduino, una de mis dudas es si se podria poner mas sensores y como haria para que capture la temperatura de cada uno y exportarlo a excel de la misma manera
Mira este video: https://www.youtube.com/watch?v=wo4ts0osZV8
hola.
Mi interesa mucho tu proyecto.. esta muy bien explicado, Requiero hacer un proyecto similar pero las variables que quiero capturar son de peso y revoluciones por minuto, y temperaturas, es decir 4 a 6 variables aproximadamente.. mi duda es que requiero la lectura lo mas posible en tiempo real,,, esto puede ser posible, es decir que tome los valores por lo menos cada milisegundo o cual es el tiempo mínimo sugerido para dicha toma de datos o valores..
Por tus comentarios muchas gracias..
Puedes intentarlo. No estoy seguro que funcione a esa velocidad. Setea la comunicación en 115200 e inténtalo a ver que sucede
Hola, te cuento que me salio un error y lo he ensayado en varios computadores y me ha pasado lo mismo: No plugin found for prefix ‘surefire’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\user\.m2\repository), central (http://repo.maven.apache.org/maven2)] -> [Help 1]
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.
For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException
Cuando le doy clic derecho para compilar no me sale habilitado el boton de run.
Podrias por favor ayudarme?. Gracias.
Esta técnica ya es vieja. Desde entonces he publicado mejores formas de enviar datos de Arduino a Excel
tienes los links de las nuevas formas????
hola ingeniero consulta a trabajado con plx daq quiero saber si se puede enviar dos datos en paralelo al excel
No tengo experiencia con ese dispositivo. Habría que ver el protocolo de comunicación que utiliza para ver si se puede ajustar
Se podrá hacer comunicación en paralelo con Java para enviar dos datos a la vez en excel?
Como dije, falta ver el protocolo de comunicación que utiliza