diff --git a/Documentation/ExempleWifi.md b/Documentation/ExempleWifi.md new file mode 100644 index 0000000..45df97a --- /dev/null +++ b/Documentation/ExempleWifi.md @@ -0,0 +1,108 @@ +## 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(). + +```cpp +#include +#include +#include +#include // 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 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 +} +``` diff --git a/include/mqtt.h b/include/mqtt.h new file mode 100644 index 0000000..baf8649 --- /dev/null +++ b/include/mqtt.h @@ -0,0 +1 @@ +void setupMQTT(void); \ No newline at end of file diff --git a/include/wifi.h b/include/wifi.h new file mode 100644 index 0000000..8450cfb --- /dev/null +++ b/include/wifi.h @@ -0,0 +1,2 @@ + +void WifiSetup(void); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5e019d7..f11db45 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #include #include "pins.h" +#include "wifi.h" +#include "mqtt.h" #if defined(DEVICE_ROLE_BOAT) constexpr const char *deviceRole = "boat"; @@ -35,6 +37,8 @@ void setup() { pinMode(Pins::hallRudderSignal, INPUT); #endif + WifiSetup(); + setupMQTT(); Serial.printf("Stid maritime: role=%s, mode=%s, chip=%06X\n", deviceRole, networkMode, ESP.getChipId()); Serial.println("Firmware skeleton ready; motors remain stopped."); diff --git a/src/mqtt.cpp b/src/mqtt.cpp new file mode 100644 index 0000000..2ff65f4 --- /dev/null +++ b/src/mqtt.cpp @@ -0,0 +1,10 @@ +/** + * @file mqtt.cpp + * @brief Gestion de la communication MQTT +*/ + +void setupMQTT(void) { + // Initialisation du client MQTT + mqttClient.setServer(mqtt_server, 1883); + mqttClient.setCallback(mqttCallback); +} \ No newline at end of file diff --git a/src/wifi.cpp b/src/wifi.cpp index e00bdda..ccca9c0 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -1,52 +1,3 @@ -// #include //https://github.com -// #include -// #include -// #include //https://github.com - -// void WifiSetup(void) -// { -// Serial.begin(115200); - -// // Objet WiFiManager -// WiFiManager wifiManager; - -// // Optionnel : réinitialiser les paramètres enregistrés pour les tests -// // wifiManager.resetSettings(); - -// // Démarre un point d'accès nommé "FinistRC_Config" (sans mot de passe) -// // Si la connexion au Wi-Fi enregistré échoue, le portail s'ouvre -// if (!wifiManager.autoConnect("FinistRC_Config")) { -// // Option 1 : Utiliser le mode sombre intégré -// wifiManager.setClass("invert"); - -// Serial.println("Échec de la connexion et timeout du portail."); -// delay(3000); -// ESP.restart(); // Redémarre l'ESP en cas d'échec -// } - -// // Si on arrive ici, l'ESP8266 est connecté au Wi-Fi -// Serial.println("Connecté au réseau Wi-Fi !"); -// Serial.print("Adresse IP : "); -// Serial.println(WiFi.localIP()); -// } - -// #include -// #include -// #include -// #include - -// // Variables pour stocker les paramètres personnalisés -// char mqtt_server[40] = "brokermqtt.local"; -// char api_token[32] = "votre_cle_ici"; - -// // Drapeau pour savoir s'il faut sauvegarder les données -// bool doiventSauvegarderConfiguration = false; - -// // Fonction de rappel (callback) appelée lorsque l'utilisateur valide le formulaire -// void saveConfigCallback() { -// Serial.println("Configuration modifiée. Prêt à sauvegarder."); -// doiventSauvegarderConfiguration = true; -// } void WifiSetup() { Serial.begin(115200); @@ -93,4 +44,53 @@ void WifiSetup() { // // Personnaliser le menu du portail (ne garder que le scan Wi-Fi et l'extinction de l'AP par exemple) // std::vector menu = {"wifi", "exit"}; -// wifiManager.setMenu(menu); \ No newline at end of file +// wifiManager.setMenu(menu); + +/* +#include + +// 1. Déclarer l'objet WiFiManager globalement ou dans le setup +WiFiManager wm; + +// 2. Déclarer les paramètres globalement pour y avoir accès partout +// Syntaxe : WiFiManagerParameter identifiant(id, label, valeur_par_defaut, longueur_max); +WiFiManagerParameter custom_api_key("api_id", "Cle API", "", 40); +WiFiManagerParameter custom_mqtt_server("mqtt_id", "Serveur MQTT", "192.168.1.50", 40); + +void setup() { + Serial.begin(115200); + + // 3. Ajouter les paramètres au portail WiFiManager + wm.addParameter(&custom_api_key); + wm.addParameter(&custom_mqtt_server); + + // Lancement du portail captif + if (!wm.autoConnect("ESP_Config_AP")) { + Serial.println("Échec de connexion, redémarrage..."); + delay(3000); + ESP.restart(); + } + + // ------------------------------------------------------------- + // RECOVERY : ICI LE PORTAIL EST FERMÉ ET L'ESP EST CONNECTÉ + // ------------------------------------------------------------- + Serial.println("\n--- Connexion reussie ! Recuperation des valeurs ---"); + + // On récupère les valeurs sous forme de chaîne de caractères (const char*) + String apiKey = custom_api_key.getValue(); + String mqttServer = custom_mqtt_server.getValue(); + + Serial.print("Cle API saisie : "); + Serial.println(apiKey); + + Serial.print("Serveur MQTT saisi : "); + Serial.println(mqttServer); +} + +void loop() { + // Vous pouvez aussi y accéder à tout moment dans le loop() : + // String mon_api = custom_api_key.getValue(); + + delay(5000); +} +*/ \ No newline at end of file