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

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