Utilisation du chien de garde sur esp8266
Bonjour,
dans le cadre de mon système domotique en inspirant de programmes présents sur le web j'ai développé un petit programme qui informe le serveur de la bonne prise en compte de l'ordre d'allumer ou d'éteindre le chauffage. Je désire aller plus loin dans la fiabilisation de mon asservissement en m'assurant qu'en cas de défaillance du logiciel (exemple parasite électromagnétique) mon esp effectuera automatiquement un Reset
Pour ce faire la solution qui m'est venue immédiatement à l'esprit est l'utilisation du chien de garde matériel.
Après avoir lu plusieurs articles sur le sujet et avec l'aide de google traduction pour les textes en anglais j'ai mis en place dans le setup l'instruction ESP.wdtDisable() qui selon ma compréhension de son fonctionnement désactive le chien de garde logiciel tout en activant le chien de garde matériel.
Comme mon programme dure nettement moins que six secondes ( en particulier lorsqu'aucun client n'est connecté) je n'ai pas mis dans un premier temps la fonction ESP.wdtFeed(); destinée à réinitialiser le chien de garde. En effet j'ai lu que le fait de reboucler le loop réinitialise le timer du chien de garde
Lorsque je lance le programme et sans connexion d'un client le Reset du chien de garde se déclenche toutes les six secondes et cela même si ce complète la boucle loop de la fonction qui alimente le chien de garde
Pourriez vous m'aider et me signaler mon erreur de compréhension dans l'utilisation du chien de garde
ci joint le programme
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include <ESP8266WiFi.h>
//pécifier le SSID du point d'accès Wifi
const char* ssid="xxxxxxxxxx";
const char* pass ="ddddddddd;";
unsigned long dure;
//Créer le serveur web
WiFiServer serveur(80);
//Démarrage
void setup() {
Serial.begin(115200);
//petite pause
delay(50);
//GPIO0 en sortie
pinMode(0,OUTPUT);
// GPIOO état haut
digitalWrite(0,1);
Serial.println();
Serial.println();
Serial.println("Connexion a : ");
Serial.println(ssid);
//Connexion au point d'accès
WiFi.begin(ssid, pass);
while(WiFi.status() !=WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("");
Serial.print("WiFi connecté");
//Démarrage du serveur web
serveur.begin();
Serial.println("Serveur actif");
//on affiche l'adresse IP
Serial.println(WiFi.localIP());
//on déactive le chien de garde logiciel seul le chien de garde matériel reste
//si la boucle loop dure moins de 6 secondes pas besoin de nourrir le chien de garde
//car le retour en début de boucle le fait automatiquement
//ESP.wdtDisable();
}
//boucle principale
void loop() {
// recherche d'un client connecté
WiFiClient client =serveur.available();
if(!client) {
//non on repart dans la boucle
return;
}
// un client est connecté
Serial.println("nouveau client");
// on attend l'envoi de données
while(!client.available()){
delay(1);
}
//on récupère la ligne qu'il envoie jusqu'au premier retour de chariot
String req=client.readStringUntil('\r');
//on affiche la ligne obtenue
Serial.println(req);
//on purge
client.flush();
// on teste la requete
int val;
//Est ce que le chemin dans la requete est/gpio/0"
if(req.indexOf("/gpio/0")!=-1){
//cela correspond à éteindre donc à mettre à l'état haut la sortie GPIO0
val=1;
Serial.println("bascule a 1");
Serial.println(val);
}
else if(req.indexOf("/gpio/1")!=-1){
//cela correspond à allumer donc à mettre à l'état bas la sortie GPIO0
val=0;
Serial.print("bascule a 0");
Serial.println(val);
}
else {
//c'est un autre chemin on indique qui est donné. on indique qu'il correspond à rien
Serial.println("Chemin non valide");
String s="HTTP/1.1 200 OK\r\Content-Type: text/html\r\n\r\n<DOCTYPE HTML>\r\n\La sortie est a l'etat";
s+="Ordre non connu";
//on finit la page HTML
s+="</html>\n";
//on envoie la réponse
client.print(s);
//on déconnecte le client du serveur
client.stop();
// on reboucle sur le loop
return;
}
// nous allons prendre en compte la demande en changeant l'état de sortie
digitalWrite(0,val);
// on purge avant d'envoyer la réponse
client.flush();
//composition de la réponse
String s="HTTP/1.1 200 OK\r\Content-Type: text/html\r\n\r\n<DOCTYPE HTML>\r\n\La sortie est a l'etat";
s+=(val)?"allumé":"coupé";
//on finit la page HTML
s+="</html>\n";
//on envoie la réponse
client.print(s);
//pause
delay(1);
Serial.println("Client deconncete");
// on ne met pas l'instruction client.stop()) car la fin du loop l'entrai ne automatiquement)
//ESP.wdtFeed();
} |