Uno de los montajes más populares con Arduino son los data-loggers o registradores de datos, son montajes que nos permiten registrar datos provenientes de sensores a intervalos regulares de tiempo. En placas como la Arduino UNO y versiones anteriores era necesario contar con una tarjeta de memoria en la que escribir los datos o tener una aplicación en un ordenador que fuera guardando los datos que Arduino suministrara por puerto Serie, esto implicaba hacer un programa que se ejecutara en el ordenador con algún lenguaje tipo Processing, C o Python.
Desde la salida de la Arduino Leonardo este tipo de montajes se ha simplificado mucho, pues gracias a su capacidad para comportarse como un teclado USB podemos registrar los datos directamente en una hoja de cálculo o en un procesador de textos de Free Office.
El montaje y código que os propongo es la forma más sencilla que se me ha ocurrido para hacer un registrador de datos con una Arduino Leonardo. Utiliza un sensor de temperatura LM35D y parte del código que se utilizó en el tutorial del termómetro con LCD gráfico y LM35D.

Para que la Arduino Leonardo no esté continuamente lanzando pulsaciones de teclado he puesto todo el código dentro de un bucle while() que solo se activa si el pin 7 está conectado a GND y para esto basta con un simple cable de conexión. También he añadido un led puesto en el pin 13 que se ilumina mientras el registrador está trabajando.

Y el código es el que sigue:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* ================================================================== Registrador o datalogger de temperaturas Autor: Josemanu (aprovechando codigo de Antonio Moles) Version: 0.1 Fecha: 26 de junio de 2012 Descripcion: registrador de temperatura ambiente con LM35D, los datos son volcados en una hoja de calculo FreeOffice ================================================================== */ // Control temperatura int analogPin = 0; // Pin analogico 0 de Arduino float temperature = 0.0; int grados, decimas, gradR, deciR; int lm35read, tmedia; int val,cnt; // Variable para llevar la cuenta de las mediciones int contador = 0; // Pines que utilizaremos int indicador = 13; // Un led en el pin 13 brillara mientras el registrador // este funcionando int interruptor = 7; // Al poner el pin 7 a 5v el registrador funcionara void setup() { // ponemos indicador como salida por que ira un led pinMode(indicador, OUTPUT); // el pin interruptor lo ponemos como salida y activamos la resistencia // pullup interna, asi para activarlo nos basta con un simple puente pinMode(interruptor, INPUT_PULLUP); // Iniciamos comunicacion serie Serial.begin(9600); // Iniciamos el teclado Keyboard.begin(); } void loop() { // Solo funcionara el registrador si el pin interruptor // esta puesto a GND while(!digitalRead(interruptor)) { // encendemos el led que indica que el registrador funciona digitalWrite(indicador, HIGH); // inicializamos el valor de tmedia tmedia=0; // medimos la temperatura 10 veces y la almacenamos en tmedia for (cnt=0; cnt<10; cnt++) { lm35read = analogRead(analogPin); tmedia=tmedia+lm35read; } // calculamos la media de las medidas tmedia=tmedia/cnt; // convertimos tmedia en un valor en grados, pero // dadas las caracteristicas del sensor la precision es de // 0.5 grados y los decimales son .4 o .9 temperature = (5.0 * float(tmedia) * 100.0)/1024.0; // mapeamos el valor tmedia para que nos de // la temperatura en decimas de grado val = map(tmedia,0,1023,0,4990); // ahora los grados los obtenemos dividiendo por 10 grados=val/10; // y las decimas de grado son el resto de la division // por 10 decimas=val%10; // Redondeamos los decimales a 0 o a 5 if (decimas< 3) { gradR=grados; deciR=0; } else if ((decimas > 2)&(decimas<7)) { gradR=grados; deciR=5; } else if (decimas >= 7) { gradR=grados+1; deciR=0; } // Incrementamos el contador contador++; // Sacamos los datos por el puerto serie Serial.print("Medida num "); Serial.print(contador); Serial.print(" temperatura "); Serial.print(gradR); Serial.print("."); Serial.println(deciR); // Vamos a por el teclado Keyboard.print(contador); // escribe el numero de medida Keyboard.press(KEY_TAB); // pulsa el tabulador delay(150); // espera 150ms Keyboard.release(KEY_TAB);// libera la tecla de tabulador Keyboard.print(gradR); // escribe la temperatura delay(100); Keyboard.print(","); delay(100); Keyboard.print(deciR); Keyboard.press(KEY_RETURN); // pulsa enter delay(150); // espera 150ms Keyboard.release(KEY_RETURN);// libera enter // espera 5 minutos delay(1000L*60L*5L); } // apaga el led al salir del bucle while() digitalWrite(indicador, LOW); } |
También puedes descargarlo desde aquí.
Como es un ejemplo sencillo el intervalo entre una medición y la siguiente se ha implementado a lo bestia con un delay(), lo cual ya sabemos que no es lo más efectivo, sería mejor haberlo hecho con un control de tiempos como el del ejemplo BlinkWithoutDelay, lo dejo para una futura versión.
Los datos salen tanto por el teclado como por el puerto serie.
Para utilizarlo solo tenemos que abrir una hoja de cálculo de Free Office, seleccionamos la celda en la que empezará a escribir los datos, poner el sensor de temperatura en el lugar deseado (en mis pruebas una ventana), conectar la Arduino Leonardo al ordenador por USB y poner el puente entre el pin 7 y GND. Arduino Leonardo escribirá el número de medición en la celda seleccionada y en la siguiente la temperatura, así irá completando dos columnas de datos mientras esté conectado.
Si tienes la picardía de apuntar la hora a la que comienza el registro de datos luego se puede saber a que hora corresponde cada medida… ahora que lo pienso, seguro que Free Office tiene alguna función para apuntar la hora del sistema en la celda seleccionada, ya lo miraré.
Esta es la gráfica que he hecho con los datos recogidos durante la noche del 26 de junio de 2012, la primera medida se tomó a las 00:20 horas.

Interesante proyecto, en cuanto termine del mio. Me pondré hacer algo de este estilo para el arduino UNO.
Buenos días,
Según entiendo, lo que estás haciendo es descargar los datos en el PC directamente.
Lo que siempre he entendido como data logger es un almacenamiento de datos durante un tiempo, para luego descargarlos al PC cuando los necesites.
¿Se puede hacer?
A ver, este es un ejemplo muy sencillo de data logger, tan sencillo que los datos se vuelcan directamente en una hoja de cálculo de Free Office. ¿Se pueden guardar los datos dentro de una micro-SD y volcarlos cuando queramos en el PC? por supuesto que si, pero ya no sería un ejemplo sencillo.
Una duda, he cometido el grave error de no meter todo el programa en un bucle while() y el arduino leonardo no para de escribir, ¿Habría solución?
Pues puedes subir el código presionando antes el botón de reset de la placa, paciencia, te puede costar un par de intentos.