/*
Capitulo 37 de Arduino desde cero en Español.
Mediante un modulo lector de memoria MicroSD conectado mediante interfaz SPI
crearemos un archivo de texto de prueba y grabaremos una linea en el mismo,
luego haremos la apertura para su lectura y asi verificar el correcto funcionamiemto.
Autor: bitwiseAr
*/
#include <SPI.h> // incluye libreria interfaz SPI
#include <SD.h> // incluye libreria para tarjetas SD
#define SSpin 10 // Slave Select en pin digital 10
File archivo; // objeto archivo del tipo File
int Inicio; // Posicion desde la cual comenzó a buscar el numeral proximo
int Fin; // Posicion en la cual encontró el numeral
int Largo; // Largo de la ultima fila leida
char Dir; // Direccion en la que va; proximo/anterior P/A
String Registro; // Donde se almacena el registro actual seleccionado para poder parsearlo e imprimirlo.
void setup() {
Serial.begin(9600); // inicializa monitor serie a 9600 bps
Serial.println("Inicializando tarjeta ..."); // texto en ventana de monitor
if (!SD.begin(SSpin)) { // inicializacion de tarjeta SD
Serial.println("fallo en inicializacion !");// si falla se muestra texto correspondiente y
return; // se sale del setup() para finalizar el programa
}
SD.remove("log.txt");
Serial.println("inicializacion correcta"); // texto de inicializacion correcta
archivo = SD.open("log.txt", FILE_WRITE); // apertura para lectura/escritura de archivo prueba.txt
if (archivo) {
archivo.println("28/10/2023 17:43, 20 , 0 ,r1#"); // escritura de una linea de texto en archivo
archivo.println("29/10/2023 16:45, 22.3, 108,r2#"); // escritura de una linea de texto en archivo
archivo.println("30/10/2023 14:49, 23 , 43 ,r3#"); // escritura de una linea de texto en archivo
archivo.println("01/11/2023 12:45, 24.5, 7 ,r4#"); // escritura de una linea de texto en archivo
archivo.println("28/10/2023 17:43, 20 , 0 ,r5#"); // escritura de una linea de texto en archivo
archivo.println("29/10/2023 16:45, 22.3, 108,r6#"); // escritura de una linea de texto en archivo
archivo.println("30/10/2023 14:49, 23 , 43 ,r7#"); // escritura de una linea de texto en archivo
archivo.println("01/11/2023 12:45, 24.5, 7 ,r8#"); // escritura de una linea de texto en archivoSerial.println("Escribiendo en archivo prueba.txt..."); // texto en monitor serie
Serial.println("escritura correcta"); // texto de escritura correcta en monitor serie
} else {
Serial.println("error en apertura de prueba.txt"); // texto de falla en apertura de archivo
}
archivo.close(); // cierre del archivo
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'P');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
leer_registro(Inicio, Fin, Largo, 'A');
printVariables();
}
void printVariables(){
// Imprimo variables de control en el monitor.
Serial.print("Inicio: ");
Serial.print(Inicio);
Serial.print(" - Fin: ");
Serial.print(Fin);
Serial.print(" - Largo: ");
Serial.println(Largo);
}
int leer_registro(int desde, int hasta, int cuanto, char direccion) {
archivo = SD.open("log.txt", FILE_READ); // apertura de archivo
if (archivo) {
if (direccion == 'P'){ // Avance Proximo
if ((archivo.available()>(hasta+cuanto))){ //Verifico que no sea fin del archivo.
Inicio = hasta; // Determino el inicio en un avance
}
else{ // Si es fin de archivo l oaviso y no modifico las variables.
// Imprimo en el serial que ya no hay mas registros.
Serial.println(" Final de archivo");
}
}
if (direccion == 'A'){ //Retroceso Anterior
Inicio = desde-cuanto-1; // Determino el inicio en un retroceso.
}
if (Inicio <0){
Inicio = 0; // Controlo que no se pase del inicio para atras.
Serial.println(" Inicio de archivo");
}
archivo.seek(Inicio); //Posiciono el cursor en el registro que quiero leer
String line = archivo.readStringUntil('#'); // Leo desde la posicion del registro hasta encontrar un numeral
Serial.println(line); //Imprimo el registro
Registro = line; //Guardo en una variable global el vlor del registro para luego trabajarlo e imprimirlo en el display
Largo = line.length(); // Le sumo 1 porque readstringuntil descargó el #
Fin = Inicio + Largo +1; // Determino el nuevo final sumando el inicio y sumando 1 por el nuemral
archivo.close(); // cierre de archivo
} else {
Serial.println("error en la apertura de prueba.txt");// texto de falla en apertura de archivo
}
}
void loop() { // funcion loop() obligatoria de declarar pero no utilizada
// nada por aqui
}