Проблема с преобразованием скетча из SPIFFS в LittleFS – нет функции сопоставления для ошибки вызова
Я играю с руководством из DroneBot Workshop на YouTube (кстати, отличная видеопрезентация по WiFi-менеджеру для новичков). Я работаю с NodeMCU ESP8266.
Пример кода был написан для SPIFFS. Если вместо этого я использую библиотеку LittleFS и определяю ли я SPIFFS на LittleFS в начале или вручную заменяю все ссылки на SPIFFS на LittleFS, эта строка не скомпилируется:
if (LittleFS.begin(false) || LittleFS.begin(true))
Выдает следующее сообщение об ошибке:
no matching function for call to 'fs::FS::begin(bool)'
Есть предложения относительно того, что мне не хватает или что нужно изменить?
Его исходный пример кода, который не компилируется, приведен ниже. Наверное, я упускаю что-то простое, но не знаю, что именно.
Наверное, мне следовало добавить, что я закомментировал включение SPIFFS и добавил включение LittleFS.H
У меня все еще есть FS.h, включенный в библиотеки, и я не уверен, что это способствует возникновению проблемы. Есть ли эквивалентная замена FS.h, которая есть в LitteFS, которую мне следует включить?
/*
WiFiManager с сохраненными текстовыми полями Демо
wfm-text-save-demo.ino
Сохраняет данные в файле JSON на ESP32.
Использует SPIFFS
Мастер-класс DroneBot 2022
https://dronebotworkshop.com
Функции, основанные на скетче Брайана Лоха
https://github.com/witnessmenow/ESP32-WiFi-Manager-Examples
*/
#define ESP_DRD_USE_SPIFFS true
// Включаем библиотеки
// Библиотека Wi-Fi
#include <WiFi.h>
// Библиотека файловой системы
#include <FS.h>
// Библиотека SPI Flash Syetem
#include <SPIFFS.h>
// Библиотека WiFiManager
#include <WiFiManager.h>
// JSON-библиотека Arduino
#include <ArduinoJson.h>
// файл конфигурации JSON
#define JSON_CONFIG_FILE "/test_config.json"
// Флаг сохранения данных
bool shouldSaveConfig = false;
// Переменные для хранения данных из пользовательских текстовых полей
char testString[50] = "test value";
int testNumber = 1234;
// Определить объект WiFiManager
WiFiManager wm;
void saveConfigFile()
// Сохраняем конфигурацию в формате JSON
{
Serial.println(F("Saving configuration..."));
// Создаем документ JSON
StaticJsonDocument<512> json;
json["testString"] = testString;
json["testNumber"] = testNumber;
//Открываем файл конфигурации
File configFile = SPIFFS.open(JSON_CONFIG_FILE, "w");
if (!configFile)
{
// Ошибка, файл не открыт
Serial.println("failed to open config file for writing");
}
// Сериализация данных JSON для записи в файл
serializeJsonPretty(json, Serial);
if (serializeJson(json, configFile) == 0)
{
// Ошибка записи файла
Serial.println(F("Failed to write to file"));
}
// Закрываем файл
configFile.close();
}
bool loadConfigFile()
// Загружаем существующий файл конфигурации
{
// Раскомментируем, если нам нужно отформатировать файловую систему
// SPIFFS.format();
// Читаем конфигурацию из FS json
Serial.println("Mounting File System...");
// Возможно, потребуется начать(true) при первом использовании SPIFFS
if (SPIFFS.begin(false) || SPIFFS.begin(true))
{
Serial.println("mounted file system");
if (SPIFFS.exists(JSON_CONFIG_FILE))
{
// Файл существует, читаем и загружаем
Serial.println("reading config file");
File configFile = SPIFFS.open(JSON_CONFIG_FILE, "r");
if (configFile)
{
Serial.println("Opened configuration file");
StaticJsonDocument<512> json;
DeserializationError error = deserializeJson(json, configFile);
serializeJsonPretty(json, Serial);
if (!error)
{
Serial.println("Parsing JSON");
strcpy(testString, json["testString"]);
testNumber = json["testNumber"].as<int>();
return true;
}
else
{
// Ошибка загрузки данных JSON
Serial.println("Failed to load json config");
}
}
}
}
else
{
// Ошибка монтирования файловой системы
Serial.println("Failed to mount FS");
}
return false;
}
void saveConfigCallback()
// Обратный вызов, уведомляющий нас о необходимости сохранить конфигурацию
{
Serial.println("Should save config");
shouldSaveConfig = true;
}
void configModeCallback(WiFiManager *myWiFiManager)
// Вызывается при запуске режима конфигурации
{
Serial.println("Entered Configuration Mode");
Serial.print("Config SSID: ");
Serial.println(myWiFiManager->getConfigPortalSSID());
Serial.print("Config IP Address: ");
Serial.println(WiFi.softAPIP());
}
void setup()
{
// Изменяем значение true при тестировании, чтобы принудительно настраивать каждый раз при запуске
bool forceConfig = false;
bool spiffsSetup = loadConfigFile();
if (!spiffsSetup)
{
Serial.println(F("Forcing config mode as there is no saved config"));
forceConfig = true;
}
// Явно устанавливаем режим Wi-Fi
WiFi.mode(WIFI_STA);
// Настройка последовательного монитора
Serial.begin(115200);
delay(10);
// Сброс настроек (только для разработки)
wm.resetSettings();
// Установка обратного вызова для уведомления о сохранении конфигурации
wm.setSaveConfigCallback(saveConfigCallback);
// Устанавливаем обратный вызов, который вызывается при сбое подключения к предыдущему Wi-Fi и переходе в режим точки доступа
wm.setAPCallback(configModeCallback);
// Пользовательские элементы
// Текстовое поле (строка) - максимум 50 символов
WiFiManagerParameter custom_text_box("key_text", "Enter your string here", testString, 50);
// Необходимо преобразовать числовой ввод в строку, чтобы отобразить значение по умолчанию.
char convertedValue[6];
sprintf(convertedValue, "%d", testNumber);
// Текстовое поле (число) – максимум 7 символов
WiFiManagerParameter custom_text_box_num("key_num", "Enter your number here", convertedValue, 7);
// Добавляем все определенные параметры
wm.addParameter(&custom_text_box);
wm.addParameter(&custom_text_box_num);
if (forceConfig)
// Запускаем, если нам нужна конфигурация
{
if (!wm.startConfigPortal("NEWTEST_AP", "password"))
{
Serial.println("failed to connect and hit timeout");
delay(3000);
//сброс и попытка еще раз, или, может быть, переводим его в глубокий сон
ESP.restart();
delay(5000);
}
}
else
{
if (!wm.autoConnect("NEWTEST_AP", "password"))
{
Serial.println("failed to connect and hit timeout");
delay(3000);
// если мы все еще не подключились, перезапускаем и пробуем все заново
ESP.restart();
delay(5000);
}
}
// Если мы доберемся сюда, значит, мы подключены к Wi-Fi
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Разберемся со значениями конфигурации пользователя
// Копируем строковое значение
strncpy(testString, custom_text_box.getValue(), sizeof(testString));
Serial.print("testString: ");
Serial.println(testString);
//Преобразуем числовое значение
testNumber = atoi(custom_text_box_num.getValue());
Serial.print("testNumber: ");
Serial.println(testNumber);
// Сохраняем пользовательские параметры в FS
if (shouldSaveConfig)
{
saveConfigFile();
}
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
}
@Dave J, 👍0
Обсуждение1 ответ
Я столкнулся с той же проблемой. Я внес в код следующие изменения.
- Закомментировал эту строку:
//x if (SPIFFS.begin(false) || SPIFFS.begin(true))
- Закомментированная строка заменена на эту:
SPIFFS.begin();
- Затем закомментировал "else" часть кода в этом блоке:
//x else
//x {
//x // Ошибка монтирования файловой системы
//x Serial.println("Failed to mount FS");
//x }
По сути, вы исключаете проверку истинности/ложности и всегда выполняете код, не совсем уверенный, почему вы все равно не хотите выполнять код.
Примечание: Я также использовал LittleFS, чтобы упростить задачу, поэтому я использовал следующее include и define:
#include "LittleFS"
#define SPIFFS LittleFS
И последнее: я запускал это на клоне ESP8266 mini D1, поэтому также изменил
#include <WiFi.h>
Кому
#include <ESP8266WiFi.h>
- ESP32 - ошибка при использовании LITTLEFS.h после обновления ядра до 2.0.4
- Как сохранить структуру в файле?
- Любой способ использовать DMA для передачи данных на SD - карту в ESP8266
- Что мне делать с StackOverflow при ошибке компиляции?
- Где хранить критические данные в ситуации отключения электроэнергии на ESP8266
- SPIFFS и LittleFS не показывают все мои файлы с readdir() и не могут открыть() их
- Как установить приложение + его конфигурацию на множество однотипных устройств? (ESP32)
- Копия примера кода Arduino для функции tone() выдает ошибку компиляции: 'tone' is not declared in this scope. Как исправить?
вы смотрели пример кода LittleFS?, @jsotola
Библиотека LittleFS показывает функцию начала с некоторыми другими параметрами. Вероятно, поэтому компилятор жалуется на незнание этой функции. В LittleFS нет метода start с одним логическим параметром. Пожалуйста, попробуйте вызвать функцию начала, как в примерах библиотек., @chrisl