ESP, IoT ESP32C3 + GyverPortal + SD = ошибка

Ivan_X

✩✩✩✩✩✩✩
11 Ноя 2025
5
0
Оформи код соответствующим тэгом, см. Правила
Здравствуйте! Можете пожалуйста помочь с конфигурацией страницы и обработкой? Я пытался в примере fileUploadManual просто все заменить на SD, но постоянно ошибка обращения к несуществующему фрагменту памяти вроде... Идея изначально была загружать с телефона файл, чтобы он в дальнейшем записывался на micro SD карту. (плата ESP32C3, если это имеет значение, пин CS - GPIO7)

Код:
Код:
#define AP_SSID "*" // тут были SSID и пароль
#define AP_PASS "*"

#include <SD.h>
#include <GyverPortal.h>
GyverPortal ui;

void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);

  GP.FILE_UPLOAD("my_file.txt"); 
  GP.FILE_UPLOAD("file_upl");   
  
  GP.FILE_MANAGER(&SD); 
  
  GP.BUILD_END();
}

void setup() {
  startup();

  if (!SD.begin(7)) Serial.println("SD Error");

  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
  
  ui.uploadAuto(0);  // выключить автозагрузку
  ui.deleteAuto(0);  // выключить автоудаление
  ui.downloadAuto(0);// выключить автоскачивание
  ui.renameAuto(0);  // выключить автопереименование
}

void action() {
  // начало загрузки
  if (ui.upload()) {
    Serial.print("Upload: ");
    Serial.print(ui.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(ui.uploadName());  // имя формы загрузки

    // любым способом открыть и передать файл типа File
    // сохраним в корень по имени файла
    ui.saveFile(SD.open('/' + ui.fileName(), "w"));  // в корень, по имени файла
    //ui.saveFile(LittleFS.open('/' + ui.uploadName(), "w"));   // в корень, по имени формы загрузки
    
    // использовать имя формы как каталог, имя файла - как имя файла
    //ui.saveFile(LittleFS.open('/' + ui.uploadName() + '/' + ui.fileName(), "w"));
  }

  // успешное окончание загрузки
  if (ui.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(ui.fileName());
    Serial.print(", from: ");
    Serial.println(ui.uploadName());
  }

  // ===== ФАЙЛОВЫЙ МЕНЕДЖЕР =====
  // обработчик скачивания файлов (для открытия в браузере)
  if (ui.download()) ui.sendFile(SD.open(ui.uri(), "r"));

  // обработчик удаления файлов
  if (ui.deleteFile()) {
    SD.remove(ui.deletePath());
    Serial.println(ui.deletePath());
  }
  
  // обработчик переименования файлов
  if (ui.renameFile()) SD.rename(ui.renamePath(), ui.renamePathTo());
}

void loop() {
  ui.tick();
}

void startup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
}
Ошибка:
Код:
Guru Meditation Error: Core  0 panic'ed (Load access fault). Exception was unhandled.

Core  0 register dump:
MEPC    : 0x42003ec0  RA      : 0x42001366  SP      : 0x3fca2680  GP      : 0x3fc90400  
TP      : 0x3fca29b0  T0      : 0x7f7fffff  T1      : 0x7f7f7f7f  T2      : 0xffffffff  
S0/FP   : 0x3fca2710  S1      : 0x3fcafe4c  A0      : 0x00000000  A1      : 0x3fca2680  
A2      : 0x00000000  A3      : 0x00000000  A4      : 0x00000000  A5      : 0x3fc92f70  
A6      : 0xfa000000  A7      : 0x00000003  S2      : 0x3fca2680  S3      : 0x3fcbba50  
S4      : 0x3fc99000  S5      : 0x3fcbba54  S6      : 0x3fcbba50  S7      : 0x3fca26a0  
S8      : 0x00000001  S9      : 0x3fc99000  S10     : 0x00000000  S11     : 0x3fcbba64  
T3      : 0x0074203a  T4      : 0x65707954  T5      : 0x2d746e65  T6      : 0x746e6f43  
MSTATUS : 0x00001881  MTVEC   : 0x40380001  MCAUSE  : 0x00000005  MTVAL   : 0x00000000  
MHARTID : 0x00000000  

