ESP01 Contrôle des diodes WS2812 à l’aide de l’IDE Arduino-Part9


Niveau:3

Introduction:

Dans cet article nous allons ajouter:

  • Une page pour la visualisation de l’ensemble des paramètres ( Alarmes,réseau,nombres de LED).
  • Le paramétrage du fuseau horaire.
  • Optimiser la gestion des alarmes et ajout d’une sixième alarme.
  • Créer un mode custom permettant de faire une animation bleu blanc rouge.

La partie optimisation des alarmes ne sera pas détaillée dans cet article.

Programme source esp8266_webinterface_1.6.5.zip d’origine.

Modification du fuseau horaire:

Dans notre programme nous allons ajouter l’adresse de stockage du fuseau horaire, pour cela nous devons décaler les adresses de gestion des alarmes.

#define ADRESS_GMT 117 // Paramètre GMT heure été/hivers

#define ADRESS_AL0 217 // Adresse mémorisation paramètres alarme0 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode
#define ADRESS_AL1 224 // Adresse mémorisation paramètres alarme1 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode 
#define ADRESS_AL2 231 // Adresse mémorisation paramètres alarme2 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode 
#define ADRESS_AL3 238 // Adresse mémorisation paramètres alarme3 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode
#define ADRESS_AL4 245 // Adresse mémorisation paramètres alarme4 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode
#define ADRESS_AL5 252 // Adresse mémorisation paramètres alarme4 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode - Fin 258
#define ADRESS_ALB 7 // Nombres de mots par alarme
#define NB_ALARME 6 // Nombres d'alarme

Dans la partie setup du programme, ajoutons la lecture de la valeur dans EEPROM et initialisons notre client ntp avec cette valeur.

int8_t tmp=EEPROM.read(ADRESS_GMT); // Lecture du fuseau horaire
 if (tmp > -12 && tmp < 13) timeClient.setTimeOffset(3600*tmp); // Initialisation du fuseau

Dans la partie srv_handle_set() ajouter le code ci-dessous pour interagir avec le client web.

 // Heure GMT
 if(server.argName(i) == "gmt") {
 int8_t tmp = (int8_t) strtol(&server.arg(i)[0], NULL, 10);
 EEPROM.write(ADRESS_GMT,tmp);
 EEPROM.commit();
 tmp=EEPROM.read(ADRESS_GMT);
 if (tmp > -12 && tmp < 13) timeClient.setTimeOffset(3600*tmp); // Initialisation du fuseau
 Serial.println("Configuration GMT: "+String(tmp));
 }

Dans le client web parametres.html ajouter le code ci-dessous.

<tr>
 <td><h2>Heure GMT </td>
 <td><input type="number" value="" style="text-align:center" onchange="submitVal('gmt',(this.value))" title="Valeur GMT Exemple: Ete=1 ou Hiver=2"></h2></td>
 </tr>

Visualisation de l’ensemble des paramètres:

Dans le programme, nous allons créer un serveur état que nous interrogerons avec notre client web. Pour cela, ajouter les lignes suivante dans notre programme.

