{"id":2868,"date":"2019-01-13T02:42:13","date_gmt":"2019-01-13T07:42:13","guid":{"rendered":"https:\/\/espacerm.com\/webgen\/?page_id=2868"},"modified":"2019-03-16T15:45:41","modified_gmt":"2019-03-16T20:45:41","slug":"declencheur-de-relais-interface-web-et-bluetooth-actives-simultanement","status":"publish","type":"page","link":"https:\/\/espacerm.com\/webgen\/declencheur-de-relais-interface-web-et-bluetooth-actives-simultanement\/","title":{"rendered":"D\u00e9clencheur de relais &#8211; Interfaces Web et Bluetooth  actives simultan\u00e9ment"},"content":{"rendered":"\n<p>Int\u00e9gration des deux interfaces dans le m\u00eame programme. <\/p>\n\n\n\n<p>Application : D\u00e9clencheur d&rsquo;appareil photo et de flashs<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/02\/declencheur-complet_00.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"432\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/02\/declencheur-complet_00.png\" alt=\"\" class=\"wp-image-3108\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/02\/declencheur-complet_00.png 647w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/02\/declencheur-complet_00-300x200.png 300w\" sizes=\"(max-width: 647px) 100vw, 647px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"684\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/DSC_2936-1024x684.jpg\" alt=\"\" class=\"wp-image-3018\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/DSC_2936-1024x684.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/DSC_2936-300x200.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/DSC_2936-768x513.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/DSC_2936.jpg 1618w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Le relais peut \u00eatre d\u00e9clench\u00e9 par la pression d&rsquo;un interrupteur, par la coupure d&rsquo;un faisceau laser, par un bruit fort ou une commande de l&rsquo;interface Web ou Bluetooth.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/declencheur-de-relais-src-81cmd_04-v1-1_d.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"831\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/declencheur-de-relais-src-81cmd_04-v1-1_d-1024x831.jpg\" alt=\"\" class=\"wp-image-2878\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/declencheur-de-relais-src-81cmd_04-v1-1_d-1024x831.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/declencheur-de-relais-src-81cmd_04-v1-1_d-300x243.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/01\/declencheur-de-relais-src-81cmd_04-v1-1_d-768x623.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Le programme est volumineux, il faut appliquer le <a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\">partitionnement <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\">no_ota<\/a><\/strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\">, <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\">huge_app<\/a><\/strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\"> ou <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\">min_spiffs<\/a><\/strong><a href=\"https:\/\/espacerm.com\/webgen\/esp32-augmentation-de-lespace-memoire-pour-le-code-programme\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"partitionnement no_ota, huge_app ou min_spiffs  (ouverture dans un nouvel onglet)\"> <\/a>pour s&rsquo;assurer d&rsquo;avoir assez d&rsquo;espace m\u00e9moire pour contenir tout le code.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">T\u00e9l\u00e9chargement<\/h2>\n\n\n\n<p>L\u2019application est divis\u00e9e en quatre fichiers. Ils doivent \u00eatre plac\u00e9s dans le m\u00eame r\u00e9pertoire nomm\u00e9 \u00abDeclencheur_de_relais_01-01-00\u00bb<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/rcepmorel\/Declencheur-de-relais_Interfaces-Web-et-Bluetooth\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (ouverture dans un nouvel onglet)\">https:\/\/github.com\/rcepmorel\/Declencheur-de-relais_Interfaces-Web-et-Bluetooth<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9tails des fichiers<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">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-01-00<\/h4>\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 V1.1.0\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_08\n*     - Int\u00e9grer l'interface Bluetooth et Web ensemble\n*     - PIN_DETECTEUR_LASER_1  D17  D\u00e9tecteur de faisceau laser soud\u00e9 directement sur la carte\n*     - PIN_DETECTEUR_SONORE   D22  D\u00e9tecteur de son. Passe \u00e0 LOW si le son d\u00e9passe le seuil fix\u00e9 \n*     - PIN_BOUTON_DECLENCHEUR D26  Interrupteur\n*   \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\/\/******  Bluetooth *********************\n#include \"BluetoothSerial.h\"\n#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)\n#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it\n#endif\nBluetoothSerial SerialBT;\n\n#define MAX_PACKETSIZE 32   \/\/Tampon de r\u00e9ception en s\u00e9rie\nchar buffUART[MAX_PACKETSIZE];\nunsigned int buffUARTIndex = 0;\nunsigned long preUARTTick  = 0;\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\/\/*****  Interupteurs, d\u00e9tecteurs et sorties ******** \n#define PIN_ACTIVE_RELAIS      32       \/\/ Sortie pour d\u00e9clencher le relais\n#define PIN_DETECTEUR_LASER_1  17       \/\/ D\u00e9tecte une MALT \u00e0 l'entr\u00e9e D17\n                                        \/\/ D\u00e9tecteur fixe sur la plaquette\n#define PIN_DETECTEUR_SONORE   22       \/\/ D\u00e9tecte une MALT \u00e0 l'entr\u00e9e D22\n#define PIN_BOUTON_DECLENCHEUR 26       \/\/ D\u00e9tecte une MALT \u00e0 l'entr\u00e9e D26\n\nvolatile boolean blJetonOperRelais = 0; \/\/ L'\u00e9tat est conserv\u00e9 dans la m\u00e9moire\n                                        \/\/ de travail m\u00eame lors des interruptions \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  delay(100);\n}\n\n\/\/***  Attente selon le d\u00e9lai de r\u00e9action ****\nvoid delaiDeReaction(){\n  \/\/ Les \u00abSerial.print\u00bb sont l\u00e0 pour le d\u00e9veloppement\n  \/\/ En fonctionnement normal vaut mieux les mettre en \n  \/\/ commentaire. Ils influencent le temps d'ex\u00e9cution\n  \/\/ des routines et faussent les d\u00e9lais programm\u00e9s\n  \/\/ Serial.println(\"D\u00e9lai de r\u00e9action amorc\u00e9\");\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\n\/\/******   Activation du relais **************\nvoid declencheRelais(){\n  Serial.println(\"D\u00e9clenchement du relais amorc\u00e9\");\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  Serial.println(\"D\u00e9lai avant retour amorc\u00e9\");\n  delay(u32DelaiAvantRetour);                \/\/ Attente en milliseconde  \n  Serial.println(\"Processus d\u00e9clenchement du relais termin\u00e9\"); \n  Serial.println(\"\");                  \n}\n\n\nvoid oper_delai_plus_relais(){\n   delaiDeReaction();\n   declencheRelais();  \/\/ inclus le d\u00e9lai de retour \n}\n\n\nvoid demande_oper_relais(){\n  blJetonOperRelais = 1;\n}\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 \/\/ *******  Traite les \u00e9changes sur BLUETOOTH ******** \n #include \"echange_Bluetooth_et_traitement.h\"\n \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 \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_DETECTEUR_SONORE,   INPUT);\n  pinMode(PIN_BOUTON_DECLENCHEUR, INPUT_PULLUP);   \/\/ active la r\u00e9sistance\n                                                   \/\/ de pull-up interne sur le +3V\n                                                   \n  \/\/ Un petit d\u00e9lai pour laisser les choses se stabiliser\n  delay(30);\n  \n  attachInterrupt(digitalPinToInterrupt(PIN_DETECTEUR_LASER_1), demande_oper_relais, FALLING);\n  attachInterrupt(digitalPinToInterrupt(PIN_DETECTEUR_SONORE),  demande_oper_relais, FALLING);\n\n\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   \n  \/\/ *********** BLUETOOTH ****************************\n  \/\/ Ce Bluetooth n'est pas pris en charge pas IOS\n  if(!SerialBT.begin(\"ESP32_DeclencheurDeRelais\")){ \/\/Bluetooth device name , NIP non disponible\n    Serial.println(\"Erreur lors de l'initialisation du Bluetooth\");\n  }else{\n    Serial.println(\"Bluetooth initialis\u00e9\");\n  } \n\n  delay(50);\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\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   \/\/ 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  \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\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  if (blJetonOperRelais) {\n     oper_delai_plus_relais();\n     blJetonOperRelais = 0;\n  }\n\n  if (!blJetonOperRelais) {\n     \/\/******* Lecture des entr\u00e9es num\u00e9riques  ******  \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\n  if (!blJetonOperRelais) {\n     \/\/***********  ACTIONS *****************\n     if (!blTamponEtatBouton){;   \/\/ si l'\u00e9tat du bouton est 0\n       delaiDeReaction();\n       declencheRelais();  \/\/ inclus le d\u00e9lai de retour\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\n  if (!blJetonOperRelais) {\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\/* \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\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  }\n\nif (!blJetonOperRelais) {\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\n\n  if (!blJetonOperRelais) {\n     \/\/ ***************   Traite les \u00e9changes sur BLUETOOTH   *****************\n     do_Uart_Tick(); \n  }\n\n\n  if (!blJetonOperRelais) {\n     do_Web();\n  }\n\n\n  \n} \/\/ # Fin du Void Loop<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">do_Web<\/h4>\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<h4 class=\"wp-block-heading\"><strong>echange_Bluetooth_et_traitement.h<\/strong><\/h4>\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\/\/            \u00c9CHANGE ET TRAITEMENT BLUETOOTH\n\/\/ ------------------------------------------------------------------------------- \n\/\/\n\/\/***** Renvoi des donn\u00e9es du ESP32 vers le Client ****\n\/\/ ****Trame de r\u00e9ponse : [ |DATA|#|#|#|#|#| ]  # est un nombre.\nvoid envoieDataVersClient(){\n\n      Serial.print(flVoltMesure);\n      Serial.println(\" flVoltMesure \" );\n      Serial.print(u32DelaiDeReaction);\n      Serial.println(\" delaiDeReaction \" );\n      Serial.print(u32TempsRelaisActif);\n      Serial.println(\" tempsRelaisActif \" );\n      Serial.print(u32DelaiAvantRetour);\n      Serial.println(\" delaiAvantRetour \" );\n      Serial.print(blUnitDlReactMicroScd);\n      Serial.println(\" Bool unit\u00e9 d\u00e9lai de r\u00e9action \" );\n      Serial.println();\n      delay(0);\n      int inPauseDeTransmission = 100;  \/\/ > 50 Temporisation pour \u00e9viter les engorgements \n      SerialBT.print(\"[ |\");                 delay(inPauseDeTransmission);\n      SerialBT.print(\"DATA|\");               delay(inPauseDeTransmission);\n      SerialBT.print(flVoltMesure);          delay(inPauseDeTransmission);\n      SerialBT.print(\"|\");                   delay(inPauseDeTransmission);\n      SerialBT.print(u32DelaiDeReaction);    delay(inPauseDeTransmission);\n      SerialBT.print(\"|\");                   delay(inPauseDeTransmission);\n      SerialBT.print(u32TempsRelaisActif);   delay(inPauseDeTransmission);\n      SerialBT.print(\"|\");                   delay(inPauseDeTransmission);\n      SerialBT.print(u32DelaiAvantRetour);   delay(inPauseDeTransmission);\n      SerialBT.print(\"|\");                   delay(inPauseDeTransmission);\n      SerialBT.print(blUnitDlReactMicroScd); delay(inPauseDeTransmission);\n      SerialBT.print(\"| ]\");\n}\n\n\n\/\/*****  R\u00e9ception et traitement des \u00e9changes sur BLUETOOTH\nvoid do_Uart_Tick()\n{\n  char charUart_Data=0;\n   \n  if(SerialBT.available()) \n  {\n    size_t len = SerialBT.available();  \/\/ size_t  integer non sign\u00e9, \n                                        \/\/ len =  nombre de caract\u00e8res \u00e0 lire\n    uint8_t u8SerialBuffer[len + 1];    \/\/ uint8_t integer non sign\u00e9 8 bits,\n                                        \/\/ \u00e9quivaut \u00e0 byte\n    u8SerialBuffer[len] = 0x00;\n    SerialBT.readBytes(u8SerialBuffer, len);\n    memcpy(buffUART + buffUARTIndex, u8SerialBuffer, len);\/\/ s'assurer que le\n                                                          \/\/ port s\u00e9rie peut\n                                                          \/\/ lire l'int\u00e9gralit\u00e9\n                                                          \/\/ de la trame de donn\u00e9es\n    buffUARTIndex += len;\n    preUARTTick = millis();\n    if(buffUARTIndex >= MAX_PACKETSIZE - 1) \n    {\n      buffUARTIndex = MAX_PACKETSIZE - 2;\n      preUARTTick = preUARTTick - 200;\n    }\n  }\n  if(buffUARTIndex > 0 &amp;&amp; (millis() - preUARTTick >= 100))\n  { \/\/donn\u00e9es pr\u00eates\n    buffUART[buffUARTIndex] = 0x00;\n    if(buffUART[0]=='X')                    \/\/ R\u00e9serve\n    {\n    }\n\n    \/\/***********  Demande de d\u00e9clenchement du relais ****\n    else if (buffUART[0]=='C')   \/\/ CLIC,D           \n    {\n      Serial.print(\"Data brut du buffer de r\u00e9ception ->\");\n      Serial.println(buffUART);\n      sscanf(buffUART,\"CLIC,%s\",&amp;charUart_Data);\n      Serial.print(\"Data apr\u00e8s traitement ->\"); \n      Serial.print(charUart_Data);\n      Serial.println();\n    }\n    \/\/***********  D\u00e9marrage, connexion Bluetooth r\u00e9ussie, envoie des donn\u00e9es initiales ****\n    \/\/***********  Envoie des donn\u00e9es du ESP32 vers le Client ****\n    else if (buffUART[0]=='I')   \/\/ INIT,I           \n    {\n      Serial.print(\"Data brut du buffer de r\u00e9ception ->\");\n      Serial.println(buffUART);\n      sscanf(buffUART,\"INIT,%s\",&amp;charUart_Data);\n      Serial.print(\"Data apr\u00e8s traitement ->\"); \n      Serial.print(charUart_Data);\n      Serial.println();\n    }\n    else if (buffUART[0]=='M')   \/\/ Unit\u00e9 : d\u00e9lai de r\u00e9action = ms\n    {\n      charUart_Data='M';\n      blUnitDlReactMicroScd = 0;\n      Serial.print(blUnitDlReactMicroScd);\n      Serial.println(\" Milliseconde \");\n      \n    }\n    \/\/***** R\u00e9ception des donn\u00e9es venant de la TABLLETTE allant vers le ESP32  ****\n    \/\/      Nouveau DATA\n    else if (buffUART[0]=='N') \/\/ Venant de l'action du bouton d'envoie\n    {\n      charUart_Data='N';\n      Serial.print(\"Data brut du buffer de r\u00e9ception ->\");\n      Serial.println(buffUART);\n      sscanf(buffUART,\"NDATA,%i,%i,%i\",&amp;u32DelaiDeReaction,&amp;u32TempsRelaisActif,&amp;u32DelaiAvantRetour);\n      Serial.print(\"Data apr\u00e8s traitement ->\");  \n      Serial.print(u32DelaiDeReaction);\n      Serial.print(\"\/\");\n      Serial.print(u32TempsRelaisActif);\n      Serial.print(\"\/\");\n      Serial.println(u32DelaiAvantRetour);\n      Serial.println();\n    }\n    else if (buffUART[0]=='U')   \/\/ Unit\u00e9 : d\u00e9lai de r\u00e9action = us\n    {\n      charUart_Data='U';\n      blUnitDlReactMicroScd = 1;\n      Serial.print(blUnitDlReactMicroScd);\n      Serial.println(\" Microseconde \");\n    }\n    else  charUart_Data=buffUART[0];\n    buffUARTIndex = 0;\n  }\n\n\n\n  \/\/****** EX\u00c9CUTE LES DEMANDES ****\n  \/\/    \n  switch (charUart_Data)    \n    {    \n      \/\/ ***** D\u00c9CLENCHEMENT DU RELAIS ********\n      case 'D':\n      delaiDeReaction();\n      declencheRelais();  \/\/ inclus le d\u00e9lai de retour\n      break;\n      \n      \/\/ ***** Envoie des donn\u00e9es du ESP32 vers le Client ********\n      case 'I':\n      envoieDataVersClient();\n      break;\n      \n      case 'M':\n      \/\/ Enregistrement des donn\u00e9es dans le EEPROM\n      memFlashDataUser();   \n      \/\/***** Renvoi des donn\u00e9es du ESP32 vers le Client ****\n      envoieDataVersClient();\n      break;\n\n      case 'N':\n      \/\/ Enregistrement des donn\u00e9es dans le EEPROM\n      memFlashDataUser();  \n      \/\/***** Renvoi des donn\u00e9es du ESP32 vers le Client ****\n      envoieDataVersClient();\n      break;\n\n      case 'U':\n      \/\/ Enregistrement des donn\u00e9es dans le EEPROM\n      memFlashDataUser();  \n      \/\/***** Renvoi des donn\u00e9es du ESP32 vers le Client ****\n      envoieDataVersClient();\n      break;\n      \n      \n      default:break;\n    }\n}\n\n\n\n<\/pre>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td><a href=\"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais-2-de-2\/\">&lt;- <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais-2-de-2\/\">L\u2019interface BLUETOOTH du d\u00e9clencheur de relais ( 2 de 2 )<\/a><\/strong><\/td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &nbsp;&nbsp;<\/td><td><strong><a href=\"https:\/\/espacerm.com\/webgen\/declechement-dun-appareil-photo\/\">D\u00e9clenchement d\u2019appareil photo et de flashs -&gt;<\/a><\/strong><\/td><\/tr><\/tbody><\/table>\n","protected":false},"excerpt":{"rendered":"<p>Int\u00e9gration des deux interfaces dans le m\u00eame programme. Application : D\u00e9clencheur d&rsquo;appareil photo et de flashs Le relais peut \u00eatre d\u00e9clench\u00e9 par la pression d&rsquo;un interrupteur, par la coupure d&rsquo;un faisceau laser, par un bruit fort ou une commande de l&rsquo;interface Web ou Bluetooth. Le programme est volumineux, il faut appliquer le partitionnement no_ota, huge_app [&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\/2868"}],"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=2868"}],"version-history":[{"count":34,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/2868\/revisions"}],"predecessor-version":[{"id":3433,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/2868\/revisions\/3433"}],"wp:attachment":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/media?parent=2868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}