Stack memory:
3fca2680: 0x6565642f 0x65657370 0x646f636b 0x78742e65 0x3fca0074 0x00000020 0x3fcbba54 0x42012d78
3fca26a0: 0x3c0f1858 0x000005d8 0x3fcbba48 0x4038be8e 0x00000004 0x00000000 0x3fc99978 0x40380e2c
3fca26c0: 0x3c0f1858 0x00001800 0x000005d8 0xffffffff 0x0000000a 0x3fcafe88 0x3fc930f4 0xc47a234a
3fca26e0: 0x3c0f2000 0x3fc9301c 0x3fcafe24 0x3c0f2000 0x3fcbba50 0x3fca285c 0x00000001 0xffffffff
3fca2700: 0x3c0f2000 0x3fc9301c 0x3fca27e0 0x4200b126 0x00000004 0x3fc930f4 0x3fca2710 0x3fc930bc
3fca2720: 0x3fcb7ee4 0x00001800 0x00000001 0x3fcb8e50 0x0000004f 0x00000000 0x00cb7db4 0x3fcb8e10
3fca2740: 0x0000002f 0x0000000b 0x00cb7db4 0x00000000 0x00000000 0x00000000 0x80cb7da4 0x74786574
3fca2760: 0x616c702f 0x00006e69 0x8acb7da0 0x3fcaf43c 0x0000001f 0x00000010 0x00c995c0 0x00000000
3fca2780: 0x00000000 0x00000000 0x0cc93000 0x00000000 0x00000000 0x00000000 0x00002000 0xc47a234a
3fca27a0: 0x3c0f2000 0x3fcb82a0 0x3fca289c 0x3c0e1000 0x3c0e1000 0x3c0f8000 0x00000001 0x00000000
3fca27c0: 0x3fc99000 0xffffffff 0x00000001 0x00000001 0x3c0f2000 0x3fc930bc 0x3fc9301c 0x4200bb88
3fca27e0: 0x00000000 0x00000000 0x3fca36b4 0x3fc930f4 0x00000000 0x00000000 0x3fca36b4 0x3fcb8040
3fca2800: 0x0000008f 0x00000000 0x0e00616f 0x54534f50 0x00000000 0x00000000 0x84ca36b4 0x5f50472f
3fca2820: 0x6f6c7075 0x00006461 0x8aca36b4 0x00000031 0x00000000 0x00000000 0x81ca36b4 0x00000000
3fca2840: 0x00000000 0x00000000 0x80ca36b4 0x00000000 0x00000000 0x00000000 0x80000000 0x3fcb8268
3fca2860: 0x0000002f 0x00000026 0x00000000 0x3fcb7ee4 0x0000001f 0x0000000f 0x0d00006c 0x3fcb8f34
3fca2880: 0x0000008f 0x00000023 0x01c90000 0x00000000 0x00000000 0x00000000 0x00c94624 0x00000000
3fca28a0: 0x00000000 0x00000000 0x00006700 0xc47a234a 0x00000001 0x3fc930bc 0x3fcb8114 0x00000000
3fca28c0: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x3fc99000
3fca28e0: 0x00000001 0x3fc930bc 0x3fc9301c 0x4200f074 0x3fca29b0 0x4005890e 0x3c0f7ef0 0x00000000
3fca2900: 0x000003e8 0x42012000 0x3fcb78c8 0x3fcb0100 0x3fcb8114 0x3fcb813c 0x00000001 0x00000bb8
3fca2920: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0xc47a234a
3fca2940: 0x00000000 0x00000000 0x3fc99000 0x00000000 0x00000000 0x42012000 0x3fc99000 0x42001d1e
3fca2960: 0x00000014 0x3fc99000 0x3fc99000 0x42013fe8 0x00000000 0x00000000 0x00000000 0x40387f7c
3fca2980: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
3fca29a0: 0x00000000 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xbaad5678
3fca29c0: 0xe3febea4 0x9938a21d 0x89e5e3c4 0x6ff17d90 0x54e00fc4 0xdda0e2c5 0x3e7746cd 0x2d72fbd8
3fca29e0: 0x3be1557f 0x6a58b9ad 0x64c8026c 0x7c0fe0df 0x4d942c40 0xfe4b7d98 0x5e0dfd8d 0x8f002b74
3fca2a00: 0xfdf9c6de 0x8444ffb1 0x88206904 0x46b3faae 0xa0b926c2 0x7397ba00 0x7b12e7ac 0x0a8452af
3fca2a20: 0x0a28ef7b 0x4849f638 0x67264126 0xf1228155 0x0720c827 0xb47d71d7 0xd757a7a9 0x483c74f0
3fca2a40: 0x32ab9097 0xa43f1ef6 0xd981e4e3 0x07c90ae9 0xe8a5fd6b 0x3a9a605d 0x6a7f513b 0x9e4a54a5
3fca2a60: 0x778da615 0xf9fb8eca 0xb96286a0 0x92969baa 0xcd2429a8 0x93e27d40 0xbdc1df1e 0x484d590e



ELF file SHA256: 97bc76281

Rebooting...
 
Изменено:

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
182
36
www.youtube.com
В примерах к плате есть скетч для тестирования sd карт. Проверь его. Убедись что твоя sd карта работоспособна. Кроме sd в примерах еще есть sd_mmc. Если sd не работает, используй sd_mmc.
В твоём скетче добавь побольше выводов в сериал, чтобы понять какую именно команду есп не может выполнить.
Ps гайверпортал устарел и заброшен, вместо него сеттингс, инфо с гитхаба.
 
Изменено:

Bruzzer

