Problema con el nombre de archivo en microSD SOLUCIONADO

Buenas, estoy haciendo un código en el que cada día se cree un archivo nuevo en la microSD, cuyo nombre es "diamesaño.enca.192.168.1.1". El problema con el que me encuentro es que usando la librería por defecto SD.h, cuando inserto el nombre me da error a la hora de crearlo/abrirlo. He investigado un poco y parece ser que SD.open solo admite hasta 8 caracteres. Como creo un archivo en la SD con un nombre como el que indico?
Muchas gracias

:warning:
Código corregido

Tu publicación fue ** MOVIDA ** a su ubicación actual ya que es más adecuada.

¿Podría también tomarse unos minutos para Aprenda a usar el foro .

Anteriormente he creado la variable File myFile y he iniciado la SD con SD.begin. Este es la funcion donde no se consigue leer el archivo. El resto del código esta correcto por comprobaciones realizadas en un código aparte.

void GuardarMuestra(){
  if (numero_ciclos==120){
    Serial.println("Han pasado 10 minutos");
    RTC.read();
    String dia = String(RTC.getMonthDay());
    String mes = String(RTC.getMonth());
    String anyo = String(RTC.getYear());
    String NombreArchivo = dia+mes+anyo+".inte."+"192.168.1.1";
    Serial.println("----------------------");
    Serial.println(NombreArchivo);
    Serial.println("----------------------");
    myFile = SD.open(NombreArchivo,FILE_WRITE);
    if(myFile){
      RTC.read();
      Serial.println ("Escribiendo en la SD");
      myFile.print(String(RTC.getHour()));
      myFile.print(":");
      myFile.print(String(RTC.getMinute()));
      myFile.print(",");
      myFile.print(String(n_sensor));
      myFile.print(",");
      myFile.print(analizador);
      myFile.print(",");
      if (num_X >= porcentaje_validas){
        media = media_X /120;
        myFile.print(String(media));
        C_validacion = "X";
      }
      else if(num_D >= porcentaje_validas){
        media = media_D/120;
        myFile.print(String(media));
        C_validacion = "D";
      }
      else if(num_C >= porcentaje_validas){
        media = media_C/120;
        myFile.print(String(media));
        C_validacion = "C";
      }
      else{
        myFile.print("Dato Perdido");
        C_validacion = "F";
      }
      myFile.print(",");
      myFile.print(unidad);
      myFile.print(",");
      myFile.print(String(porcentaje_muestras));
      myFile.print(",");
      myFile.print(C_validacion);
      myFile.print(",");
      myFile.println(foco);
      myFile.close();
    }
    else{
      Serial.println("Error al abrir el archivo");
    }

Esta es una funcion que me mide unas medias y unos valores realizados anteriormente y abre un archivo con el nombre "diamesaño.enca.192.168.1.1" y mete los valores en formato csv.
El problema es que aún porbando con el ejemplo de arduino si al fileName le paso un nombre como por ejemplo "HolaCaracola" no es capaz de crear el archivo. Si alguien pudiera ayudarme estaría muy agradecido.

Prueba usar la librería SDFat en lugar de SD.

Saludos

Y como exactamente implemento lo mismo que tengo yo en el código? Es el mismo código pero con otra librería? y en caso de no ser así, que tendría que hacer? SDfat tiene mucho contenido que no llego a comprender.
Gracias

Justamente estoy en una situación similar y sé que hay que hacer algunos cambios para usar SDFat aunque no estoy seguro si UNO/Nano soportan los nombres de archivo largo (por la escasa memoria).
A mi el problema me surgió al pasar un código que desarrollé en Raspberry Pi Pico (en la cual SD.h sí soporta LFN) a Nano.
Me costó darme cuenta que el problema de que no funcionase eran los nombres largos que intentaba usar.
Para las pruebas me las apañé con nombres cortos pero como ahora estoy de vacaciones el proyecto está en standby. :wink:

No dijiste que placa usas pero revisa en los ejemplos de la librería que seguro está lo que necesitas.

He estado investigando y es prácticamente lo mismo, simplemente hay que definir al principio del todo la sd:
SdFat SD;
El problema con el que me estoy encontrando ahora es el siguiente:
El nombre del archivo que quiero crear/escribir viene generado por un RTC. El nombre se genera perfectamente por que le he puesto un Serial.print(Nombre) y lo crea correctamente. El problema viene cuando le meto el nombre en la función SD.open(Nombre,FILE_WRITE). No consigue ni abrir ni crear el archivo. En cambio he probado lo mismo en un proyecto a parte y funciona perfectamente solo que el nombre se lo he puesto yo forzado. No se si se debe a que el SD no se puede ejecutar al mismo tiempo que un RTC por incompatibilidad o algo así.

Por cierto mi placa es un Arduino mega 2560.

He investigado por internet, y he encontrado que el error de lectura de la SD era por que tenía que poner un delay() entre el envío de NTP y el SD.begin(). En mi caso le he puesto 5500ms y me ha funcionado perfectamente.
Muchas gracias MaximoEsfuerzo.

Gracias, realmente no me di cuenta que era tan simple como eso.
Lo simulé en Wokwi y va de 10. :wink:

Saludos

Como nunca adjuntaste el código completo no tenemos idea de lo que estás hablando pero yo igual te creo. :grin:

Saludos

Como veo que tienes curiosidad, aquí está la parte del código a la que me refería:

void setup() {

  Serial.begin(9600); //Iniciamos el puerto serie

  //-------------Inicio NTP/UDP-------------
  Ethernet.begin(mac); //Iniciamos la comunicación con Ethernet
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());
  udp.begin(udpPort); // Iniciamos el puerto UDP
  Serial.println("RTC from NTP started");
  delay(5500);

  //---------------Inicio SD----------------
  Serial.println("Iniciando SD ...");

  if(!SD.begin(ChipSelect)){ // Iniciamos la SD
    Serial.println("No se pudo inicializar");
    return;
  }

  Serial.println ("Inicialización exitosa");

}

El código es mucho más amplio pero no creo que pueda mostrarlo por temas de seguridad. Si tienes alguna duda pregúntame al respecto a ver si te la puedo solucionar.
Un saludo

No es cuestión de curiosidad, te aseguro que el (@MaximoEsfuerzo) como muchos no necesitamos la respuesta porque la sabemos o la intuimos, pero muchos lectores si.
Cuando respondemos brindamos ayuda y corresponde que si el PO (o sea tu) encuentra la solución por su cuenta, ya sea buscándola o basado en los consejos recibidos, termine colocando como resolvió el problema para que el tópico no quede inconcluso.

Bueh...

Saludos

En realidad los 5500 mseg solo esconden un tema de habilitación entre tu placa Ethernet y la SD.
Ambas trabajan por SPI y evidentemente hay algun tema involucrado con los Chip Select.
Si se te hubiera ocurrido por al revés las cosas tal vez hubiera funcionado.
Los módulos SD en las placas Ethernet siempre han dado problemas.

En este caso la SD se inicia correctamente pero a la hora de abrir archivos da error, probando y buscando y con ayuda de MaximoEsfuerzo logré no solo crear archivos con nombres extensos si no que también arreglar este problema. No sé el porque, si es cosa interna o algo que no estoy teniendo en cuenta, pero al ponerle un delay() entre instrucciones, todo funciona.
Muchas gracias por vuestra ayuda y siento mucho no poder mostrar el código completo. Intentaré hacer uno parecido para poder subirlo.
Un saludo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.