Files
Brest_2027/Documentation/ExempleWifi.md
T
2026-09-21 18:43:29 +02:00

4.1 KiB

Comment ça fonctionne ?

  1. Au démarrage (Lecture) : Le programme cherche un fichier nommé config.json. S'il existe, il extrait la valeur stockée pour l'injecter dans la variable custom_api_key.

  2. Création du champ : La ligne wm.addParameter(&custom_html_api_key) ajoute un champ de texte sur la page de configuration HTML de WiFiManager avec la valeur actuelle.

  3. Le Callback : Si l'utilisateur clique sur "Save" sur la page web, la fonction saveConfigCallback() passe la variable shouldSaveConfig à true.

  4. Au redémarrage/Connexion (Écriture) : Si le drapeau est à true, le programme récupère la chaîne saisie via .getValue(), crée un nouvel objet JSON et l'écrase dans config.json

Si vous tenez absolument à utiliser l'EEPROM classique (sans LittleFS)Si votre projet utilise déjà l'EEPROM pour d'autres données, le principe reste identique :

  • Dans l'étape 1, utilisez EEPROM.get() ou EEPROM.readChar() pour remplir votre variable avant le addParameter.
  • Dans l'étape 3, utilisez EEPROM.put() suivi de EEPROM.commit() pour enregistrer la valeur récupérée par .getValue().
#include <FS.h>
#include <LittleFS.h>
#include <WiFiManager.h>
#include <ArduinoJson.h> // Nécessaire pour structurer les données dans le fichier

// Définition des variables pour vos paramètres personnalisés
char custom_api_key[40] = "valeur_par_defaut";

// Drapeau pour savoir s'il faut sauvegarder les données
bool shouldSaveConfig = false;

// Fonction de rappel (callback) qui s'active quand on valide la page web
void saveConfigCallback() {
  Serial.println("Configuration modifiée, sauvegarde nécessaire.");
  shouldSaveConfig = true;
}

void setup() {
  Serial.begin(115200);

  // 1. LIRE les paramètres existants depuis le système de fichiers (LittleFS)
  Serial.println("Montage du système de fichiers...");
  if (LittleFS.begin()) {
    if (LittleFS.exists("/config.json")) {
      Serial.println("Lecture du fichier de configuration...");
      File configFile = LittleFS.open("/config.json", "r");
      if (configFile) {
        size_t size = configFile.size();
        std::unique_ptr<char[]> buf(new char[size]);
        configFile.readBytes(buf.get(), size);

        // Analyse du JSON (Ici avec ArduinoJson V6 ou V7)
        JsonDocument doc;
        auto error = deserializeJson(doc, buf.get());
        if (!error) {
          strcpy(custom_api_key, doc["api_key"]);
          Serial.print("Paramètre chargé : ");
          Serial.println(custom_api_key);
        }
      }
    }
  } else {
    Serial.println("Erreur lors du montage de LittleFS");
  }

  // 2. CONFIGURER WiFiManager et injecter le paramètre
  WiFiManager wm;

  // On lie la fonction de rappel pour la sauvegarde
  wm.setSaveConfigCallback(saveConfigCallback);

  // Création du champ personnalisé pour l'interface Web
  // Syntaxe : WiFiManagerParameter(id, label, default_value, length)
  WiFiManagerParameter custom_html_api_key("api_id", "Clé API", custom_api_key, 40);
  wm.addParameter(&custom_html_api_key);

  // Lancement du portail de configuration
  if (!wm.autoConnect("ESP_Config_AP")) {
    Serial.println("Échec de la connexion, redémarrage...");
    delay(3000);
    ESP.restart();
  }

  // Si on arrive ici, le WiFi est connecté
  Serial.println("Connecté au WiFi !");

  // 3. ÉCRIRE les nouveaux paramètres si l'utilisateur les a modifiés sur le portail
  if (shouldSaveConfig) {
    // Récupération de la valeur saisie dans le formulaire Web
    strcpy(custom_api_key, custom_html_api_key.getValue());

    Serial.println("Sauvegarde de la nouvelle configuration...");
    JsonDocument doc;
    doc["api_key"] = custom_api_key;

    File configFile = LittleFS.open("/config.json", "w");
    if (configFile) {
      serializeJson(doc, configFile);
      configFile.close();
      Serial.println("Configuration sauvegardée avec succès.");
    }
  }

  // Reste de votre code (ex: utilisation de custom_api_key)
  Serial.print("Ma clé API active est : ");
  Serial.println(custom_api_key);
}

void loop() {
  // Votre code principal
}