ESP32 , LittleFS e recupero di dati da array

Ho bisogno di aiuto :pray:, sto lavorando a un progetto in cui salvo la configurazione in un config.json memorizzato sul LittleFS di un ESP32.
Per prima cosa controllo se ci sono dati ... In caso contrario, creo il config.json e lo salvo (funziona). Quando eseguo per la seconda volta provo a prelevare i dati da lì, ma non capisco il comando per recuperare i dati in modo da poter deserializzare l'array. Ho controllato l'array (config.json) ed è stato salvato nel modo giusto.

void checkFile() {
  bool fileexists = LittleFS.exists("/config.json");
  Serial.print(fileexists);
  if(!fileexists) {
    Serial.println("File doesn’t exist");  
    Serial.println("Creating file...");
    String config;
    JsonDocument doc;
    doc["ssid"] = "ssid";
    doc["password"] = "pass";
    doc["myChannelNumber"] = "chan";
    doc["myWriteAPIKey"] = "api";
    doc["thingspeak"] = 0;
    doc["sonda1"] = "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F";
    doc["sonda2"] = "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F";
    doc["sonda3"] = "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F";
    doc["mitt"] = "mitt@mitt.com";
    doc["dest"] = "dest@dest.com";
    doc["impianto"] = "name";

    serializeJson(doc, config);
    
    firstWriteFile(LittleFS, "/config.json", config.c_str());
  }
  else {
    loadSettings(LittleFS, "/config.json");
  }
}

void loadSettings(fs::FS &fs, const char *path) {
  File file = fs.open(path, "r");
  --> "what is the right way to keep the data so i can deserialize them?"
  JsonDocument configLoad;
  deserializeJson(configLoad, output);
  ssid = configLoad["ssid"];
  password = configLoad["password"];
  myChannelNumber = configLoad["myChannelNumber"];
  myWriteAPIKey = configLoad["myWriteAPIKey"];
  thingspeak = configLoad["thingspeak"];
  sonda1 = configLoad["sonda1"];
  sonda2 = configLoad["sonda2"];
  sonda3 = configLoad["sonda3"];
  mitt = configLoad["mitt"];
  dest = configLoad["dest"];
  impianto = configLoad["impianto"];
  file.close();
  }

void firstWriteFile(fs::FS &fs, const char *path, const char * message) {
  Serial.printf("Writing file: %s\r\n", path);

  File file = fs.open(path, FILE_WRITE);
  if (!file) {
    Serial.println("- failed to open file for writing");
    return;
  }
  if (file.print(message)) {
    Serial.println("- file written");
  } else {
    Serial.println("- write failed");
  }
  file.close();
}

Se utilizzi ArduinoJson, puoi leggere il JSON come uno Stream.

Il tuo JSON appare così:

{
  "ssid": "ssid",
  "password": "pass",
  "myChannelNumber": "chan",
  "myWriteAPIKey": "api",
  "thingspeak": 0,
  "sonda1": "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F",
  "sonda2": "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F",
  "sonda3": "0x28, 0xE0, 0x7F, 0x2A, 0x06, 0x00, 0x00, 0x8F",
  "mitt": "mitt@mitt.com",
  "dest": "dest@dest.com",
  "impianto": "name"
}

Quindi potresti inserirlo nell'assistente ArduinoJson e ottenere un codice di esempio per estrarre i dati.

Se lo modifichi un po', potresti vedere se funziona per la tua funzione.

(Scritto qui, completamente non testato)

void caricaImpostazioni(fs::FS &fs, const char *percorso) {
  File input = fs.open(percorso, "r");

  if (!input) {
    Serial.print("Impossibile aprire il file per la lettura: ");
    Serial.println(percorso);
    return;
  }

  StaticJsonDocument<1024> doc;  // Dimensione aumentata per gestire dati JSON più grandi

  DeserializationError error = deserializeJson(doc, input);
  input.close();  // Chiude il file immediatamente dopo la lettura

  if (error) {
    Serial.print("deserializeJson() fallito: ");
    Serial.println(error.c_str());
    return;
  }

  // Recupera i valori con controlli di null
  const char* ssid = doc["ssid"] | "N/A";
  const char* password = doc["password"] | "N/A";
  const char* numeroCanale = doc["myChannelNumber"] | "N/A";
  const char* chiaveAPI = doc["myWriteAPIKey"] | "N/A";
  int thingspeak = doc["thingspeak"] | -1;
  const char* sonda1 = doc["sonda1"] | "N/A";
  const char* sonda2 = doc["sonda2"] | "N/A";
  const char* sonda3 = doc["sonda3"] | "N/A";
  const char* mitt = doc["mitt"] | "N/A";
  const char* dest = doc["dest"] | "N/A";
  const char* impianto = doc["impianto"] | "N/A";

  // Stampa le impostazioni caricate
  Serial.println("Impostazioni caricate:");
  Serial.print("SSID: "); Serial.println(ssid);
  Serial.print("Password: "); Serial.println(password);
  Serial.print("Numero Canale: "); Serial.println(numeroCanale);
  Serial.print("Chiave API: "); Serial.println(chiaveAPI);
  Serial.print("Thingspeak: "); Serial.println(thingspeak);
  Serial.print("Sonda1: "); Serial.println(sonda1);
  Serial.print("Sonda2: "); Serial.println(sonda2);
  Serial.print("Sonda3: "); Serial.println(sonda3);
  Serial.print("Mitt: "); Serial.println(mitt);
  Serial.print("Dest: "); Serial.println(dest);
  Serial.print("Impianto: "); Serial.println(impianto);
}
1 Like

Ora provo, ti ringrazio :pray:

Con alcuni accorgimenti funziona :partying_face: :partying_face:

Grazie per l'aiuto , purtroppo alle volte si legge e si rilegge ma non si trovano gli sbagli :grinning:

1 Like

Sono contento se questo è stato utile!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.