Leer datos de una SD (ESP32) y copiarlos otra SD

Muy buenas, he estado buceando por la red y no he conseguido la información para saber si mi proyecto puede ser viable a no. Decir antes de nada, que no soy un super entendido, por lo que agradecería toda ayuda.

Os explico un poco lo que necesitaría:

El caso es que tendría que recibir datos en un ESP32 a tráves de USB, e ir volcando los datos a una tarjeta SD conectada al propio ESP32.

Sería esto posible?
Resultaria más fácil leerlos de una tarjeta SD en vez de un USB?
Necesitaría obligatoriamente usar un shield usb?

No estoy muy seguro de si mi duda la estoy presentando en el lugar correcto, disculpas en caso de no ser así.

Un saludo!

El caso es que tendría que recibir datos en un ESP32 a tráves de USB, e ir volcando los datos a una tarjeta SD conectada al propio ESP32.

Datos a través de USB implica que éstos vienen de otro dispositivo.
Luego dices que esos datos deben guardarse en el ESP32. No te entiendo.

Si el ESP32 tiene un módulo SD pues directamente los guardas ahi con la librería correspondiente.

Seguramente no te estoy comprendiendo.

Se mas preciso. Los datos qué son, quien los lee, porque involucras USB en todo esto?

Disculpa, la verdad es que no me he explicado todo lo bien que debería.

De alguna manera, tengo que poder recibir datos de un dispositivo externo, el cúal tiene que ser por cable, en este caso sería a tráves por ejemplo, de un movil conectado por USB.

Efectivamente, la idea es guardarlo directamente en un módulo de sd. Lo que no sé es como acceder/recoger los datos, que tipo de solución podía encontrar para llegar a conseguir lo que necesito.

Los datos en un principio serían bmps, se leen con el propio ESP32 y los guarda en una sd.

bmps? no sé que son.

En fin. El dispositivo si es un Android debe usar un cable OTG y si no lo es, mientras tu puedes comunicarte con una PC via Serial, no deberías tener problema.

Que se comunique con la PC no asegura nada, solo que ese paso ya lo tienes resuelto. Luego debes saber qué envía y poder leer los datos, separarlos para luego guardarlos con el ESP32 en la SD.

Muy misterioso tu comentario, ya que no dices que dispositivo es y para mi resulta en una perdida de tiempo
querer ayudarte rápidamente y sin embargo debo reclamar que sigo sin entender parte del proceso.

Si consultas en un foro publico, debes explicar debidamente el contexto.

Ej: Tengo un dispostivo llámese una Tablet que se comunicará con un ESP32 via USB y luego debo guardar los datos en su SD.

Simple en una linea y se comprende todo.

El dispositivo, como había comentado, sería un movil (android).
Android-->cable(otg)-->esp32-->escrbir en una módulo SD.

Misterio? ninguno, simplemente no soltar un tocho, que me quede corto de información, es otro tema.

Los archivos que se han de pasar son bmp, como ya había comentado. No entiendo muy bien si lo de no saber que es, es por hacer la gracia o tiene algún otro fin.

Sobre lo de explicarse en una línea, me pides más información y luego en cambio que debo explicarme en una simple línea? Curioso.

Me voy a reservar varios comentarios porque no construyen pero te pido leas las normas del foro y en tu caso, prestes atención a cómo se debe presentar un problema.
Asi evitamos este debate que lleva tiempo.

Lo que quieres hacer involucra muchos elementos y conocimientos que no se si estan o no a tu alcance pero creo que ese no es el problema, tu ahora quieres ver si es o no factible.

El dispositivo Android deber tener un programa que interactúe con el sketch del ESP32 enviando datos via USB.
Yo comenzaría por ahi y una vez que logres eso, es solo enviar bytes.
En el Android sea Smartphone o Tablet debes seleccionar un archivo, y luego ese programa interactuará con el ESP32 enviado byte a byte.
Al finalizar debería enviar alguna byte especial para que el ESP32 reconozca que se ha terminado el envío del archivo y pueda cerrar el archivo en la SD.

Todo esto, no entiendo para que sirve siendo que es posible y mucho mas fácil hacerlo en Android, pero supongamos que no interese y tenga otra finalidad.

Esos son los pasos que yo daria.

Muchas gracias por la ayuda.

Al final, descartado el paso de la aplicación desde un dispositivo android, mi intención es la de leer una tarjeta micro SD, que hará la función de tarjeta externa y con posibilidad de extraerla, para copiarla a una tarjeta micro SD interna.

El motivo de realizarlo con dos SD? Debo hacerlo así, ya que la tarjeta que quedará interna, es la que sumistrará los datos a un segundo chip, que será el encargado de hacer otra tarea.

De momento he conseguido leer la sd externa sin problema, pero tengo la duda si será posible el paso de escribirlo en una segunda?

En este paso ya tengo problemas, por lo que he visto, el esp32 dispone de 3 uart, como podría pasarlos a la tarjeta interna? puedo conectarl/usar otra uart disponible?

