Hola buenas, estoy haciendo un programa con una pantalla TFT que tiene para SD card. El problema es que quiero escribir texto desde el comienzo del archivo, pero no puedo. Ej:
En el archivo:
hola
123
abc
Quiero escribir buenas, y que quede así:
buenas
hola
123
abc
Lo que puedes hacer es leer (xxx.read()) todo el contenido de la SD y guardas a una variable, luego regresa la posicion del "cursor" al inicio (xxx.seek(0)), escribe (xxx.println("buenas\n")) la palabra "buenas" y a continuacion escribe el resto desde la variable.
Hola Kike_GL! Gracias por responder. Me parece buena idea tu sugerencia, pero no sé si es muy viable en mi caso, ya que estoy haciendo un registro para unos sensores. A la larga, el archivo va a almacenar mucho texto y no sé si es bueno cargarlo todo en la memoria.
Hola surbyte! Gracias por la respuesta. No sé si entendí muy bien tu idea. ¿Decís que escriba una forma de identificar el texto? Ej:
1-hola
2-123
3-abc
4-buenas
¿Y luego leerlo de la forma que necesite?
Un poco de información que debería haber dado:
Uso Arduino Mega. Lamentablemente compré una copia, no una original, no supe identificarlo en el sitio web donde compré. No sé si puede afectar.
Uso una TFT con ranura para SD.
Este es el código de la parte que escribe datos en la SD:
//Registrar
//Abrir el archivo
file = SD.open("reg.txt", FILE_WRITE);
//Mover el cursor al comienzo del archivo (No lo hace)
file.seek(0);
//Escribir el texto en el archivo (Esto funciona bien)
file.print("[");
//Fecha
if (rtc_day < 10) {file.print("0");}
file.print(String(rtc_day) + "/");
if (rtc_month < 10) {file.print("0");}
file.print(String(rtc_month) + " ");
//Hora
if (rtc_hour < 10) {file.print("0");}
file.print(String(rtc_hour) + ":");
if (rtc_minute < 10) {file.print("0");}
file.print(String(rtc_minute) + "] ");
file.print("Prom:" + String(averageSensor) + " S1:" + String(sensor0) + " S2:" + String(sensor1) + " S3:" + String(sensor2) + " S4:" + String(sensor3) + " S5:" + String(sensor4));
file.println(" ON AUTO");
//Cerrar el archivo
file.close();
Mi idea es hacer un registro y que se pueda leer desde la TFT, pero que lea las primeras líneas y ya. Pero si debe recorrer hasta el final del archivo y leer el txt hacia atras me parace algo complicado de hacer.
Deberías plantearte utilizar un RTC o una conexión a internet para obtener la hora. Luego guardas cada dato con un Timestamp y es relativamente sencillo ubicar el ultimo dato, ademas esta el plus de obtener un historial detallado.
Saludos
Estuve pensando en la forma que me sugirió surbyte, y creo que puedo hacer algo así.
Lo que hice fue que empiezo a leer desde abajo hacia arriba, y voy contando los saltos de líneas. Entonces, al llegar a la cantidad de líneas que necesito, leo desde la posición actual hasta el final.
Dejo el código que utilizo por si, en algún futuro, le sirve a alguien más:
//Leer una vez para escribir en la TFT
file = SD.open("reg.txt");
if (file){
file.seek(file.size()-1);
//Variable para comprobar si ya puede leer
bool is_ready_to_read = false;
while (file.available()){
//Leer el valor y almacenarlo en una variable
char character = file.read();
//Variable para comprobar si hay texto hacia atras
bool is_text;
//Mover el cursor hacia atras
if (is_ready_to_read == false){
//Volver atras en el texto
is_text = file.seek(file.position()-2);
//Anotar la cantidad de líneas
if (character == '\n' && is_text) {check_print_line++;}
//Comprobar si ya puede leer
if (check_print_line == 10 || is_text == false) {is_ready_to_read = true;}
}
if (is_ready_to_read) {tft.print(character);}
}
file.close();
}