Niveau:3
Introduction:
Dans cet article nous allons ajouter une page pour le paramétrage du réseau, du nombre de LED et du minuteur d’extinction. De plus, nous allons créer un mode AP pour configurer les paramètres lors de la premier initialisation. La version de base sera la version esp8266_webinterface_1.6.4.zip. Je ne rentrerai pas dans l’ensemble du programme mais expliquerai les modifications effectuées afin de faciliter la lecture du programme.
Client WEB:
Nous allons modifier les pages web de notre client pour ajouter la page parametres.html. Cette page permettra d’envoyer les variables à notre serveur. Bien sur, nous modifierons les liens entre les pages pour permettre leur accès.
La page est assez simple à lire mais vous pouvez retrouver dans cette page les informations envoyées au serveur.
Exemple:
<td><input type="password" value="" style="text-align:center" onchange="submitVal('password',(this.value))" title="Mot de passe"></h2></td>
Permet d’envoyer le mot de passe.
Modification du programme:
Création de deux variables globales:
boolean WifiAP = false; // Mode wifi AP String WIFI_SSID_G=""; // Variable globale pour configuration SSID client Web
Une variable pour connaitre le mode en cours du WIFI AP ou STA et l’autre pour mémoriser le point de connexion sur le serveur web.
Création du sous-programme wifi_verif(). Permettant de vérifier la connexion du wifi en mode STA.
// Vérification du WIFI void wifi_verif() { unsigned long now = millis(); if(now - last_wifi_check_time > WIFI_TIMEOUT) { Serial.print("Vérification du WiFi... "); if(WiFi.status() != WL_CONNECTED) { Serial.println("Erreur de connexion WIFI ..."); Serial.println("Taper wifi pour modifier les paramètres du WIFI"); if (ReseauOut>WIFI_RESET) raz(); ReseauOut++; } else { Serial.println("OK"); Serial.printf("Etat du Wifi %d\n",WiFi.isConnected()); Serial.printf("Hostname est %s\n",WiFi.hostname().c_str()); Serial.print("Addresse IP : "); Serial.println(WiFi.localIP()); Serial.print("Passerelle IP: "); Serial.println(WiFi.gatewayIP()); Serial.print("Masque sous réseau: "); Serial.println(WiFi.subnetMask()); Serial.print("Adresse IP DNS: "); Serial.println(WiFi.dnsIP()); WifiAP =false; if(Ping.ping(WiFi.gatewayIP())) { Serial.println("Ping Passerelle OK :)"); ReseauOut=0; } else { Serial.println("Ping Passerelle erreur :("); if (ReseauOut>WIFI_RESET) raz(); ReseauOut++; } } last_wifi_check_time = now; } }
Modification du sous-programme Loop afin de ne pas lancer les sous-programmes de vérification du wifi, de la synchronisation de l’heure et des alarmes en mode AP.
if (WifiAP ==false) { Date_Heure(); Alarm.delay(0); wifi_verif(); if(auto_cycle && (now - auto_last_change > 10000)) { // cycle effect mode every 10 seconds uint8_t next_mode = (ws2812fx.getMode() + 1) % ws2812fx.getModeCount(); if(sizeof(myModes) > 0) { // if custom list of modes exists for(uint8_t i=0; i < sizeof(myModes); i++) { if(myModes[i] == ws2812fx.getMode()) { next_mode = ((i + 1) < sizeof(myModes)) ? myModes[i + 1] : myModes[0]; break; } } } ws2812fx.setMode(next_mode); Serial.print("mode is "); Serial.println(ws2812fx.getModeName(ws2812fx.getMode())); auto_last_change = now; } }
Ajout des fonctionnalités dans le serveur (sous-programme void srv_handle_set()) pour la communication avec le client web.
// Réinitialisation if(server.argName(i) == "raz") { raz(); } // WIFI SSID if(server.argName(i) == "ssid") { WIFI_SSID_G=(&server.arg(i)[0]); Serial.println("Configuration Client Web SSID: "+ WIFI_SSID_G); } // WIFI mot de passe if(server.argName(i) == "password") { WIFI_PASSWORD=(&server.arg(i)[0]); Serial.println("Configuration Client Web Mdp: "+WIFI_PASSWORD); EcritureWifiEeprom(WIFI_SSID_G,WIFI_PASSWORD); } // WIFI IP FIXE ou DHCP if(server.argName(i) == "ipfixe") { WIFI_IP=(&server.arg(i)[0]); EEPROM.write(ADRESS_RESEAU,0); if (WIFI_IP!="0"){ EEPROM.write(ADRESS_RESEAU,1); EEPROM.write(ADRESS_RESEAU +5, IPnum(WIFI_IP,3)); } EEPROM.commit(); Serial.println("Configuration Client Web FIXE/DHCP: "+String(EEPROM.read(ADRESS_RESEAU))); Serial.println("Configuration Client Web IP FIXE: "+String(EEPROM.read(ADRESS_RESEAU+5))); } // WIFI IP Passerelle if(server.argName(i) == "ippasse") { WIFI_IP=(&server.arg(i)[0]); Serial.print("Configuration Client Web IP Passerelle: "); for (int i = 0; i <4; ++i) { EEPROM.write(i + ADRESS_RESEAU +1, IPnum(WIFI_IP,i)); EEPROM.commit(); Serial.print(String(EEPROM.read(i+ADRESS_RESEAU+1))+"."); } Serial.println(""); } // Nombres de LED if(server.argName(i) == "nbled") { EEPROMWritelong(ADRESS_NLED,String(&server.arg(i)[0]).toInt(),2); EEPROM.commit(); Serial.println("Configuration Client Web Nb LED: "+String(EEPROM.read(ADRESS_NLED))); }
Modification du sous programme void wifi_setup() pour ajouter le mode AP lorsque le mode STA ne fonctionne pas(Timeout). Le mot de passe corresponds au SSID du mode AP.
if(millis() - connect_start > WIFI_TIMEOUT) { Serial.println(); Serial.println("Erreur de connexion WIFI. Vérifier vos paramètres WIFI"); Serial.print("Dépassement du temps de connexion: "); Serial.println(WIFI_TIMEOUT); Serial.println("Mode AP"); // Mise en route du mode AP WiFi.disconnect(true); WiFi.mode(WIFI_AP); String ssid = "MyLED" + String(ESP.getChipId()); String password="MyLED" + String(ESP.getChipId()); WiFi.softAP(ssid.c_str(),password.c_str()); WifiAP =true; return; }
Utilisation:
Pour le mot de passe en mode AP prendre le nom du SSID pour la connexion. Taper l’adresse 192.168.4.1 en mode AP pour accéder au client WEB. Le mode AP, se mettra en route si le mode STA ne fonctionne pas pendant 60 secondes.
Dans le champs, IP Fixe ou DHCP, taper l’adresse IP complète pour le mode fixe ou 0 pour le mode DHCP
Programme source:
esp8266_webinterface_1.6.5.zip