Materiales:
- 1 Modulo SD o Micro SD.
CÓDIGO: (Leer un archivo de la SD con nuestro Arduino).
Previamente creamos un archivo de hoja de texto, por ejemplo archivo.txt, e ingresamos el texto que posteriormente vamos a leer desde Arduino.
#include SD.h; File myFile; void setup() { Serial.begin(9600); Serial.print("Iniciando SD ..."); if (!SD.begin(4)) { Serial.println("No se pudo inicializar"); return; } Serial.println("inicializacion exitosa"); myFile = SD.open("archivo.txt");//abrimos el archivo if (myFile) { Serial.println("archivo.txt:"); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); //cerramos el archivo } else { Serial.println("Error al abrir el archivo"); } } void loop() { }
Ver los resultados en el MONITOR SERIAL.
CÓDIGO: (Leer datos desde la SD, Manipulando leds desde la SD).
Vamos a leer el archivo desde la SD y realizar acciones con esos datos.
En un archivo de texto vamos a guardar datos para encender y apagar leds y con esto ejecutar diferentes secuencias que estarán guardadas en la SD.
Conectamos ocho leds en los pines del 2 al 10, excluyendo el 4, con su resistencia respectiva.
Desde la PC armamos en una hoja de texto las secuencias que deseemos realizar y guardamos en la SD y lo guardamos con el nombre de leds.txt
#include SD.h; File myFile; int UltimaPocicion=0; int pausa=1000; int PinLeds[8]={2,3,5,6,7,8,9,10};//Pines de los Leds void setup() { Serial.begin(9600); Serial.print("Iniciando SD ..."); if (!SD.begin(4)) { Serial.println("No se pudo inicializar"); return; } Serial.println("inicializacion exitosa"); for(int i=0;i<8;i++) { pinMode(PinLeds[i],OUTPUT); } } void loop() { myFile = SD.open("Leds.txt");//abrimos el archivo int totalBytes=myFile.size(); String cadena=""; if (myFile) { if(UltimaPocicion>=totalBytes) UltimaPocicion=0; myFile.seek(UltimaPocicion); //--Leemos una línea de la hoja de texto-------------- while (myFile.available()) { char caracter=myFile.read(); cadena=cadena+caracter; UltimaPocicion=myFile.position(); if(caracter==10)//ASCII de nueva de línea { break; } } //--------------------------------------------------- myFile.close(); //cerramos el archivo Serial.print("Cadena Leida:"); Serial.print(cadena); //-----------procesamos la cadena------------ int index=0; char c=cadena[index++]; pausa=0; while (c >= '0' && c <= '9') { pausa = 10*pausa + (c - '0'); c = cadena[index++]; } Serial.print("pausa="); Serial.print(pausa); Serial.print(" LEDS |"); for(int i=0;i<8;i++) { if(cadena[index+i*2]=='1') { digitalWrite(PinLeds[i], HIGH); Serial.print(" 1 |"); } else { digitalWrite(PinLeds[i], LOW); Serial.print(" 0 |"); } } Serial.println(); Serial.println(); } else { Serial.println("Error al abrir el archivo"); } delay(pausa); }
Leemos una línea de la SD la procesamos y mostramos la secuencia en los leds durante el tiempo que también obtenemos desde la SD, es necesario después de cada lectura guardar la última posición de memoria para que en la segunda lectura continuemos la lectura desde esa posición, esto porque después de cada lectura cerramos el archivo.
Ver los resultados en el MONITOR SERIAL.
CÓDIGO: (Guardando datos en la SD (Datalogger)).
En este ejemplo guardaremos información de variables y sensores en nuestra SD.
Para simular los sensores utilizamos 3 potenciómetros que deben estar conectados a los pines A0, A1 y A2 del Arduino.
#include SD.h; File myFile; void setup() { Serial.begin(9600); Serial.print("Iniciando SD ..."); if (!SD.begin(4)) { Serial.println("No se pudo inicializar"); return; } Serial.println("inicializacion exitosa"); } void loop() { myFile = SD.open("datalog.txt", FILE_WRITE);//abrimos el archivo if (myFile) { Serial.print("Escribiendo SD: "); int sensor1 = analogRead(0); int sensor2 = analogRead(1); int sensor3 = analogRead(2); myFile.print("Tiempo(ms)="); myFile.print(millis()); myFile.print(", sensor1="); myFile.print(sensor1); myFile.print(", sensor2="); myFile.print(sensor2); myFile.print(", sensor3="); myFile.println(sensor3); myFile.close(); //cerramos el archivo Serial.print("Tiempo(ms)="); Serial.print(millis()); Serial.print(", sensor1="); Serial.print(sensor1); Serial.print(", sensor2="); Serial.print(sensor2); Serial.print(", sensor3="); Serial.println(sensor3); } else { Serial.println("Error al abrir el archivo"); } delay(100); }
Ver los resultados en el MONITOR SERIAL.
Luego si colocamos la SD en nuestra PC podemos ver los datos generados.
CÓDIGO: (Exportando datos de nuestro datalogger a Excel).
En este caso los datos lo almacenaremos en forma de tabla pero solo en formato .csv no archivo de hoja de cálculo, en el cual lo trabajaremos como si fuera una hoja de texto, las columnas lo separaremos por comas (u otro separador) y las filas por saltos de línea.
Para Excel también se podría trabajar en un archivo txt, pero en la extensión csv tenemos la posibilidad de importar no solo a Excel sino a otros programas como Calc de LibreOffice, Gnumeric, matlab o sistemas web.
#include SD.h; File myFile; void setup() { Serial.begin(9600); Serial.print("Iniciando SD ..."); if (!SD.begin(4)) { Serial.println("No se pudo inicializar"); return; } Serial.println("inicializacion exitosa"); if(!SD.exists("datalog.csv")) { myFile = SD.open("datalog.csv", FILE_WRITE); if (myFile) { Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)"); myFile.println("Tiempo(ms),Sensor1,Sensor2,Sensor3"); myFile.close(); } else { Serial.println("Error creando el archivo datalog.csv"); } } } void loop() { myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos el archivo if (myFile) { Serial.print("Escribiendo SD: "); int sensor1 = analogRead(0); int sensor2 = analogRead(1); int sensor3 = analogRead(2); myFile.print(millis()); myFile.print(","); myFile.print(sensor1); myFile.print(","); myFile.print(sensor2); myFile.print(","); myFile.println(sensor3); myFile.close(); //cerramos el archivo Serial.print("Tiempo(ms)="); Serial.print(millis()); Serial.print(",sensor1="); Serial.print(sensor1); Serial.print(",sensor2="); Serial.print(sensor2); Serial.print(",sensor3="); Serial.println(sensor3); } else { // if the file didn't open, print an error: Serial.println("Error al abrir el archivo"); } delay(100); }
Similar al del ejemplo anterior con la diferencia que al inicio del archivo necesitamos poner el nombre de los campos o encabezado, esto lo hacemos en setup() si el archivo no existe ,entonces creamos uno y seguidamente escribimos la primera fila, para posteriormente en el void loop() solo dedicarse a escribir los datos, como el archivo ya ha sido creado, cada vez que se reinicie o se encienda el Arduino continuara escribiendo desde la última posición, si desean reanudar todo, deberán manualmente desde la pc eleiminar el archivo o por código en setup() remover el archivo con SD.remove(filename).
La salida del monitor serial es igual al del ejemplo anterior, pues solo se ha cambiado la forma de guardar en la SD:
Ver los resultados en el MONITOR SERIAL.
Después de obtener los datos que deseamos, el siguiente paso es ingresar la memoria SD a la PC ya con los datos guardados por nuestro Arduino.
Al ingresar a la SD deben encontrar el archivo DATALOG.CSV, posteriormente abrimos Excel y en la barra de menús vamos a Datos y luego a Obtener datos externos – Desde texto.
Paso 1: Elegimos el archivo que deseamos importar, en nuestro caso datalog.csv y nos abrirá el asistente de importación, en el primer paso escogemos archivos delimitados.
Paso 2: en separadores marcamos coma.
Paso 3: dejamos todas las columnas en general.
Paso 4: Dar click en finalizar y escoger el lugar en donde se va iniciar la tabla.
Paso 5: Finalmente tenemos los datos ya disponibles en Excel.
El procedimiento para es similar para otras versiones de MS Excel, Libreoffice CALC y otros programas de hojas de cálculo.