Autor Tema: Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main  (Leído 4757 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« en: 20 de Octubre de 2022, 23:26:12 »
Ante todo, un cordial saludo para todos deseando que se encuentren todos bien, bueno al grano.
He realizado el ejemplo del Esp32 para usar una tarjeta microSD como medio de almacenamiento de datos, la idea es la de un datalogger. El ejemplo funciona perfectamente bien, se crea un archivo llamado hello.txt y luego se le cambia el nombre a foo.txt.
Ahora en mi proyecto obtengo la fecha usando el rtc del mismo Esp32 y en una variable del tipo array formateo la fecha solo con el día y el mes en curso. Ahora ese char que lo llamaremos fecha (char fecha []="20 OCTOBER") solo, por ejemplo; a ese char lo quiero usar como nombre para un nuevo archivo de datos ósea que al siguiente día si por ejemplo el primer archivo se llama 20 OCTOBER y cuando la fecha cambia a 21 OCTOBER, se me crea un nuevo archivo con ese nombre. Mi objectivo es poder tener separados los datos en archivos diferentes por cada dia.
Ahora les voy a dejar el código de ejemplo del esp32 y voy a mostrar lo que he intentado.
Espero y me puedan entender y mas aun me puedan ayudar. Muchas gracias a todos.

Código: [Seleccionar]
/* SD card and FAT filesystem example.
   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/

// This example uses SPI peripheral to communicate with SD card.

#include <string.h>
#include <sys/unistd.h>
#include <sys/stat.h>
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"

static const char *TAG = "example";

#define MOUNT_POINT "/sdcard"

// Pin mapping
#if CONFIG_IDF_TARGET_ESP32

#define PIN_NUM_MISO 2
#define PIN_NUM_MOSI 15
#define PIN_NUM_CLK  14
#define PIN_NUM_CS   13

#elif CONFIG_IDF_TARGET_ESP32S2

// adapted for internal test board ESP-32-S3-USB-OTG-Ev-BOARD_V1.0 (with ESP32-S2-MINI-1 module)
#define PIN_NUM_MISO 37
#define PIN_NUM_MOSI 35
#define PIN_NUM_CLK  36
#define PIN_NUM_CS   34

#elif CONFIG_IDF_TARGET_ESP32C3
#define PIN_NUM_MISO 6
#define PIN_NUM_MOSI 4
#define PIN_NUM_CLK  5
#define PIN_NUM_CS   1

#endif //CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2

#if CONFIG_IDF_TARGET_ESP32S2
#define SPI_DMA_CHAN    host.slot
#elif CONFIG_IDF_TARGET_ESP32C3
#define SPI_DMA_CHAN    SPI_DMA_CH_AUTO
#else
#define SPI_DMA_CHAN    1
#endif


void app_main(void)
{
    esp_err_t ret;

    // Options for mounting the filesystem.
    // If format_if_mount_failed is set to true, SD card will be partitioned and
    // formatted in case when mounting fails.
    esp_vfs_fat_sdmmc_mount_config_t mount_config = {
#ifdef CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILED
        .format_if_mount_failed = true,
#else
        .format_if_mount_failed = false,
#endif // EXAMPLE_FORMAT_IF_MOUNT_FAILED
        .max_files = 5,
        .allocation_unit_size = 16 * 1024
    };
    sdmmc_card_t *card;
    const char mount_point[] = MOUNT_POINT;
    ESP_LOGI(TAG, "Initializing SD card");

    // Use settings defined above to initialize SD card and mount FAT filesystem.
    // Note: esp_vfs_fat_sdmmc/sdspi_mount is all-in-one convenience functions.
    // Please check its source code and implement error recovery when developing
    // production applications.
    ESP_LOGI(TAG, "Using SPI peripheral");

    sdmmc_host_t host = SDSPI_HOST_DEFAULT();
    spi_bus_config_t bus_cfg = {
        .mosi_io_num = PIN_NUM_MOSI,
        .miso_io_num = PIN_NUM_MISO,
        .sclk_io_num = PIN_NUM_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = 4000,
    };
    ret = spi_bus_initialize(host.slot, &bus_cfg, SPI_DMA_CHAN);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to initialize bus.");
        return;
    }

    // This initializes the slot without card detect (CD) and write protect (WP) signals.
    // Modify slot_config.gpio_cd and slot_config.gpio_wp if your board has these signals.
    sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
    slot_config.gpio_cs = PIN_NUM_CS;
    slot_config.host_id = host.slot;

    ESP_LOGI(TAG, "Mounting filesystem");
    ret = esp_vfs_fat_sdspi_mount(mount_point, &host, &slot_config, &mount_config, &card);

    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount filesystem. "
                     "If you want the card to be formatted, set the EXAMPLE_FORMAT_IF_MOUNT_FAILED menuconfig option.");
        } else {
            ESP_LOGE(TAG, "Failed to initialize the card (%s). "
                     "Make sure SD card lines have pull-up resistors in place.", esp_err_to_name(ret));
        }
        return;
    }
    ESP_LOGI(TAG, "Filesystem mounted");

    // Card has been initialized, print its properties
    sdmmc_card_print_info(stdout, card);

    // Use POSIX and C standard library functions to work with files.

    // First create a file.
    const char *file_hello = MOUNT_POINT"/hello.txt";

    ESP_LOGI(TAG, "Opening file %s", file_hello);
    FILE *f = fopen(file_hello, "w");
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for writing");
        return;
    }
    fprintf(f, "Hello %s!\n", card->cid.name);
    fclose(f);
    ESP_LOGI(TAG, "File written");
    char new_nom[]"nueva_fecha.txt";//por ejemplo aqui tendria los datos de la nueva fecha este es solo lo ultimo que intente
    const char *file_foo =  MOUNT_POINT"/foo.txt";  // y la quiero colocar aqui cambiando foo.txt por new_nom

    // Check if destination file exists before renaming
    struct stat st;
    if (stat(file_foo, &st) == 0) {
        // Delete it if it exists
        unlink(file_foo);
    }

    // Rename original file
    ESP_LOGI(TAG, "Renaming file %s to %s", file_hello, file_foo);
    if (rename(file_hello, file_foo) != 0) {
        ESP_LOGE(TAG, "Rename failed");
        return;
    }

    // Open renamed file for reading
    ESP_LOGI(TAG, "Reading file %s", file_foo);
    f = fopen(file_foo, "r");
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for reading");
        return;
    }

    // Read a line from file
    char line[64];
    fgets(line, sizeof(line), f);
    fclose(f);

    // Strip newline
    char *pos = strchr(line, '\n');
    if (pos) {
        *pos = '\0';
    }
    ESP_LOGI(TAG, "Read from file: '%s'", line);

    // All done, unmount partition and disable SPI peripheral
    esp_vfs_fat_sdcard_unmount(mount_point, card);
    ESP_LOGI(TAG, "Card unmounted");

    //deinitialize the bus after all devices are removed
    spi_bus_free(host.slot);
}
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #1 en: 21 de Octubre de 2022, 07:36:05 »
Si asumo bien, tu problema es por no poder direccionar al archivo que queres, lo que encontre por internet es lo siguiente:

Código: C
  1. const char *file_foo =  MOUNT_POINT"/foo.txt";

por:

Código: C
  1. char buf[BUFFER_SIZE];
  2.   snprintf(buf, BUFFER_SIZE, "%s%s", MOUNT_POINT, file_path);
  3.  
  4.   ESP_LOGI(TAG, "Opening file %s", buf);

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #2 en: 21 de Octubre de 2022, 09:15:58 »
 :-/ :-/ :-/ :-/ :-/ :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-))
Gracias muchas gracias mi estimado amigo KILLERJC, te mando un fuerte abrazo desde mi amada Venenzuela.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #3 en: 21 de Octubre de 2022, 09:58:36 »
 :oops:  :(  :?
Otro caso más y es que al nombre del archivo no le puedo colocar números ni le puedo colocar un espacio ya que no me deja renombrar el archivo, nuevamente explico que mi intención es la de crear a diario un archivo para guardar los datos individualmente por dia.
Por ejemplo 15 OCTOBER que sería el nombre real de mi nuevo archivo, me genera error al renombrar, solo lo puedo renombrar a OCTOBER. Pero como mis datos no se van a guardar muy seguido solo cuando los valores estén fuera de los parámetros normales de funcionamiento creo que voy a crear solo archivo por mes.
Gracias a todos. Bueno de todas maneras si me pueden ayudar con eso pues mucho mejor.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #4 en: 21 de Octubre de 2022, 10:29:41 »
 :5] :5] :5] :5] :5] :5]
Me acabo de dar cuenta que mi logica estaba errada, pues al renombrar el archivo los datos van a seguir igual y no creo ningun otro archivosolo lo renombro, asi que debo trabajar es en la creacion de un nuevo archivo en vez de renombrarlo.  :5] :5] :5] :5] :5]
pero ya tengo idea de como hacerlo.
 :? :? :? :?
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #5 en: 21 de Octubre de 2022, 19:42:40 »
No entiendo porque no podria ser numeros solos, si es diario directamente:

20221021  (21/10/2022 lo escribi asi para que quede ordenado alfabeticamente)

No podes ponerle un guion ?

2022-10-21

Ya que tu ejemplo es con espacio.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #6 en: 21 de Octubre de 2022, 20:22:35 »
Hola KILLERJC lamentablemente no me deja usar ni número ni espacios ni guiones, esto ( _ ) tampoco, nada de nada solo letras del abecedario iban a decir alfanuméricas pero no es así ya que no me deja usar números.  :(
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #7 en: 23 de Octubre de 2022, 19:41:46 »
Encontré la solucion en el problema de colocar espacios y nombres largos al archivo, en la configuración del proyecto debo elegir Long file name buffer in heap, solo eso lo demás dejarlo por defecto.
Coloco una imagen para que se orienten.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Ayuda con el ejemplo del Esp32 examples\storage\sd_card\sdspi\main
« Respuesta #8 en: 23 de Octubre de 2022, 19:53:12 »
Ahora si puedo tener por cada día un archivo de datos diferentes hoy que termine el código solo tengo el del día actual que es hoy Valga la redundancia. Mañana tomo otra imagen y la muestro.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.