Проблема с преобразованием скетча из SPIFFS в LittleFS – нет функции сопоставления для ошибки вызова

compile error 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() {
  // поместите сюда свой основной код для многократного запуска:
}

, 👍0

Обсуждение

вы смотрели пример кода LittleFS?, @jsotola

Библиотека LittleFS показывает функцию начала с некоторыми другими параметрами. Вероятно, поэтому компилятор жалуется на незнание этой функции. В LittleFS нет метода start с одним логическим параметром. Пожалуйста, попробуйте вызвать функцию начала, как в примерах библиотек., @chrisl


1 ответ


1

Я столкнулся с той же проблемой. Я внес в код следующие изменения.

  1. Закомментировал эту строку:
  //x  if (SPIFFS.begin(false) || SPIFFS.begin(true))
  1. Закомментированная строка заменена на эту:
  SPIFFS.begin();
  1. Затем закомментировал "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>
,