Niveau:3
Introduction:
Dans cet article, nous allons mettre en place une gestion de mise en marche et l’arrêt de notre bandeau LED suivant un calendrier journalier ou hebdomadaire. Nous partirons de la version esp8266_webinterface_1.6.3.zip.
Bibliothèques:
Nous allons utiliser la bibliothèque StringSplitter pour décomposer les paramètres d’alarme envoyer par le client WEB. Vous pouvez la télécharger https://github.com/aharshac/StringSplitter ou sur mon site StringSplitter-master.zip
Nous auront 7 paramètres à décomposer:
ID de l’alarme, Heure de déclenchement ,Minute de déclenchement, Marche/Arrêt, Jour,Couleur,Mode.
Une fois la bibliothèque installée, vous devez augmenter la taille maximal du nombre de paramètre à décomposer par défaut nous somme à 5 Max. Pour cela, vous devez ouvrir le fichier StringSplitter.h et modifier le paramètre static const unsigned int MAX = 5; en le passant à 10 par exemple static const unsigned int MAX = 10;.
Modification du programme:
Ajouter la déclaration de la bibliothèque:
#include <StringSplitter.h> //Inclusion bibliothèque pour création d'un tableau depuis chaine avec séparateur Modifier nbrs MAX 5 => 10
Ajouter la déclaration des adresses de stockage des paramètres dans l’EEPROM:
#define ADRESS_AL0 117 // Adresse mémorisation paramètres alarme0 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode #define ADRESS_AL1 124 // Adresse mémorisation paramètres alarme1 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode #define ADRESS_AL2 131 // Adresse mémorisation paramètres alarme2 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode #define ADRESS_AL3 138 // Adresse mémorisation paramètres alarme3 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode #define ADRESS_AL4 145 // Adresse mémorisation paramètres alarme4 7 Bytes ID,Heure,Minute,On/Off, Jour/toujours,couleur,mode - Fin 151 #define ADRESS_ALB 7 // Nombres de mots par alarme
Ajouter la variable pour le tableau des ID des alarmes:
uint8_t Alarme[]={dtINVALID_ALARM_ID,dtINVALID_ALARM_ID,dtINVALID_ALARM_ID,dtINVALID_ALARM_ID,dtINVALID_ALARM_ID}; // Identification de l'alarme 0 à 4 (5 alarmes) valeur par defaut 255
Ajouter les sous-programmes ci-dessous:
// Gestion des alarmes void Active_Alarme(String ParaAl){ int NumAlarme=0, NumHeure=0, NumMinute=0, NumOnOff=0,NumJour=0,NumCouleur=0,NumMode=0; // Lecture des paramètres StringSplitter *splitter = new StringSplitter(ParaAl, ',', 7); // Initialisation de la classe avec 7 paramètres int itemCount = splitter->getItemCount(); String para[itemCount]; for(int i = 0; i < itemCount; i++){ String item = splitter->getItemAtIndex(i); Serial.print("Valeur" + String(i) + ": " + (item)+" "); para[i]=item; } Serial.println("Alarme"+(para[0])+" "); Serial.println("Pramètres Alarme "+ (para[0]) +": " + ParaAl); if ((para[0]).toInt()<5){ // Paramètre N° alarme de 0 à 4 NumAlarme=(para[0]).toInt(); } else return; // if (Alarme[NumAlarme]!= dtINVALID_ALARM_ID) { // Libération de l'alarme Alarm.free(Alarme[NumAlarme]); Alarme[NumAlarme]=dtINVALID_ALARM_ID; EEPROM.write((ADRESS_AL0+ADRESS_ALB*NumAlarme),255); // Paramètre 0 ID à 255 EEPROM.commit(); } if ((para[1]).toInt()<24 && (para[1]).toInt()>=0){ // Paramètre Heure de 0 à 23 NumHeure=(para[1]).toInt(); } else return; // if ((para[2]).toInt()<60 && (para[2]).toInt()>=0){ // Paramètre Minute de 0 à 59 NumMinute=(para[2]).toInt(); } else return; // if ((para[3]).toInt()<2 && (para[3]).toInt()>=0){ // Paramètre Marche=1 Arrêt=0 NumOnOff=(para[3]).toInt(); } else return; // if ((para[4]).toInt()<8 && (para[4]).toInt()>=0){ // Paramètre Jour 0 à 7 Toujours=0 NumJour=(para[4]).toInt(); } else return; // if ((para[5]).toInt()<6 && (para[5]).toInt()>=0){ // Paramètre Couleur 0 à 5 NumCouleur=(para[5]).toInt(); } else return; // if ((para[6]).toInt()<56 && (para[6]).toInt()>=0){ // Paramètre Mode 0 à 55 NumMode=(para[6]).toInt(); } else return; // Alarm_Select(NumAlarme,NumHeure,NumMinute,NumOnOff,NumJour); //dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday Serial.print("ID alarme " + String(NumAlarme) +": "); Serial.println(Alarme[NumAlarme]); // Sauvegarde paramètres EEPROM EEPROM.write((ADRESS_AL0+ADRESS_ALB*NumAlarme),Alarme[NumAlarme]); // Paramètre 0 ID EEPROM.write((ADRESS_AL0+1+ADRESS_ALB*NumAlarme),NumHeure); // Paramètre 1 Heure EEPROM.write((ADRESS_AL0+2+ADRESS_ALB*NumAlarme),NumMinute); // Paramètre 2 Minute EEPROM.write((ADRESS_AL0+3+ADRESS_ALB*NumAlarme),NumOnOff); // Paramètre 3 on/off; EEPROM.write((ADRESS_AL0+4+ADRESS_ALB*NumAlarme),NumJour); // Paramètre 4 Jour; EEPROM.write((ADRESS_AL0+5+ADRESS_ALB*NumAlarme),NumCouleur); // Paramètre 5 Couleur; EEPROM.write((ADRESS_AL0+6+ADRESS_ALB*NumAlarme),NumMode); // Paramètre 6 Mode; EEPROM.commit(); // Ecriture de la RAM vers EEPROM } void AlarmInit(){ int ID=0,NumAlarme=0, NumHeure=0, NumMinute=0, NumOnOff=0,NumJour=0; for (int i=0; i <5; i++){ NumAlarme=i; ID=EEPROM.read(ADRESS_AL0+ADRESS_ALB*NumAlarme); NumHeure=EEPROM.read(ADRESS_AL0+1+ADRESS_ALB*NumAlarme); NumMinute=EEPROM.read(ADRESS_AL0+2+ADRESS_ALB*NumAlarme); NumOnOff=EEPROM.read(ADRESS_AL0+3+ADRESS_ALB*NumAlarme); NumJour=EEPROM.read(ADRESS_AL0+4+ADRESS_ALB*NumAlarme); Serial.println("Initialisation Alarme "+String (NumAlarme)+" : Valeur ID"+ String (ID)+" H:"+ String (NumHeure)+" M:"+ String (NumMinute)+" ON OFF:"+ String (NumOnOff)+" Jour:"+ String (NumJour)); Alarm.free(Alarme[NumAlarme]); Alarme[NumAlarme]=dtINVALID_ALARM_ID; if (ID!=255){ Alarm_Select(NumAlarme,NumHeure,NumMinute,NumOnOff,NumJour); Serial.println("Alarme "+String (NumAlarme)+" : ID "+ String (Alarme[NumAlarme])+ "= Active"); } } } void Alarm_Select(int NumAlarme,int NumHeure,int NumMinute,int NumOnOff,int NumJour){ //dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday switch (NumJour) { case 0: // Toujours if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(NumHeure,NumMinute,0,Alarm_Off); break; case 1: // Dimanche if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowSunday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowSunday,NumHeure,NumMinute,0,Alarm_Off); break; case 2: // Lundi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowMonday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowMonday,NumHeure,NumMinute,0,Alarm_Off); break; case 3: // Mardi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowTuesday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowTuesday,NumHeure,NumMinute,0,Alarm_Off); break; case 4: // Mercredi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowWednesday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowWednesday,NumHeure,NumMinute,0,Alarm_Off); break; case 5: // Jeudi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowThursday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowThursday,NumHeure,NumMinute,0,Alarm_Off); break; case 6: // Vendredi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowFriday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowFriday,NumHeure,NumMinute,0,Alarm_Off); break; case 7: // Samedi if (NumOnOff==1) Alarme[NumAlarme]=Alarm.alarmRepeat(dowSaturday,NumHeure,NumMinute,0,Alarm_On); if (NumOnOff==0) Alarme[NumAlarme]=Alarm.alarmRepeat(dowSaturday,NumHeure,NumMinute,0,Alarm_Off); break; default: //Erreur Initialisation Alarmes Serial.println("Erreur Initialisation Alarme "+String (NumAlarme)+" :"); } } void Alarm_On() { // Allume le badeau LED Serial.println("Alarme Enclechement ID :"+String(Alarm.getTriggeredAlarmId())); int ID=0,NumAlarme=0,NumCouleur=0,NumMode=0; for (int i=0; i <5; i++){ NumAlarme=i; ID=EEPROM.read(ADRESS_AL0+ADRESS_ALB*NumAlarme); if (ID==Alarm.getTriggeredAlarmId()){ NumCouleur=EEPROM.read(ADRESS_AL0+5+ADRESS_ALB*NumAlarme); NumMode=EEPROM.read(ADRESS_AL0+6+ADRESS_ALB*NumAlarme); // Lecture valeur Mémoire mode Serial.println("Mode alame"+ String(NumMode)); switch (NumCouleur){ case 0: ws2812fx.setColor(0x00ff00); // Lecture valeur couleur verte break; case 1 : ws2812fx.setColor(0x0000ff); // Lecture valeur couleur Bleue break; case 2 : ws2812fx.setColor(0xff0000); // Lecture valeur couleur Rouge break; case 3 : ws2812fx.setColor(0xff00ff); // Lecture valeur couleur Fuschia break; case 4 : ws2812fx.setColor(0x9900ff); // Lecture valeur couleur Violette break; case 5 : ws2812fx.setColor(0xFF9E25); // Lecture valeur couleur Blanc break; } ws2812fx.setMode(NumMode); } } Alarm.disable(AlarmeMin); ws2812fx.start(); EEPROM.write(ADRESS_ON_OFF,1); // Sauvegarde LED en marche EEPROM.commit(); // Ecriture de la RAM vers EEPROM } void Alarm_Off() { // Etient le badeau LED Serial.println("Alarme Enclechement ID :"+String(Alarm.getTriggeredAlarmId())); ws2812fx.stop(); EEPROM.write(ADRESS_ON_OFF,0); // Sauvegarde LED en marche EEPROM.commit(); // Ecriture de la RAM vers EEPROM }
Les sous programmes permette initialisation des alarmes, la sauvegarde des paramètres, et l’enclenchement des alarmes.
Ajouter dans le partie serveur WEB, sous-programme srv_handle_set() le code si dessous:
// Alarme if(server.argName(i) == "tal") { // Alarme0 Active_Alarme(String(&server.arg(i)[0])); }
Puis dans la boucle du setup modifier la fin du programme comme ci-dessous:
Date_Heure(); // initialisation de la date et de l'heure Serial.print("ID alarme Minuteur: "); AlarmeMin=(Alarm.timerRepeat(1, Timer1S)); // Timer toute les 60 secondes Serial.println(AlarmeMin); // ID de la minuterie Alarm.disable(AlarmeMin); // Arrêt de la minuterie AlarmInit(); // Initialisation des alarmes
Client WEB:
Pour le client Web, nous allons créer une nouvelle page (alarme.html) avec son fichier js et css.
Dans le fichier alarme.html, mettrons les listes pour l’ensemble des entrées suivantes: Marche/Arrêt, Jour, Couleur,Mode. Et grâce à une fonction dans notre fichier JS, nous allons associer une valeur d’index à un choix. Par exemple: Lundi aura une valeur de 2 car la liste commence à la valeur 0.
Cela nous permet d’envoyer une requête sous la forme suivante: set?tal=0,16,32,1,1,1,0 qui sera décodé par le serveur.
En images:
Utilisation:
Pour valider une alarme saisir l’ensemble des 6 paramètres, faire un clique sur l’alarme pour qu’elle apparaisse en vert et valider. Si les paramètres sont incorrectes, l’alarme ne sera pas fonctionnelle.
Pour effacer une alarme, sélectionner l’alarme sans rien saisir et valider.
Vous pouvez valider plusieurs alarmes en les sélectionnant.
Programme source:
esp8266_webinterface_1.6.4.zip