Por otra parte, necesito que se lleve a cabo el proceso, en no más de 1 minuto, teniendo en cuenta que en el peor de los casos, los archivos a pasar no han de superar los 2mb. En este caso, lo que me va a limitar la transferencia en el propio chip, no?

Buenas,

Estoy intentando leer datos para luego escribirlos en una SD, y necesito hacerlo de la manera mas rápida y eficiente posible. Hablo de archivos que como mucho han de ocupar 2mb.

Leyendo y escribiendo cada en el mismo paso, es decir, cada vez que leo un byte, lo escribo, me ralentiza mucho, superando el minuto y medio para 2mb. Necesito rebajarlo al menos, si fuese posible, a unos 30 segundos.

He intentado hacerlo creando un buffer, pero no soy capaz, necesitaría ayuda para intentar buscar una solución.

Un saludo!

Tal vez un buffer, como dices, sea la solución. Explica por qué no logras hacerlo.

Pues pongo un ejemplo:

Archivo original
File myFile = SD.open("/foto.jpg");

Hago esto para crear en la sd un archivo
File newFile = SD.open("/fotoNueva.jpg", FILE_WRITE);

Luego voy rellenando el buffer, pero una vez lo quiero escribir, no puedo hacer esto:
newFile.write(buffer);

No encuentro el modo de pasarle el buffer al realizar el write, con lo que tendria que recorrerlo y enviarlo, con lo que me resulta mas pesado el proceso.

Qué tipo de datos de buffer?
Según la documentación, deberías usar newFile.write(buffer, tamano); siendo buffer un array de byte.

Si pones el archivo fuente completo, indicando dónde es el problema, seguramente te podremos ayudar mejor.

byte buffer[511];
        byte b;
        int cont = 0;
        File myFile = SD.open("/foto.jpg");
        File newFile = SD.open("/fotoNueva.jpg", FILE_WRITE);
        if (myFile)
        {
            byte data[1];
            while (myFile.available())
            {
                int cont = 0; 

                b = myFile.read();
                buffer[cont] = n;
                cont++;
                if (cont == 512)
                {
                   newFile.write(buffer, 512);
                    cont = 0;
                }
            }
            myFile.close();
        }

Ahora me doy cuenta que estas abriendo muchos hilos relacionados con esto.
Confirma por favor, y en ese caso tendre que unirlos.

No se puede leer nada de lo que has posteado recién.

Se debe a que todo presenta esta característica

[color=#d4d4d4][color=#569cd6]byte[/color][/color]

EDITO:
Como era de esperar tuve que hacerlo yo.

Si, el tema al final es el mismo, pero al tener más de software que de hardware, decidí abrir uno nuevo en el correspondiente. Se podría unificar o incluso borrar el otro y seguir solo en uno.

Estoy intentado leer de una SD y luego pasarlo a otra SD, con el sp32, el tema es que con la librería que estoy usando (SD.h), no puedo acceder a la segunda SD, usando SD1.

Navegando por la red, he visto ejemplos donde si lo usan, pero en cambio yo no consigo hacerlo.

Es posible, usar dos SD, leer de una y copiar en una segunda SD?
Debería usar otra librería y no la que he usado?

Hilos unidos. No abras mas hilos que tengan el mismo objetivo. Concentra todo en el mismo topico.
Y Fed-Ex presta atención a las normas del foro, no te lo advertiré nuevamente.
Si tienes dudas no asumas nada, me consultas por privado y lo resolvemos. Pero si te pido que edites algo no lo dejes pasar okay?

Cuando lees algo de una SD tienes que crear un objeto, dicho objeto apunta a pines, y tienes ciertas consideraciones iniciales. del mismo modo puedes crear otro objeto, que apunte a otros pines. Entonces copiar de uno a otro es tan simple como leer de uno y grabar en el otro objeto.

He visto que me has ayudado con la duda que acabo de plantear, pero estoy igual que antes, o más perdido.

En mi caso, tengo dos sd conectadas, cada una tiene un pin por el cúal estableceré la conexión a la hora de hacer un begin(pin), hasta aqui, todo bien, creo.

El caso es que intento crear un objeto sd, pero no encuentro la manera, necesito crear un objeto sd para realizar cada conexión?
Debo abrir una conexión para la segunda tarjeta, del mismo modo que abro la conexión para la primera?

SD.begin(4);
  if (!SD.begin())
  {
    Serial.println("SD 1 Mount Failed");
    return;
  }else{
    File f = SD.open(/text.txt, FILE_READ);
    while (f.available())
          {
            b = f.read();
            // ahora tendría que escribir en la segunda SD
            // al igual que puedo hacerlo con un puerto seria, donde dispongo de Serial.print
            // y Serial1.print para escribir, pensaba que podría hacer lo mismo con SD
            
          }
  }

Siento si alguna de mis dudas es obvia, pero estoy iniciandome en arduino, gracias por vuestra paciencia :slight_smile:

Si no te respondo , no es porque sea obvio o no, es porque no tengo tiempo, y rsponder algo como lo que planteas requiere hacerlo con cuidado.
Porque se plantean temas tan complejos, yo no ando en auto de carrera si no se manejar. hay que dar pasos simples antes.
Dejame ver si no me gana alguien y te responde.