★★★★✩✩✩
23 Май 2020
758
232
загружать с телефона файл, чтобы он в дальнейшем записывался на micro SD карту.
if (!SD.begin(7)) Serial.println("SD Error");
Можно после успешного старта SD (или в другом месте) добавить строчку
ui.setFS(&SD);

Или просто указать при объявлении
GyverPortal ui(&SD);
 
Изменено:

Ivan_X

✩✩✩✩✩✩✩
11 Ноя 2025
5
0
Ребята спасибо всем за советы!🤝 У меня именно на ESP не запускается карта, на ардуино работает, наверное не нравится лог. Уровень 3.3, на плате как я понял нет преобразователя логических уровней) То что в моих силах, это заказать плату с преобразователем, и сделать связку ардуино с SD + ESP по UART😂
 

Ivan_X

✩✩✩✩✩✩✩
11 Ноя 2025
5
0
Оформи код соответствующим тэгом, см. Правила
Ребята, в общем, я попробовал снова, и каким то магическим образом всё заработало)) Всё, кроме загрузки файлов НА SD карту. Так же переписал функцию для переименования файлов, она работает, код и фото если нужно сейчас приложу. (SD с IOT набора "Амперки") 17671237051496731872952068672177.jpg

Код:
// ручная загрузка файлов
// также выключаем скачивание/удаление/переименование и сделаем это вручную (для примера)

#define AP_SSID "Beeline_2G_BD119E"
#define AP_PASS "aYx9A2Eereru"

// подключить библиотеку файловой системы (до #include GyverPortal)
#include <SD.h>
#include <GyverPortal.h>
GyverPortal ui;
File file;
// конструктор страницы
void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);

  GP.FILE_UPLOAD("my_file.txt"); // кнопка загрузки
  GP.FILE_UPLOAD("file_upl");    // кнопка загрузки
  
  GP.FILE_MANAGER(&SD);    // файловый менеджер
  
  GP.BUILD_END();
}

void setup() {
  startup();

  if (!SD.begin(7)) Serial.println("SD Error");

  ui.attachBuild(build);
  ui.attach(action);
  ui.start();
  
  ui.uploadAuto(0);  // выключить автозагрузку
  ui.deleteAuto(0);  // выключить автоудаление
  ui.downloadAuto(0);// выключить автоскачивание
  ui.renameAuto(0);  // выключить автопереименование
}

void action() {
  // начало загрузки
  if (ui.upload()) {
    Serial.print("Upload: ");
    Serial.print(ui.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(ui.uploadName());  // имя формы загрузки

    // любым способом открыть и передать файл типа File
    // сохраним в корень по имени файла
    ui.saveFile(SD.open('/' + ui.fileName(), "w")); 
    
    // использовать имя формы как каталог, имя файла - как имя файла
    //ui.saveFile(LittleFS.open('/' + ui.uploadName() + '/' + ui.fileName(), "w"));
  }

  // успешное окончание загрузки
  if (ui.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(ui.fileName());
    Serial.print(", from: ");
    Serial.println(ui.uploadName());
  }

  // ===== ФАЙЛОВЫЙ МЕНЕДЖЕР =====
  // обработчик скачивания файлов (для открытия в браузере)
  if (ui.download()) ui.sendFile(SD.open(ui.uri(), "w"));

  // обработчик удаления файлов
  if (ui.deleteFile()) {
    SD.remove(ui.deletePath());
    Serial.println(ui.deletePath());
  }
  
  // обработчик переименования файлов (Отдельную функцию написал, потому что в библиотеке SD нет rename)
  if (ui.renameFile()) renameFile(ui.renamePath(), ui.renamePathTo());
}

void loop() {
  ui.tick();
}

void startup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
}

void renameFile(String oldName, String newName) {
  Serial.print("Попытка переименовать ");
  Serial.print(oldName);
  Serial.print(" в ");
  Serial.println(newName);

  // 1. Открываем старый файл для чтения
  File oldFile = SD.open(oldName, FILE_READ);
  if (!oldFile) {
    Serial.println("Ошибка: не удалось открыть старый файл!");
    return;
  }

  // 2. Открываем новый файл для записи
  File newFile = SD.open(newName, FILE_WRITE);
  if (!newFile) {
    Serial.println("Ошибка: не удалось создать новый файл!");
    oldFile.close(); // Закрываем старый файл, если новый не создался
    return;
  }

  // 3. Копируем содержимое
  while (oldFile.available()) {
    newFile.write(oldFile.read());
  }

  // 4. Закрываем файлы
  oldFile.close();
  newFile.close();

  // 5. Удаляем старый файл
  if (SD.remove(oldName)) {
    Serial.println("Успешно: старый файл удален.");
  } else {
    Serial.println("Ошибка: не удалось удалить старый файл!");
  }
}
При попытке загрузить файлы на SD ошибка та же что была прикреплена выше. Если есть советы, буду очень благодарен!:)
 

Вложения

Изменено: