From d9d8f57369a0abbfaafe5d8596337d2dbe85a4e7 Mon Sep 17 00:00:00 2001 From: Serge NOEL Date: Tue, 22 Sep 2026 16:50:29 +0200 Subject: [PATCH] Ajout config Wifi --- Documentation/WifiAuto.cpp | 52 +++++++++++++++++++++++++++++++++ README.md | 59 ++++++++++++++++++++++++++++---------- include/wifi.h | 9 +++++- src/main.cpp | 4 +++ src/wifi.cpp | 56 ++++++++++++++++++++++++++++++------ 5 files changed, 156 insertions(+), 24 deletions(-) create mode 100644 Documentation/WifiAuto.cpp diff --git a/Documentation/WifiAuto.cpp b/Documentation/WifiAuto.cpp new file mode 100644 index 0000000..de87673 --- /dev/null +++ b/Documentation/WifiAuto.cpp @@ -0,0 +1,52 @@ +#include +#include // https://github.com/tzapu/WiFiManager + +// Définition de la broche de reset (ex: D5 / GPIO14) +#define PIN_CONFIG D5 + +void setup() { + Serial.begin(115200); + delay(100); + Serial.println("\n--- Démarrage de l'ESP ---"); + + // 1. Configuration de la broche du bouton avec résistance de Pull-Up interne + // Le bouton doit être câblé entre PIN_CONFIG et le GND (Masse). + pinMode(PIN_CONFIG, INPUT_PULLUP); + + // Instanciation de WiFiManager + WiFiManager wm; + + // 2. Vérification de l'état du bouton de reset + // Si le bouton est appuyé au démarrage (état LOW), on efface la configuration + if (digitalRead(PIN_CONFIG) == LOW) { + Serial.println("-> PIN_CONFIG à l'état BAS détecté ! Réinitialisation du Wi-Fi..."); + + // Efface les identifiants Wi-Fi enregistrés dans la mémoire Flash / EEPROM + wm.resetSettings(); + + // Attente optionnelle pour laisser le temps de relâcher le bouton + delay(2000); + } + + // (Optionnel) Temps d'attente max du portail captif en secondes (ex: 3 minutes = 180s) + // wm.setConfigPortalTimeout(180); + + // 3. Connexion automatique ou lancement du Portail Captif + // Paramètres : (Nom du PA créé par l'ESP, Mot de passe optionnel du PA) + bool result = wm.autoConnect("ESP-Config-AP", "password123"); + + if (!result) { + Serial.println("Échec de la connexion ou dépassement du délai du portail captif."); + // Optionnel : Redémarrage si le timeout expire sans configuration + // ESP.restart(); + } else { + // Si la connexion réussit (soit via le Wi-Fi enregistré, soit après saisie sur le portail) + Serial.println("-> Connecté au Wi-Fi avec succès !"); + Serial.print("Adresse IP attribuée : "); + Serial.println(WiFi.localIP()); + } +} + +void loop() { + // Votre code principal s'exécute ici une fois la connexion Wi-Fi établie +} \ No newline at end of file diff --git a/README.md b/README.md index 3eb0a06..e7b7c95 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,48 @@ Projet de bateaux télécommandés pour le bassin des Journées maritimes. Le matériel repose sur des ESP8266 et deux modes réseau : -- **MQTT** : un point d'accès OpenWRT fournit le Wi-Fi et le broker MQTT ; la supervision Banana Pi suit les périphériques et les batteries. +- **MQTT** : un point d'accès OpenWRT fournit le Wi-Fi et le broker MQTT. Un système de supervision Banana Pi suit les périphériques et les batteries. - **AP autonome** : le bateau crée son propre réseau Wi-Fi et fonctionne sans broker ni supervision. + > **NB** les bateaux en mode autonome sont une option supplémentaires au mode Wifi ## Structure PlatformIO Le dépôt contient un seul projet PlatformIO avec quatre environnements : -| Environnement | Matériel | Réseau | -| --- | --- | --- | -| `boat_mqtt` | bateau + MX1508 + servo | MQTT | -| `remote_mqtt` | télécommande + capteurs Hall | MQTT | -| `boat_ap` | bateau + MX1508 + servo | point d'accès ESP8266 | -| `remote_ap` | télécommande + capteurs Hall | point d'accès ESP8266 | +| Environnement | Matériel | Réseau | +| ------------- | ---------------------------- | --------------------- | +| `boat_mqtt` | bateau + MX1508 + servo | MQTT | +| `remote_mqtt` | télécommande + capteurs Hall | MQTT | +| `boat_ap` | bateau + MX1508 + servo | point d'accès ESP8266 | +| `remote_ap` | télécommande + capteurs Hall | point d'accès ESP8266 | + +> **NB** : Les dispositifs 'autonomes' ne crée leur AP que lorsqu'il +> n'y a pas de Wifi, dans ce cas le bateau crée l'accès Wifi. + +**Mode de fonctionnement** + +1. Bateaux 'AP' + - pas de configuration -> présente le portail captif + - configuré et wifi présent -> se connecte au Wifi + - configuré et wifi non présent -> se comporte en AP + - configuré et PIN_CONFIG a l'état BAS -> reset de la configuration Wifi + +2. Bateaux 'MQTT' + - pas de configuration -> présente le portail captif + - configuré et wifi présent -> se connecte au Wifi + - configuré et PIN_CONFIG a l'état BAS -> reset de la configuration Wifi + +3. Remote 'AP' + - pas de configuration -> présente le portail captif + - configuré et wifi présent -> se connecte au Wifi + - configuré et PIN_CONFIG a l'état BAS -> reset de la configuration Wifi + +4. Remote 'MQTT' + - pas de configuration -> présente le portail captif + - configuré et wifi présent -> se connecte au Wifi + - configuré et PIN_CONFIG a l'état BAS -> reset de la configuration Wifi + +# Compilation avec Platformio Commandes de départ : @@ -43,14 +72,14 @@ Le firmware initial est volontairement passif : il initialise les entrées/sorti Le choix proposé dans `include/pins.h` est : -| Fonction | Broche NodeMCU | GPIO | -| --- | --- | --- | -| Batterie | A0 | ADC0 | -| I2C SDA | D2 | GPIO4 | -| I2C SCL | D1 | GPIO5 | -| Moteur gauche avant/arrière | D5 / D6 | GPIO14 / GPIO12 | -| Moteur droit avant/arrière | D7 / D8 | GPIO13 / GPIO15 | -| Servo gouvernail | D4 | GPIO2 | +| Fonction | Broche NodeMCU | GPIO | +| --------------------------- | -------------- | --------------- | +| Batterie | A0 | ADC0 | +| I2C SDA | D2 | GPIO4 | +| I2C SCL | D1 | GPIO5 | +| Moteur gauche avant/arrière | D5 / D6 | GPIO14 / GPIO12 | +| Moteur droit avant/arrière | D7 / D8 | GPIO13 / GPIO15 | +| Servo gouvernail | D4 | GPIO2 | Conseils importants : diff --git a/include/wifi.h b/include/wifi.h index 8450cfb..683f784 100644 --- a/include/wifi.h +++ b/include/wifi.h @@ -1,2 +1,9 @@ -void WifiSetup(void); \ No newline at end of file +void WifiSetup(void); + +struct WifiConfig { + char mqtt_server[40]; + char mqtt_user[32]; + char mqtt_passw[32]; + char api_token[32]; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f11db45..5ab1c2f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,6 +42,10 @@ void setup() { Serial.printf("Stid maritime: role=%s, mode=%s, chip=%06X\n", deviceRole, networkMode, ESP.getChipId()); Serial.println("Firmware skeleton ready; motors remain stopped."); + + Serial.println(); + Serial.print("Adresse MAC STA : "); + Serial.println(WiFi.macAddress()); } void loop() { diff --git a/src/wifi.cpp b/src/wifi.cpp index ccca9c0..8c988b0 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -1,10 +1,39 @@ +/** + * @file wifi.cpp + * @brief Gestion du Wi-Fi et du portail de configuration + * @details + * Ce fichier contient les fonctions nécessaires pour gérer la connexion Wi-Fi de l'ESP8266 et pour lancer un portail de configuration via WiFiManager. + * Il permet à l'utilisateur de configurer les paramètres Wi-Fi et d'autres paramètres personnalisés (comme le serveur MQTT et la clé API) via une interface web. + * @note + * Assurez-vous d'avoir installé la bibliothèque WiFiManager pour que ce code fonctionne correctement + * @author Serge NOEL + * @date 2024-06-15 + * @version 1.0 + */ -void WifiSetup() { - Serial.begin(115200); +void WifiSetup() +{ + static WifiConfig wifiConfig; + + // Définition du code HTML personnalisé pour la liste déroulante (" + "" + "" + "" + "" + ""; + + // Création du paramètre personnalisé + // Syntaxe : WiFiManagerParameter(id, placeholder/label, default_value, length, custom_html) + WiFiManagerParameter custom_device_mode("device_mode", "Mode", "bauto", 40, custom_dropdown_html); // 1. Création des champs personnalisés (ID, Label, Valeur par défaut, Longueur max) - WiFiManagerParameter custom_mqtt_server("mqtt", "Serveur MQTT", mqtt_server, 40); - WiFiManagerParameter custom_api_token("api", "Clé API", api_token, 32); + WiFiManagerParameter custom_mqtt_server("mqtt", "Serveur MQTT", wifiConfig.mqtt_server, 40); + WiFiManagerParameter custom_mqtt_user("mqtt", "Utilisateur MQTT", wifiConfig.mqtt_user, 32); + WiFiManagerParameter custom_mqtt_passw("mqtt", "Mot de passe MQTT", wifiConfig.mqtt_passw, 32); + WiFiManagerParameter custom_api_token("api", "Clé API", wifiConfig.api_token, 32); WiFiManager wifiManager; @@ -12,7 +41,10 @@ void WifiSetup() { wifiManager.setSaveConfigCallback(saveConfigCallback); // 2. Ajouter les champs à l'interface graphique de WiFiManager + wifiManager.addParameter(&custom_device_mode); wifiManager.addParameter(&custom_mqtt_server); + wifiManager.addParameter(&custom_mqtt_user); + wifiManager.addParameter(&custom_mqtt_passw); wifiManager.addParameter(&custom_api_token); // Lance le portail @@ -23,15 +55,17 @@ void WifiSetup() { } // 3. Récupérer les valeurs saisies par l'utilisateur après la validation - strcpy(mqtt_server, custom_mqtt_server.getValue()); - strcpy(api_token, custom_api_token.getValue()); + strcpy(wifiConfig.mqtt_server, custom_mqtt_server.getValue()); + strcpy(wifiConfig.mqtt_user, custom_mqtt_user.getValue()); + strcpy(wifiConfig.mqtt_passw, custom_mqtt_passw.getValue()); + strcpy(wifiConfig.api_token, custom_api_token.getValue()); // Affichage dans le moniteur série Serial.println("Connecté au Wi-Fi !"); Serial.print("Serveur MQTT enregistré : "); - Serial.println(mqtt_server); + Serial.println(wifiConfig.mqtt_server); Serial.print("Clé API enregistrée : "); - Serial.println(api_token); + Serial.println(wifiConfig.api_token); // [Optionnel] Si deconnexion/reconnexion, sauvegarder ici ces variables dans la LittleFS/SPIFFS (mémoire flash) if (doiventSauvegarderConfiguration) { @@ -39,6 +73,12 @@ void WifiSetup() { } } +void saveConfigCallback() { + // Stocker les valeurs saisies par l'utilisateur dans l'EEPROM + EEPROM.put(0, wifiConfig); + Serial.println("Configuration sauvegardée !"); +} + // // Modifier le titre principal de la page web // wifiManager.setPageTitle("Mon Système Domotique");