Registrador de datos con Arduino Leonardo

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.

arduino lm35

Conexión del LM35D a Arduino

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.

arduino leonardo lm35d

Así queda el montaje

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.

registrador de datos (datalogger) con Arduino Leonardo y LM35D

Gráfico de temperaturas

5 Comments

  1. Interesante proyecto, en cuanto termine del mio. Me pondré hacer algo de este estilo para el arduino UNO.

  2. 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.

  3. 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.

Deja un comentario

Required fields are marked *.