void srv_handle_etat() {
 String valeur;
 char buf[10];
 long temp;
 for (uint8_t i=0; i < server.args(); i++){
 // Etat wifi
 if(server.argName(i) == "wifi") {
 valeur=(&server.arg(i)[0]);
 if (valeur == "ssid"){ 
 server.send(200,"text/plain",(LectureWifiEeprom(1).c_str())); // Lecture WIFI SSID 
 }
 if (valeur=="ip"){ 
 server.send(200,"text/plain", (WiFi.localIP().toString().c_str())); // Lecture WIFI IP
 }
 if (valeur=="routeur"){ 
 server.send(200,"text/plain",(WiFi.gatewayIP().toString().c_str())); // Lecture WIFI IP passerelle
 }
 if (valeur=="host"){ 
 server.send(200,"text/plain", (WiFi.hostname().c_str())); // Lecture WIFI hostname 
 } 
 if (valeur=="ipdns"){ 
 server.send(200,"text/plain", (WiFi.dnsIP().toString().c_str())); // Lecture WIFI IP DNS
 }
 if (valeur=="mask"){ 
 server.send(200,"text/plain", (WiFi.subnetMask().toString().c_str())); // Lecture WIFI masque sous reseau
 } 
 }
 // Etat configuration
 if(server.argName(i) == "conf") {
 valeur=(&server.arg(i)[0]);
 if (valeur == "nbled"){ 
 temp=(EEPROMReadlong(ADRESS_NLED,2));
 ltoa(temp, buf, 10); 
 server.send(200,"text/plain",buf); // Lecture nb led 
 }
 if (valeur == "timer"){
 temp=(EEPROMReadlong(ADRESS_MINUTEUR,4));
 if (temp>0) temp=(temp/60); else temp=0;
 ltoa(temp, buf, 10); 
 server.send(200,"text/plain",buf); // Lecture valeur timer
 }
 if (valeur == "gmt"){
 int8_t temp=EEPROM.read(ADRESS_GMT);;
 ltoa(temp, buf, 10); 
 server.send(200,"text/plain",buf); // Lecture valeur GMT
 }
 }
 // Etat alarmes
 if(server.argName(i) == "alarme") {
 valeur=(&server.arg(i)[0]);
 if (valeur == "0"){ 
 server.send(200,"text/plain",EtatAl(0)); // Lecture Alarme1
 }
 if (valeur == "1"){ 
 server.send(200,"text/plain",EtatAl(1)); // Lecture Alarme2
 }
 if (valeur == "2"){ 
 server.send(200,"text/plain",EtatAl(2)); // Lecture Alarme3
 }
 if (valeur == "3"){ 
 server.send(200,"text/plain",EtatAl(3)); // Lecture Alarme4
 }
 if (valeur == "4"){ 
 server.send(200,"text/plain",EtatAl(4)); // Lecture Alarme5
 }
 if (valeur == "5"){ 
 server.send(200,"text/plain",EtatAl(5)); // Lecture Alarme6
 }
 }
 // Etat liste
 if(server.argName(i) == "liste") {
 valeur=(&server.arg(i)[0]);
 // Liste des modes
 if (valeur == "modes"){ 
 String modes = "<datalist id=\"modes\">";
 uint8_t num_modes = sizeof(myModes) > 0 ? sizeof(myModes) : ws2812fx.getModeCount();
 for(uint8_t i=0; i < num_modes; i++) {
 uint8_t m = sizeof(myModes) > 0 ? myModes[i] : i;
 Serial.println(ws2812fx.getModeName(m));
 modes =modes+ "<option value=\""+ (ws2812fx.getModeName(m))+"\""+">"+"\n";
 } 
 server.send(200,"text/plaint",modes); //Liste modes 
 }
 }
 }
}

Nous allons aussi créer une fonction pour lire l’état de nos alarmes. En voici le code ci-dessous.

String EtatAl(uint8_t NumAlarme){
 String texte;
 if (EEPROM.read(ADRESS_AL0+ADRESS_ALB*NumAlarme)==255) {texte="Libre";return texte;}
 texte="ID: "+ String(EEPROM.read(ADRESS_AL0+ADRESS_ALB*NumAlarme))
 +" H: "+ String(EEPROM.read(ADRESS_AL0+1+ADRESS_ALB*NumAlarme))
 +" M: "+ String(EEPROM.read(ADRESS_AL0+2+ADRESS_ALB*NumAlarme));
 if ((EEPROM.read(ADRESS_AL0+3+ADRESS_ALB*NumAlarme))==1) texte=texte+ " On "; else texte=texte+ " Off ";
 texte=texte +" Jour: "+ String(EEPROM.read(ADRESS_AL0+4+ADRESS_ALB*NumAlarme))
 +" Couleur: "+ String(EEPROM.read(ADRESS_AL0+5+ADRESS_ALB*NumAlarme)) 
 +" Mode: "+ (ws2812fx.getModeName((EEPROM.read(ADRESS_AL0+6+ADRESS_ALB*NumAlarme))));
 return texte;
}

Pour le client WEB, j’ai créé une fonction en javascript au chargement de la page qui envoie des requêtes afin d’avoir les états des différents paramètres. Voir fichier etat.html.

Programme source:

esp8266_webinterface_1.6.6.zip

Paramétrage du mode custom:

La version ci-dessous permet de paramétrer le mode custom.

esp8266_webinterface_1.6.7.zip

Dernière version:

Utilisation d’Alexa Echo Amazon V1.8.0. esp8266_web_Alexa_1.8.0.zip

Mise à jour via OTA .esp8266_web_Alexa.zip avec mémoire de 1M et 64K pour SIPFFS.

Configuration de la broche de sortie pour le bandeau LED. Valeur par défaut 2.

Dernière version sur https://github.com/christophe94700/WS2812FX-fr avec source et fichiers binaires.