{"id":1612,"date":"2018-12-07T15:39:44","date_gmt":"2018-12-07T20:39:44","guid":{"rendered":"https:\/\/espacerm.com\/webgen\/?page_id=1612"},"modified":"2019-03-15T22:16:53","modified_gmt":"2019-03-16T03:16:53","slug":"linterface-web","status":"publish","type":"page","link":"https:\/\/espacerm.com\/webgen\/linterface-web\/","title":{"rendered":"L&rsquo;interface Web du d\u00e9clencheur de relais"},"content":{"rendered":"\n<p>Interface utilisateur pour afficher des donn\u00e9es, modifier des param\u00e8tres et passer des commandes. Aucune installation sp\u00e9cifique de programme sur l&rsquo;unit\u00e9 du client. Interface multilogiciel, fonctionne avec les fureteurs des diff\u00e9rentes plateformes.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Mode WIFI<\/h4>\n\n\n\n<p>Au d\u00e9marrage le mode r\u00e9seau WiFi est activ\u00e9 automatiquement. En un premier temps, le programme essaie de monter une connexion WiFi sur le r\u00e9seau WiFi identifi\u00e9 dans la variable \u00abssid\u00bb du programme&nbsp;avec l&rsquo;adresse IP pr\u00e9configur\u00e9e.&nbsp; Apr\u00e8s un certain nombre d&rsquo;essais, si la connexion n&rsquo;est pas \u00e9tablie, le programme configure le circuit en Point d&rsquo;acc\u00e8s WiFi.<\/p>\n\n\n\n<p><strong>Fonctions de la DEL<\/strong><\/p>\n\n\n\n<p>Une DEL RGB est utilis\u00e9e pour afficher 3 conditions<\/p>\n\n\n\n<ul><li>Vert&nbsp; &nbsp; &nbsp; &nbsp;: Le circuit est en mode Client WiFi<\/li><li>Rouge&nbsp; &nbsp;: Le circuit est en mode Point d&rsquo;acc\u00e8s<\/li><li>Orange : Le voltage de la source d&rsquo;alimentation est sous un certain seuil. La DEL clignote entre Orange et Rouge ou Vert pour conserver l&rsquo;information du mode r\u00e9seau<\/li><\/ul>\n\n\n\n<p>Afin d&rsquo;ajuster au besoin l&rsquo;intensit\u00e9 et la couleur de la DEL, le programme fait appel une fonction&nbsp;&nbsp;(<a rel=\"noreferrer noopener\" href=\"https:\/\/randomnerdtutorials.com\/esp32-pwm-arduino-ide\/\" target=\"_blank\">ledcWrite<\/a>)&nbsp; qui module la sortie PWM des broches selon la valeur fournie \u00e0 la fonction<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">EEPROM<\/h4>\n\n\n\n<p>Les donn\u00e9es importantes \u00e0 conserver, m\u00eame lors de mise hors tension, sont enregistr\u00e9es dans la m\u00e9moire flash <a href=\"https:\/\/randomnerdtutorials.com\/esp32-flash-memory\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Les donn\u00e9es importantes \u00e0 conserver, m\u00eame lors de mise hors tension, sont enregistr\u00e9es dans la m\u00e9moire flash EEPROM. L'enregistrement s'ex\u00e9cute lors du changement d'une donn\u00e9e. (ouverture dans un nouvel onglet)\">EEPROM<\/a>. L&rsquo;enregistrement s&rsquo;ex\u00e9cute lors du changement d&rsquo;une donn\u00e9e.<\/p>\n\n\n\n<p><strong>Mesure de voltages<\/strong><\/p>\n\n\n\n<p>Le voltage de la source d&rsquo;alimentation est surveill\u00e9. La donn\u00e9e est envoy\u00e9e \u00e0 l&rsquo;interface Web lors d&rsquo;une requ\u00eate du client. Une DEL clignote en orange pour indiquer que le voltage est sous le seuil \u00e9tabli.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L&rsquo;interface client<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"325\" height=\"624\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2018\/12\/interface-web_00-2.jpg\" alt=\"\" class=\"wp-image-1627\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2018\/12\/interface-web_00-2.jpg 325w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2018\/12\/interface-web_00-2-156x300.jpg 156w\" sizes=\"(max-width: 325px) 100vw, 325px\" \/><\/figure>\n\n\n\n<p><strong>Affichage&nbsp;<\/strong><\/p>\n\n\n\n<p><em>Voltage de la source d&rsquo;alimentation. <\/em>Voltage \u00e9valu\u00e9 par programmation<\/p>\n\n\n\n<p><em>D\u00e9lai de r\u00e9action<\/em>. D\u00e9lai avant d&rsquo;activer le relais suite \u00e0 une demande d&rsquo;activation. Celui-ci peut-\u00eatre en microseconde ou en milliseconde au choix de l&rsquo;utilisateur.<\/p>\n\n\n\n<p><em>Dur\u00e9e d&rsquo;activation du relais.<\/em> P\u00e9riode pendant laquelle le relais reste activ\u00e9 suite \u00e0 une demande d&rsquo;activation. Dur\u00e9e configurable par le client.<\/p>\n\n\n\n<p><em>Dur\u00e9e avant le retour aux d\u00e9tecteurs<\/em>. D\u00e9lai configurable d&rsquo;attente ajout\u00e9 \u00e0 la fin de l&rsquo;op\u00e9ration du relais. Blocage volontaire avant de redonner la main \u00e0 la suite du programme. Exemple d&rsquo;utilisation: Quand le circuit sert au d\u00e9clenchement d&rsquo;un appareil photographique, l&rsquo;activation du relais est tr\u00e8s courte. Le d\u00e9lai de retour assure le blocage du programme tant que le temps d&rsquo;exposition n&rsquo;est pas expir\u00e9.<\/p>\n\n\n\n<p><strong>Bouton RELAIS<\/strong><\/p>\n\n\n\n<p>Le clic du bouton envoie la requ\u00eate d&rsquo;activation du relais<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Champs de saisie de donn\u00e9es<\/h4>\n\n\n\n<p>Trois champs de saisie de donn\u00e9es et deux boutons permettent \u00e0 l&rsquo;utilisateur de configurer les param\u00e8tres selon ses besoins.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Lignes d&rsquo;action<\/h4>\n\n\n\n<p>Deux lignes cliquables permettent d&rsquo;incr\u00e9menter ou de d\u00e9cr\u00e9menter, d&rsquo;une unit\u00e9, le d\u00e9lai de r\u00e9action<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">L&rsquo;APPLICATION<\/h2>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>L&rsquo;application est divis\u00e9e en trois fichiers. Ils doivent \u00eatre placer dans le m\u00eame r\u00e9pertoire nomm\u00e9 \u00abDeclencheur_de_relais_01\u00bb<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">T\u00e9l\u00e9chargement<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/rcepmorel\/Declencheur_de_relais_01\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (ouverture dans un nouvel onglet)\">https:\/\/github.com\/rcepmorel\/Declencheur_de_relais_01<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><br>D\u00e9tails des fichiers<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\"><br>connect_id_Wifi.h<\/h4>\n\n\n\n<p>Fichier dans lequel vous incorporer les param\u00e8tres r\u00e9seau que vous voulez utiliser<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const char* ssid     = \"Le nom du r\u00e9seau WiFi\"; \/\/ R\u00e9seau \u00e0 acc\u00e9der\nconst char* password = \"Le mot de passe du r\u00e9seau WiFI\";\n\nconst char* ssid_AP = \"Nom donn\u00e9 au point d'acc\u00e8s\"; \/\/ Point d'acc\u00e8s \nconst char* password_AP = \"Mot de passe donn\u00e9 au point d'acc\u00e8s\";\n\n\n\/\/ Set your Static IP address\nIPAddress local_IP(192, 168, 1, 141);\n\/\/ Set your Gateway IP address\nIPAddress gateway(192, 168, 1, 1);\n\nIPAddress subnet(255, 255, 0, 0);\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Declencheur_de_relais_01.ino<\/h4>\n\n\n\n<p>Fichier principal<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*      D\u00c9CLENCHEUR DE RELAIS\n* \n* Auteur : Richard Morel\n*     2018-11-09\n* \n* Modification\n*     2018-11-17\n*     - Mesure du voltage d'entr\u00e9e\n*     - Ajout du clignotement de la DEL bleue\n*       Reli\u00e9 sur la broche D33\n*    2018-11-30\n*     - Ajout du d\u00e9clencheur de relais\n*       Reli\u00e9 sur le GPIO 32\n*     - Ajout du d\u00e9tecteur du rayon laser pour d\u00e9clencher le relais\n*       sur la coupure du faisceau\n*       Reli\u00e9 sur la GPIO 13\n*     - Ajout d'un interrupteur pour d\u00e9clencher le relais\n*       Reli\u00e9 sur la GPIO 25\n*     - La DEL bleue suit l'\u00e9tat du d\u00e9tecteur laser\n*    2018-11-01\n*     - Ajout du serveur WEB\n*     - D\u00e9placer l'interrupteur pour d\u00e9clencher le relais\n*       sur le GPIO 26\n*     - Remplacement de la DEL bleue par une DEL RGB\n*     - La broche \u00abrouge\u00bb de la DEL RGB se relie sur GPIO 25\n*     - La broche \u00abverte\u00bb de la DEL RGB se relie sur GPIO 33\n*     2019-01-13\n*     - Quelques corrections pour donner suite aux avertissements du compilateur\n*     \n*\/\n\n\/\/ ----------------------------------------------------------------------------- \n\/\/             Importation des fichiers et d\u00e9finition des variables\n\/\/ ----------------------------------------------------------------------------- \n\n\/\/******* Affichage DEL ********\n\/\/ Afin d'ajuster au besoin l'intensit\u00e9 et la couleur de la DEL, le programme\n\/\/ fait appel une fonction (ledcWrite) qui module la sortie PWM des broches\n\/\/ selon la valeur fournie \u00e0 la fonction\n#define LEDC_CHANNEL_0_VERT     0\n#define LEDC_CHANNEL_1_ROUGE    1\n\n\/\/ use 13 bit precission for LEDC timer\n#define LEDC_TIMER_13_BIT  13\n\n\/\/ use 5000 Hz as a LEDC base frequency\n#define LEDC_BASE_FREQ     5000\n\n#define DELROUGE  25 \/\/ DEL rouge reli\u00e9e au GPIO25\n#define DELVERTE  33 \/\/ DEL verte reli\u00e9e au GPIO33\n\nbyte byBrightnessVert;\nbyte byBrightnessRouge;\n\n\/\/******* Convertisseurs Analogique\/Num\u00e9rique ******\n#include &lt;driver\/adc.h>   \n\/\/ADC1_CHANNEL_7 D35 35\n\n\/\/*******   EEPROM   *****************\n\/\/ Inclure la librairie de lecture et d'\u00e9criture de la m\u00e9moire flash\n#include \"EEPROM.h\"\n\n\/\/ d\u00e9finie le nombre de Bytes que l'on veut acc\u00e9der\n#define EEPROM_SIZE 64\n\n\/\/******  WIFI *********************\n#include \"connect_id_Wifi.h\"\n#include &lt;WiFi.h>\nWiFiServer server(80);\n\nconst char* chStatusWifi[] ={\"WL_IDLE_STATUS\", \"WL_NO_SSID_AVAIL\", \"-\", \n                       \"WL_CONNECTED \", \"WL_CONNECT_FAILED \", \"-\",\n                       \"WL_DISCONNECTED\"};\n\nString stWifiConnectionNetwork = \"Connect\u00e9\";\n\n\/\/ ***** Mesure de voltage ************  \nfloat flCalibrationDiviseurTsn = 8.02\/7.97; \/\/ Valeur r\u00e9elle diviser par\n                                            \/\/ flVoltMesure lorsque \n                                            \/\/ flCalibrationDiviseurTsn\n                                            \/\/ \u00e9gal \u00e0 1\n\nint inSeuilDeVoltage = 7;              \/\/ Niveau d'alerte de basse tension \n                                       \/\/ de l'alimentation d'entr\u00e9e\n\nfloat flReading;\nfloat flVoltAlimCtrlReduit;\nfloat flVoltMesure;\n\n\n\/\/*****  Interrupteurs, d\u00e9tecteurs et sorties ******** \n#define PIN_ACTIVE_RELAIS      32      \/\/ Sortie pour d\u00e9clencher le relais\n#define PIN_DETECTEUR_LASER_1  13      \/\/ D\u00e9tecte une MALT \u00e0 l'entr\u00e9e D13\n\n#define PIN_BOUTON_DECLENCHEUR 26      \/\/ D\u00e9tecte une MALT \u00e0 l'entr\u00e9e D26\n\nboolean blEtatLaser1;\nboolean blTamponEtatLaser1;\nboolean blEtatBtnDeclencheur; \nboolean blTamponEtatBouton    = 1;\nboolean blDeclencheRelais     = 0;\nboolean blUnitDlReactMicroScd = 0;     \/\/ Unit\u00e9 du d\u00e9lai de r\u00e9action \n                                       \/\/ 1 => microseconde\n                                       \/\/ 0 => milliseconde\n\n\/\/ La variable suivante est de type \u00abuint64_t\u00bb car le temps, \n\/\/ mesur\u00e9 en millisecondes, deviendra rapidement un nombre grand\nuint64_t u64HorodatageBtnDeclencheur = 0;  \/\/ La derni\u00e8re fois que la broche\n                                           \/\/ de sortie a \u00e9t\u00e9 bascul\u00e9e\n                                         \nuint32_t u32DelaiReActInterup = 3000;  \/\/ D\u00e9lai de r\u00e9activation\n                                       \/\/ Pas plus d'un changement d'\u00e9tat \n                                       \/\/ au 3 secondes pour \u00e9liminer\n                                       \/\/ les intermittences    \n                                   \n\nuint64_t u64HorodatageRayonCoupe = 0;  \/\/ La derni\u00e8re fois que le rayon\n                                       \/\/ laser a \u00e9t\u00e9 coup\u00e9\nuint32_t u32DelaiReActRayon = 3000;    \/\/ Pas plus d'un changement d'\u00e9tat \n                                       \/\/ au 3 secondes pour \u00e9liminer\n                                       \/\/ les intermittences    \n\n\/\/ Les prochaines variables sont de type \u00abunsigned int\u00bb\n\/\/ Ceci \u00e9vite des valeurs n\u00e9gatives lors de la premi\u00e8re lecture du EEPROM\n\/\/ au SETUP avant qu'il y est eu une premi\u00e8re \u00e9criture\n\/\/ Sinon, il pourrait y avoir blocage du programme\n\/\/ Ces donn\u00e9es sont al\u00e9atoires avant la premi\u00e8re \u00e9criture                                \nuint32_t u32DelaiDeReaction  = 0;      \/\/ Dur\u00e9e d'attente avant d'activer le relais\nuint32_t u32TempsRelaisActif = 2000;   \/\/ Dur\u00e9e d'activation du relais en milliseconde\nuint32_t u32DelaiAvantRetour = 1000;   \/\/ D\u00e9lai en milliseconde avant de redonner\n                                       \/\/ la main \u00e0 la suite du programme apr\u00e8s\n                                       \/\/ l'activation du relais\n\n\n\/\/******** Divers ***************\nint inChronoDebutIndicModReseau = 0;   \/\/ Chrono Indique le mode r\u00e9seau\nint inChronoDebutIndicBattFbl   = 0;   \/\/ Chrono Indique batterie faible\n\n \n\/\/ ------------------------------------------------------------------------------- \n\/\/ FONCTION  FONCTION   FONCTION    FONCTION    FONCTION    FONCTION    FONCTION\n\/\/ ------------------------------------------------------------------------------- \n\n\/\/*****  Activation du DEL   *****************\nvoid ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {\n  \/\/ calculate duty, 8191 from 2 ^ 13 - 1\n  if (value > valueMax){value = valueMax;}\n  uint32_t duty = (8191 \/ valueMax) * value;\n  \n  \/\/ write duty to LEDC\n  ledcWrite(channel, duty);\n}\n\n\/\/******  Enregistrement dans la m\u00e9moire flash *******\nvoid memFlashDataUser(){\n  EEPROM.writeInt(0,  u32DelaiDeReaction);\n  EEPROM.writeInt(4,  u32TempsRelaisActif);\n  EEPROM.writeInt(8,  u32DelaiAvantRetour);\n  EEPROM.writeInt(12, blUnitDlReactMicroScd);\n  EEPROM.commit();\n}\n\n\/\/***  Attente selon le d\u00e9lai de r\u00e9action ****\nvoid delaiDeReaction(){\n  if (blUnitDlReactMicroScd){\n    delayMicroseconds(u32DelaiDeReaction);   \/\/ d\u00e9lai avant d'activer\n                                             \/\/ le relais (en microseconde)\n  }\n  else {\n    delay(u32DelaiDeReaction);               \/\/ d\u00e9lai avant d'activer\n                                             \/\/ le relais (en milliseconde)\n  } \n}\n\n\/\/******   Activation du relais **************\nvoid declencheRelais(){\n  digitalWrite(PIN_ACTIVE_RELAIS, HIGH);     \/\/ D\u00e9clenche le relais\n  delay(u32TempsRelaisActif);                \/\/ Attente en milliseconde \n  digitalWrite(PIN_ACTIVE_RELAIS, LOW);      \/\/ Rel\u00e2che le relais\n  delay(u32DelaiAvantRetour);                \/\/ Attente en milliseconde                    \n}\n\n\/\/*****  Choix d'affichage de la couleur du DEL *******\nvoid AfficheVertCWRougePA(){\n   if (stWifiConnectionNetwork==\"Non connect\u00e9 au r\u00e9seau\") {\n      byBrightnessVert  = 0 ;\n      byBrightnessRouge = 255 ;\n      \/\/ set the brightness on LEDC channel 0\n      ledcAnalogWrite(LEDC_CHANNEL_0_VERT, byBrightnessVert);\n      \/\/ set the brightness on LEDC channel 1\n      ledcAnalogWrite(LEDC_CHANNEL_1_ROUGE,byBrightnessRouge);\n  }\n  else\n  {\n      byBrightnessVert  = 255;\n      byBrightnessRouge = 0 ;\n      ledcAnalogWrite(LEDC_CHANNEL_0_VERT, byBrightnessVert);\n      ledcAnalogWrite(LEDC_CHANNEL_1_ROUGE,byBrightnessRouge);\n  }\n}\n\n\n \/\/ *******  html Serveur Web ******** \n #include \"do_Web.h\"\n \n\/\/ -------------------------------------------------------------------------------\n\/\/ SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP\n\/\/ ------------------------------------------------------------------------------- \nvoid setup() {\n  Serial.begin(115200);\n  Serial.println();\n\n\n  \/\/**********  EEPROM *************\n  if (!EEPROM.begin(EEPROM_SIZE))\n  {\n    Serial.println(\"failed to initialise EEPROM\"); delay(1000000);\n  }\n  \n  Serial.println();\n \n  \/\/ Lecture des valeurs sauvegard\u00e9es dans le EEPROM \n  u32DelaiDeReaction     = EEPROM.readInt(0);\n  u32TempsRelaisActif    = EEPROM.readInt(4); \n  u32DelaiAvantRetour    = EEPROM.readInt(8);\n  blUnitDlReactMicroScd  = EEPROM.readInt(12);  \n\n  if (u32DelaiDeReaction == 4294967295){ \/\/ valeur par d\u00e9faut du ESP\n      u32DelaiDeReaction  = 0;           \/\/ Changer sinon le programme est fig\u00e9  \n      u32TempsRelaisActif = 1000;        \/\/ pour longtemps \n      u32DelaiAvantRetour = 0;\n      \n      memFlashDataUser();\n      \n      u32DelaiDeReaction     = EEPROM.readInt(0);  \/\/ Validation \n      u32TempsRelaisActif    = EEPROM.readInt(4); \n      u32DelaiAvantRetour    = EEPROM.readInt(8);\n      blUnitDlReactMicroScd  = EEPROM.readInt(12);  \n  }\n  Serial.print(u32DelaiDeReaction);\n  Serial.println(\" delaiDeReaction \" );\n\n  Serial.print(u32TempsRelaisActif);\n  Serial.println(\" tempsRelaisActif \" );\n\n  Serial.print(u32DelaiAvantRetour);\n  Serial.println(\" delaiAvantRetour \" );\n\n  Serial.print(blUnitDlReactMicroScd);\n  Serial.println(\" Bool unit\u00e9 d\u00e9lai de r\u00e9action \" );\n\n  \/\/**********  ENTR\u00c9ES - SORTIES *************\n  pinMode(PIN_ACTIVE_RELAIS, OUTPUT );\n  digitalWrite(PIN_ACTIVE_RELAIS, LOW);\n\n  pinMode(PIN_DETECTEUR_LASER_1, INPUT);\n  pinMode(PIN_BOUTON_DECLENCHEUR, INPUT_PULLUP);   \/\/ active la r\u00e9sistance\n                                                   \/\/ de pull-up interne sur le +3V\n\n  \/\/**********  CONVERTISSEURS ANALOGIQUE\/NUM\u00c9RIQUE *************\n  \/\/     Configuration pour faire des mesures sur D35\n  \/\/     (voltage de la source d'alimentation) ******\n  adc1_config_width(ADC_WIDTH_BIT_12);         \/\/ D\u00e9finie la r\u00e9solution (0 \u00e0 4095)\n  adc1_config_channel_atten(ADC1_CHANNEL_7,    \/\/ Le voltage maximum au GPIO\n                            ADC_ATTEN_DB_11);  \/\/ est de 3.3V\n\n  \/\/ *********** WIFI ****************************\n  \/\/ Configuration d'une adresse IP statique\n  if (!WiFi.config(local_IP, gateway, subnet)) {\n    Serial.println(\"STA Failed to configure\");\n  }\n  \n  WiFi.begin(ssid, password);\n  delay(1000);\n  uint8_t retries = 15;\n \n  while (WiFi.status() != WL_CONNECTED) {\n      delay(500);\n      Serial.print(\"..\");\n      Serial.print(WiFi.status());\n      Serial.print(\"-\");\n      Serial.println(retries);\n      retries--;\n      if (retries == 0) {\n        int intStatus = WiFi.status();\n        if (intStatus==255){intStatus=2;}\n        Serial.print(\"..\");\n        Serial.print(WiFi.status());\n        Serial.print(\"-\");\n        Serial.println(retries);\n        Serial.print(\"WiFi status :\");\n        Serial.print(WiFi.status());\n        Serial.print(\"->\");\n        Serial.println(chStatusWifi[intStatus]); \n        stWifiConnectionNetwork = \"Non connect\u00e9 au r\u00e9seau\";\n        break;\n      }\n  }\n\n    Serial.println(stWifiConnectionNetwork);\n  if (stWifiConnectionNetwork==\"Non connect\u00e9 au r\u00e9seau\") {\n     Serial.println(\"- * Activation du point d'acc\u00e8s Wifi * - \");\n     WiFi.softAP(ssid_AP, password_AP);\n     IPAddress myIP = WiFi.softAPIP();\n     Serial.print(\"AP IP address: \");\n     Serial.println(myIP);\n  }\n  else{\n  Serial.print(\"WiFi status :\");\n  Serial.println(WiFi.status());\n  Serial.println(\"\");\n  Serial.println(\"WiFi connected.\");\n  Serial.println(\"IP address: \");\n  Serial.println(WiFi.localIP());\n  }\n    \n   server.begin();\n   \n  \/\/**********  DEL *************\n  \/\/ Setup timer and attach timer to a led pin\n  ledcSetup(LEDC_CHANNEL_0_VERT, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);\n  ledcAttachPin(DELVERTE, LEDC_CHANNEL_0_VERT);\n  ledcSetup(LEDC_CHANNEL_1_ROUGE, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);\n  ledcAttachPin(DELROUGE, LEDC_CHANNEL_1_ROUGE);\n\n  AfficheVertCWRougePA();\n  \n  \/\/***** Divers ******\n  inChronoDebutIndicModReseau = millis();\n  Serial.println(\"PR\u00caT\");\n}\n\n\/\/ ------------------------------------------------------------------------------- \n\/\/ LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP     LOOP \n\/\/ ------------------------------------------------------------------------------- \nvoid loop() {  \n  \/\/******* Lecture des entr\u00e9es num\u00e9riques  ******  \n  blEtatLaser1 = digitalRead(PIN_DETECTEUR_LASER_1);\n if (blEtatLaser1 != blTamponEtatLaser1){\n    if ((millis() - u64HorodatageRayonCoupe) > u32DelaiReActRayon) {\n        blTamponEtatLaser1 = blEtatLaser1;         \/\/ M\u00e9morise le nouvel \u00e9tat\n        u64HorodatageRayonCoupe = millis();\n    }\n  }\n\n  blEtatBtnDeclencheur = digitalRead(PIN_BOUTON_DECLENCHEUR);\n  if (blEtatBtnDeclencheur != blTamponEtatBouton){\n     if ((millis() - u64HorodatageBtnDeclencheur) > u32DelaiReActInterup) {\n        blTamponEtatBouton = blEtatBtnDeclencheur; \/\/ M\u00e9morise le nouvel \u00e9tat\n        u64HorodatageBtnDeclencheur = millis();\n      }\n  }\n\n  \/\/***********  ACTIONS *****************\n  if (!blTamponEtatLaser1){;   \/\/ si l'\u00e9tat du d\u00e9tecteur est 0 (faisceau coup\u00e9)\n    delaiDeReaction();\n    declencheRelais();\n    blTamponEtatLaser1 = 1;\n  }\n  \n  if (!blTamponEtatBouton){;   \/\/ si l'\u00e9tat du bouton est 0\n    delaiDeReaction();\n    declencheRelais();\n    blTamponEtatBouton = 1;\n  }\n\n  if (blDeclencheRelais){;     \/\/ si la commande web D re\u00e7ue\n    blDeclencheRelais = 0;\n    delaiDeReaction();\n    declencheRelais();\n  }\n\n  \/\/ ******* ********   Lecture du voltage d'alimentation   **********************\n  \/\/    \n  \/\/ M\u00e9thode de G6EJD  (applicable si l'att\u00e9nuation est 11dB\n  \/\/ et la r\u00e9solution est 12 bits)\n  flReading = analogRead(35);\n  flVoltAlimCtrlReduit = -0.000000000000016*pow(flReading,4)\n                               +0.000000000118171*pow(flReading,3)\n                               -0.000000301211691*pow(flReading,2)\n                               +0.001109019271794*flReading+0.034143524634089;\n  flVoltMesure = flVoltAlimCtrlReduit*122\/22;     \/\/ Diviseur de tension\n                                                        \/\/ 100K, 22K\n  flVoltMesure = flVoltMesure*flCalibrationDiviseurTsn; \/\/ correction attribuable aux \n                                                        \/\/ valeurs impr\u00e9cises du diviseur \n                                                        \/\/ de tension et au changement\n                                                        \/\/ de ESP32\n  \n  \/\/ Serial.print(flReading); Serial.print(\" DigitalValueVoltAlimCtrl \");\n  \/\/ Serial.print(flVoltAlimCtrlReduit); Serial.print(\" flVoltAlimCtrlReduit  \");\n  \/\/ Serial.print(flVoltMesure); Serial.println(\" flVoltMesure\"); \n  \/\/ Serial.println(\" \"); \n  \n  Serial.print(blEtatLaser1); Serial.print(\" \u00c9tat d\u00e9tecteur Laser,\");\n  Serial.print(blEtatBtnDeclencheur); Serial.print(\" \u00c9tat Interrupteur,\");\n  Serial.print(flVoltMesure); Serial.println(\" Voltage d'alimentation,\");\n\n  \/\/ *****************   Traitement de l'affichage du DEL  ************************\n  \/\/     \n  if (flVoltMesure > inSeuilDeVoltage ){          \/\/ Voltage d'alimentation > 7 volts \n     AfficheVertCWRougePA();\n  }else{                                          \/\/ Voltage d'alimentation &lt; 7 volts \n    if ((millis() - inChronoDebutIndicModReseau) > 1000){\n       if (inChronoDebutIndicBattFbl == 0) {\n          inChronoDebutIndicBattFbl= millis();    \/\/ D\u00e9marre le chrono Indique\n                                                  \/\/ batterie faible\n       }   \n       if ((millis() - inChronoDebutIndicBattFbl) &lt; 1000){ \/\/ DEL ORANGE pendant\n                                                           \/\/ 1 seconde\n          ledcAnalogWrite(LEDC_CHANNEL_0_VERT,   32);\n          ledcAnalogWrite(LEDC_CHANNEL_1_ROUGE, 128);\n       } \n       else{\n          AfficheVertCWRougePA();                 \/\/ Vert Client Wifi\n                                                  \/\/ Rouge Point d'acc\u00e8s\n          inChronoDebutIndicModReseau = millis(); \/\/ D\u00e9marre le chrono\n                                                  \/\/ Indication le mode r\u00e9seau\n          inChronoDebutIndicBattFbl = 0;          \/\/ Remet \u00e0 z\u00e9ro le chrono\n                                                  \/\/ Indication batterie faible\n      }\n    }\n  }\n\n  do_Web();\n  \n} \/\/ # Fin du<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><br>do_Web.h<\/h4>\n\n\n\n<p>Fichier qui contient la fen\u00eatre Web<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ ------------------------------------------------------------------------------- \n\/\/   serveur WEB    serveur WEB     serveur WEB      serveur WEB      serveur WEB \n\/\/ ------------------------------------------------------------------------------- \n\nvoid do_Web(){\n   WiFiClient client = server.available(); \/\/ \u00c9couter les clients entrants\n\n  if (client) {                           \/\/ si vous avez un client,\n    Serial.println(\"Nouveau Client!\");    \/\/ imprimer un message sur le port s\u00e9rie\n    int inChronoDebutConnexion= millis();   \n    String currentLine = \"\";              \/\/ Variable de type String pour contenir\n                                          \/\/ les donn\u00e9es entrantes du client\n    while (client.connected()) {          \/\/ boucle alors que le client est connect\u00e9\n\n      if ((millis() - inChronoDebutConnexion) > 1000){ \/\/ D\u00e9connecte les fureteurs qui restent\n          client.stop();                               \/\/ connecter sans avoir d'\u00e9change \u00e0\n          inChronoDebutConnexion= millis();            \/\/ faire comme Chrome                           \n       }   \n       \n      if (client.available()) {           \/\/ s'il y a des octets \u00e0 lire du client,\n         char c = client.read();          \/\/ lire un octet, puis\n         \/\/Serial.write(c);               \/\/ Imprimez sur le moniteur s\u00e9rie\n         if (c == '\\n') {                 \/\/ si l'octet est un caract\u00e8re\n                                          \/\/ de nouvelle ligne\n\n           \/\/ si la ligne en cours est vide, vous avez\n           \/\/ deux caract\u00e8res de nouvelle ligne cons\u00e9cutifs.\n           \/\/ c'est la fin de la requ\u00eate HTTP du client,\n           \/\/ alors envoyez une r\u00e9ponse:\n           if (currentLine.length() == 0) {\n             client.println(\"HTTP\/1.1 200 OK\");\n             client.println(\"Content-Type: text\/html\\n\");\n             \n             \/\/ D\u00e9but du HTML\n             client.println(\"&lt;!DOCTYPE html>&lt;html>\");\n             client.println(\"&lt;head>\");\n             client.println(\"&lt;title>D\u00c9CLENCHEUR Web Server&lt;\/title>\");\n             client.println(\"&lt;meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\">\");\n             client.println(\"&lt;link rel=\\\"icon\\\" href=\\\"data:,\\\">\");\n             \/\/ CSS to style the on\/off buttons \n             client.println(\"&lt;style>html { font-family: Helvetica;}\");\n             client.println(\".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;\");\n             client.println(\"text-decoration: none; font-size: 40px; margin: 2px; cursor: pointer;}\");\n             client.println(\"&lt;\/style>\");\n             client.println(\"&lt;\/head>\");\n\n             client.println(\"&lt;table align=\\\"center\\\"  style=\\\"background-color:#5EA084\\\">&lt;tr>&lt;td>\");\n             \n             client.println(\"&lt;table>\");\n             client.println(\"&lt;tr>&lt;th colspan=\\\"2\\\">&lt;h1>D\u00c9CLENCHEUR&lt;\/h1>&lt;\/th>&lt;\/tr>\");\n             \n             client.println(\"&lt;tr>&lt;td>\");\n             client.println(flVoltMesure);\n             client.println(\"&lt;\/td>&lt;td>\");\n             client.println(\"V - Voltage de la source d'alimentation\");\n             client.println(\"&lt;\/td>&lt;\/tr>\");\n             \n             client.println(\"&lt;tr>&lt;td>\");\n             client.println(u32DelaiDeReaction);\n             client.println(\"&lt;\/td>&lt;td>\");\n             if (blUnitDlReactMicroScd){\n                client.println(\"us \");\n             }\n             else {\n                client.println(\"ms \");\n             }\n             client.println(\"D\u00e9lai de r\u00e9action\");\n             client.println(\"&lt;\/td>&lt;\/tr>\");\n             \n             client.println(\"&lt;tr>&lt;td>\");\n             client.println(u32TempsRelaisActif);\n             client.println(\"&lt;\/td>&lt;td>\");\n             client.println(\"ms Dur\u00e9e d'activation du relais&lt;br>\");\n             client.println(\"&lt;\/td>&lt;\/tr>\");\n             \n             client.println(\"&lt;tr>&lt;td>\");\n             client.println(u32DelaiAvantRetour);\n             client.println(\"&lt;\/td>&lt;td>\");\n             client.println(\"ms D\u00e9lai avant le retour aux d\u00e9tecteurs\");\n             client.println(\"&lt;\/td>&lt;\/tr>\");\n             \n             client.println(\"&lt;tr>&lt;th colspan=\\\"2\\\">&lt;br>&lt;a href=\\\"\/D\\\">&lt;button class=\\\"button\\\">RELAIS&lt;\/button>&lt;\/a>&lt;br>&lt;br>&lt;\/th>&lt;\/tr>\");\n             client.println(\"&lt;\/table>\");\n             \n             client.println(\"&lt;form action=\\\"\/action_page.php\\\">\");\n             client.println(\"&lt;table>&lt;tr>&lt;td>D\u00e9lai de r\u00e9action:&lt;\/td>&lt;td>&lt;input type=\\\"text\\\" name=\\\"dlyReact\\\">&lt;\/td>&lt;\/tr>\");\n             client.println(\"&lt;tr>&lt;td>Temps actif:&lt;\/td>&lt;td>&lt;input type=\\\"text\\\" name=\\\"TmpsActif\\\">&lt;\/td>&lt;\/tr>\");\n             client.println(\"&lt;tr>&lt;td>D\u00e9lai de retour:&lt;\/td>&lt;td>&lt;input type=\\\"text\\\" name=\\\"dlyRtour\\\">&lt;\/td>&lt;\/tr>\");\n\n             if (blUnitDlReactMicroScd){\n                client.println(\"&lt;tr>&lt;td colspan=\\\"2\\\">&lt;input type=\\\"radio\\\" name=\\\"unitDelaiReactMS\\\" value=\\\"1\\\" checked>D\u00e9lais de r\u00e9action en microseconde&lt;\/td>&lt;\/tr>\");\n                client.println(\"&lt;tr>&lt;td colspan=\\\"2\\\">&lt;input type=\\\"radio\\\" name=\\\"unitDelaiReactMS\\\" value=\\\"0\\\" >D\u00e9lais de r\u00e9action en milliseconde&lt;\/td>&lt;\/tr>\");\n             }\n             else {\n                client.println(\"&lt;tr>&lt;td colspan=\\\"2\\\">&lt;input type=\\\"radio\\\" name=\\\"unitDelaiReactMS\\\" value=\\\"1\\\" >D\u00e9lais de r\u00e9action en microseconde&lt;\/td>&lt;\/tr>\");\n                client.println(\"&lt;tr>&lt;td colspan=\\\"2\\\">&lt;input type=\\\"radio\\\" name=\\\"unitDelaiReactMS\\\" value=\\\"0\\\" checked>D\u00e9lais de r\u00e9action en milliseconde&lt;\/td>&lt;\/tr>\");\n             }\n                          \n             client.println(\"&lt;tr>&lt;th colspan=\\\"2\\\">&lt;br>&lt;input type=\\\"submit\\\" value=\\\"Soumettre\\\">&lt;br>&lt;br>&lt;\/th>&lt;\/tr>\");\n             client.println(\"&lt;\/table>\");\n             client.println(\"&lt;\/form>\");\n             \n             client.println(\"&lt;table>\");\n             client.println(\"&lt;tr>&lt;td>&lt;br>\u00a0\u00a0&lt;a href=\\\"\/P\\\">+ Augmenter le d\u00e9lai de r\u00e9action&lt;\/a>&lt;\/td>&lt;\/tr>\");\n             client.println(\"&lt;tr>&lt;td>&lt;br>&lt;br>\u00a0\u00a0&lt;a href=\\\"\/M\\\">- Diminuer le d\u00e9lai de r\u00e9action&lt;\/a>&lt;\/td>&lt;\/tr>\");\n             client.println(\"&lt;\/table>\");\n\n             client.println(\"&lt;br>&lt;br>&lt;\/td>&lt;\/tr>&lt;\/table>\");\n             client.println(\"&lt;\/body>\\n&lt;\/html>\");\n             \/\/ break out of the while loop:\n             break;\n           } \n           else \n           {    \/\/ si vous avez une nouvelle ligne, effacez currentLine:\n            int posDlyReact = currentLine.indexOf(\"dlyReact=\");\n            int posTmpsActif = currentLine.indexOf(\"TmpsActif=\");\n            int posDlyRtour = currentLine.indexOf(\"dlyRtour=\");\n            int posUnitDelaiReactMS = currentLine.indexOf(\"unitDelaiReactMS=\");\n            int posHTTP = currentLine.indexOf(\"HTTP\");\n            if (currentLine.startsWith(\"GET \/action_page.php?\")){\n              if (posDlyReact >0) { \n                Serial.println(\"\");\n                Serial.println(\"***\" );\n                Serial.print(posDlyReact);\n                Serial.println(\" position du dlyReact\" );\n                Serial.print(posTmpsActif);\n                Serial.println(\" position du TmpsActif\" );\n                Serial.print(posDlyRtour);\n                Serial.println(\" position du dlyRtour\" );\n                Serial.print(posUnitDelaiReactMS);\n                Serial.println(\" position du unitDelaiReactMS\" );\n                Serial.println(currentLine);\n\n                String strDlyReact = currentLine.substring(posDlyReact+9,posTmpsActif-1);\n                Serial.println(strDlyReact);\n                String strTmpsActif = currentLine.substring(posTmpsActif+10,posDlyRtour-1);\n                Serial.println(strTmpsActif);\n                String strDlyRtour = currentLine.substring(posDlyRtour+9,posUnitDelaiReactMS-1);\n                Serial.println(strDlyRtour);\n                String strUnitDelaiReactMS = currentLine.substring(posUnitDelaiReactMS+17,posHTTP-1);\n                Serial.println(strUnitDelaiReactMS);\n\n                if (strDlyReact != \"\"){\n                  u32DelaiDeReaction =  strDlyReact.toInt();\n                  memFlashDataUser(); \n                }\n                if (strTmpsActif != \"\"){\n                  u32TempsRelaisActif =  strTmpsActif.toInt();\n                  memFlashDataUser(); \n                }\n                if (strDlyRtour != \"\"){\n                  u32DelaiAvantRetour =  strDlyRtour.toInt();\n                  memFlashDataUser(); \n                }\n                if (strUnitDelaiReactMS != \"\"){\n                  blUnitDlReactMicroScd = strUnitDelaiReactMS.toInt();\n                  memFlashDataUser(); \n                }\n            }\n           } \n            currentLine = \"\";\n           }\n         } \n         else if (c != '\\r') \n         {  \/\/ si vous avez autre chose qu'un caract\u00e8re de retour de chariot,\n          currentLine += c;      \/\/ l'ajouter \u00e0 la fin de la currentLine\n         }\n         \n         \/\/ V\u00e9rifiez si la demande du client\n         if (currentLine.endsWith(\"GET \/P\")) {\n            u32DelaiDeReaction ++; \/\/ Augmente la dur\u00e9e d'activation du relais\n            memFlashDataUser(); \n            currentLine = \"\";   \n         }\n         if (currentLine.endsWith(\"GET \/M\")) {\n            u32DelaiDeReaction --; \/\/ Diminue la dur\u00e9e d'activation du relais\n            if (u32DelaiDeReaction == 4294967295){ u32DelaiDeReaction =0;}\n            memFlashDataUser(); \n            currentLine = \"\";    \n         }    \n         if (currentLine.endsWith(\"GET \/D\")) {\n           Serial.println(currentLine);\n           blDeclencheRelais = 1; \/\/ \n           currentLine = \"\";    \n         }\n        } \/\/ # if (client.available())\n     } \/\/ # fin du while (client.connected())\n      \n  } \/\/ # fin du if (client) \n  \/\/ close the connection:\n  client.stop();\n  \/\/Serial.println(\"Client Disconnected.\");\n  delay(0);\n  }\n <\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><a href=\"https:\/\/espacerm.com\/webgen\/controleur-multifonctionnel-elabore-autour-du-esp32-devkit-v1-doit-3-2\/\">&lt;- <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/controleur-multifonctionnel-elabore-autour-du-esp32-devkit-v1-doit-3-2\/\">Contr\u00f4leur multifonctionnel \u00e9labor\u00e9 autour du ESP32 DEVKIT V1 DOIT (4 de 4)<\/a><\/strong><\/td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/td><td><strong><a href=\"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais\/\">L\u2019interface BLUETOOTH du d\u00e9clencheur de relais ( 1 de 2 )&nbsp;-&gt;<\/a><\/strong><\/td><\/tr><\/tbody><\/table>\n","protected":false},"excerpt":{"rendered":"<p>Interface utilisateur pour afficher des donn\u00e9es, modifier des param\u00e8tres et passer des commandes. Aucune installation sp\u00e9cifique de programme sur l&rsquo;unit\u00e9 du client. Interface multilogiciel, fonctionne avec les fureteurs des diff\u00e9rentes plateformes. Mode WIFI Au d\u00e9marrage le mode r\u00e9seau WiFi est activ\u00e9 automatiquement. En un premier temps, le programme essaie de monter une connexion WiFi sur [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/1612"}],"collection":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/comments?post=1612"}],"version-history":[{"count":79,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/1612\/revisions"}],"predecessor-version":[{"id":3410,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/1612\/revisions\/3410"}],"wp:attachment":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/media?parent=1612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}