{"id":2330,"date":"2018-12-20T19:43:05","date_gmt":"2018-12-21T00:43:05","guid":{"rendered":"https:\/\/espacerm.com\/webgen\/?page_id=2330"},"modified":"2019-03-16T16:21:24","modified_gmt":"2019-03-16T21:21:24","slug":"linterface-bluetooth-du-declencheur-de-relais-2-de-2","status":"publish","type":"page","link":"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais-2-de-2\/","title":{"rendered":"L\u2019interface BLUETOOTH du d\u00e9clencheur de relais ( 2 de 2 )"},"content":{"rendered":"\n<p>Abordons maintenant la programmation du ESP32. <\/p>\n\n\n\n<p>C&rsquo;est pratiquement le m\u00eame programme que l&rsquo;<a rel=\"noreferrer noopener\" aria-label=\"interface Web (ouverture dans un nouvel onglet)\" href=\"https:\/\/espacerm.com\/webgen\/linterface-web\/\" target=\"_blank\">interface Web<\/a>, mais la partie Web est remplac\u00e9e par la partie BLUETOOTH.<\/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 2 conditions<\/p>\n\n\n\n<ul><li>Vert&nbsp; &nbsp; &nbsp; &nbsp;: Le circuit est fonctionnel<\/li><li>Orange : Le voltage de la source d\u2019alimentation est sous un certain seuil. La DEL clignote entre Orange et Vert<\/li><\/ul>\n\n\n\n<p>Afin d\u2019ajuster au besoin l\u2019intensit\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<p><\/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\">EEPROM<\/a>. L\u2019enregistrement s\u2019ex\u00e9cute lors du changement d\u2019une 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\u2019alimentation est surveill\u00e9. La donn\u00e9e est envoy\u00e9e \u00e0 l\u2019interface utilisateur lors d\u2019une 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\">Les interruptions<\/h2>\n\n\n\n<p>L&rsquo;\u00e9tat du laser et de l&rsquo;interrupteur sont surveill\u00e9s dans la partie \u00abLOOP\u00bb. Le programme ex\u00e9cute les instructions en s\u00e9rie, une apr\u00e8s l&rsquo;autre en bouclage. L&rsquo;\u00e9tat du laser ou de l&rsquo;interrupteur n&rsquo;est donc pas trait\u00e9 d\u00e8s qu&rsquo;il y a un changement, mais seulement quand le programme arrive aux instructions qui s&rsquo;y rapporte. Pour traiter le plus rapidement possible le changement d&rsquo;\u00e9tat, le mieux, c&rsquo;est d&rsquo;interrompre l&rsquo;ex\u00e9cution du programme en cours et de prendre en consid\u00e9ration imm\u00e9diatement le changement d&rsquo;\u00e9tat. C&rsquo;est le r\u00f4le des fonctions d&rsquo;interruptions.<\/p>\n\n\n\n<p>D\u00e8s qu\u2019une interruption est d\u00e9tect\u00e9e par le processeur, celui-ci sauve son \u00e9tat d\u2019ex\u00e9cution, ex\u00e9cute une portion de code li\u00e9e \u00e0 l\u2019interruption (Interrupt Service Routine ISR), et revient ensuite \u00e0 son \u00e9tat avant l\u2019interruption pour continuer ce qu\u2019il faisait.<\/p>\n\n\n\n<p>Attention, \u00e0 l\u2019int\u00e9rieur de la routine d\u2019interruption, certaines fonctions sont inutilisables (<strong>delay<\/strong> ne fonctionne pas, <strong>millis<\/strong> renverra toujours la m\u00eame valeur, les donn\u00e9es s\u00e9ries re\u00e7ues seront perdues et les signaux PWM sont affect\u00e9s).<\/p>\n\n\n\n<p>Toute valeur modifi\u00e9e \u00e0 l\u2019int\u00e9rieur de la routine d\u2019interruption devra passer par une variable d\u00e9clar\u00e9e comme <strong>volatile<\/strong>, afin que le processeur aille chercher la valeur en m\u00e9moire et ne se fie pas \u00e0 ce qui se trouve dans ses registres qui sont gel\u00e9s au moment de l\u2019interruption.<\/p>\n\n\n\n<p>Le programme de d\u00e9clencheur de relais est modifi\u00e9 pour traiter le plus rapidement possible la coupure du faisceau laser.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"> Fonction \u00abattachInterrupt\u00bb <\/h4>\n\n\n\n<p>Pour d\u00e9finir une interruption, on se sert de la fonction <strong><em>attachInterrupt ()<\/em><\/strong> , qui accepte comme arguments: la broche GPIO, le nom de la fonction \u00e0 ex\u00e9cuter (Interrupt Service Routine ISR) et le mode<\/p>\n\n\n\n<p><em>attachInterrupt(digitalPinToInterrupt(PIN_DETECTEUR_LASER_1), demande_oper_relais, FALLING);<\/em><\/p>\n\n\n\n<p>Si un changement de l&rsquo;\u00e9tat HAUT \u00e0 l&rsquo;\u00e9tat BAS (<em>FALLING<\/em>) se produit sur l&rsquo;entr\u00e9e GPIO 17 (<em>PIN_DETECTEUR_LASER_1)&nbsp;,&nbsp;<\/em>une&nbsp;interruption&nbsp;est&nbsp;g\u00e9n\u00e9r\u00e9e. La fonction  \u00ab<em>demande_oper_relais\u00bb<\/em> est ex\u00e9cut\u00e9e. \u00c9tat HAUT : Faisceau pr\u00e9sent sur le d\u00e9tecteur. \u00c9tat BAS : Faisceau absent sur le d\u00e9tecteur. <\/p>\n\n\n\n<p><em><strong>demande_oper_relais<\/strong><\/em><\/p>\n\n\n\n<p><em>void demande_oper_relais(){<br>     blJetonOperRelais = 1;<br>   }<\/em><\/p>\n\n\n\n<p>On ne peut directement op\u00e9rer le relais et tenir compte des d\u00e9lais configur\u00e9s, les d\u00e9lais \u00e9tant bloqu\u00e9s dans la routine de service d&rsquo;interruption. Ici le programme met \u00e0 1 le jeton  <em>blJetonOperRelais<\/em> et retourne la main \u00e0 LOOP. <\/p>\n\n\n\n<p>La boucle est divis\u00e9e en partie, une partie ne peut commencer \u00e0 s&rsquo;ex\u00e9cuter que si le jeton est \u00e0 0. <\/p>\n\n\n\n<p><em>if (!blJetonOperRelais) {<br>      \/\/ *   Traite les \u00e9changes sur BLUETOOTH   ***<br>      do_Uart_Tick(); <br>   }<\/em><\/p>\n\n\n\n<p>Suite \u00e0 l&rsquo;interruption, le jeton \u00e9tant \u00e0 1, le microcontr\u00f4leur va plus rapidement aux instructions associ\u00e9es changement d&rsquo;\u00e9tat du GPIO qui a activ\u00e9 l&rsquo;interruption. Ces instructions sont dans la boucle et s&rsquo;ex\u00e9cutent si le jeton est \u00e0 1. Apr\u00e8s ex\u00e9cution le jeton est remis \u00e0 0.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>  Instructions dans la boucle qui s&rsquo;ex\u00e9cutent si le jeton est \u00e0 1  <br><em>&nbsp;<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   if (blJetonOperRelais) {\n        oper_delai_plus_relais();\n        blJetonOperRelais = 0;\n     } <\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Fonctions<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>void oper_delai_plus_relais(){\n    delaiDeReaction();\n    declencheRelais();  \/\/ inclus le d\u00e9lai de retour \n }\ufeff<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/***  Attente selon le d\u00e9lai de r\u00e9action ****\n void 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 }<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/   Activation du relais **\n void 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 }<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">L\u2019APPLICATION<\/h4>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>L\u2019application est divis\u00e9e en deux fichiers. Ils doivent \u00eatre plac\u00e9s dans le m\u00eame r\u00e9pertoire nomm\u00e9 \u00abDeclencheur_de_relais_Comm_Bluetooth_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_Comm_Bluetooth_01\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (ouverture dans un nouvel onglet)\">https:\/\/github.com\/rcepmorel\/Declencheur_de_relais_Comm_Bluetooth_01<\/a><\/p>\n\n\n\n<p><strong>Declencheur_de_relais_Comm_Bluetooth_01.ino<\/strong><\/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 COMMUNICATION BLUETOOTH\n* \n* Auteur : Richard Morel\n*     2018-12-17\n* \n* Modification\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\/\/ utiliser une pr\u00e9cision de 13 bits pour le temporisateur LEDC\n#define LEDC_TIMER_13_BIT  13\n\n\/\/ utilise 5000 Hz comme fr\u00e9quence de base du LEDC\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\/\/******  Bluetooth *********************\n#include \"BluetoothSerial.h\"\n#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)\n#error Bluetooth est non actif\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  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\nvolatile boolean blJetonOperRelais = 0;  \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 de la 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\/\/******   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\nvoid oper_delai_plus_relais(){\n   delaiDeReaction();\n   declencheRelais();  \/\/ inclus le d\u00e9lai de retour \n}\n\nvoid demande_oper_relais(){\n  blJetonOperRelais = 1;\n}\n\/\/*****  Choix d'affichage de la couleur de la DEL *******\n\/\/           AFFICHAGE VERT SEULEMENT\nvoid AfficheVert(){\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 \/\/ *******  Traite les \u00e9changes sur BLUETOOTH ******** \n #include \"echange_Bluetooth_et_traitement.h\"\n \n\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  \/\/**********  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  \/\/ Un petit d\u00e9lai pour laisser les choses se stabiler\n  delay(30);\n  \n  attachInterrupt(digitalPinToInterrupt(PIN_DETECTEUR_LASER_1), demande_oper_relais, FALLING);\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\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\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\/*\n  AfficheVert();\n*\/\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  \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\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\n  if (!blJetonOperRelais) {\n     \/\/ *****************   Traitement de l'affichage de la DEL  ************************\n     \/\/     \n     if (flVoltMesure > inSeuilDeVoltage ){          \/\/ Voltage d'alimentation > 7 volts \n        AfficheVert();\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             AfficheVert();                          \/\/ Vert OK\n                                                     \/\/ \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  if (!blJetonOperRelais) {\n     \/\/ ***************   Traite les \u00e9changes sur BLUETOOTH   *****************\n     do_Uart_Tick(); \n  }\n} \/\/ # Fin du Void Loop\n\n\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">echange_Bluetooth_et_traitement.h<\/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<hr class=\"wp-block-separator\"\/>\n\n\n\n<table class=\"wp-block-table\"><tbody><tr><td> <a href=\"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais\/\">&lt;- <\/a><strong><a href=\"https:\/\/espacerm.com\/webgen\/linterface-bluetooth-du-declencheur-de-relais\/\">L\u2019interface BLUETOOTH du d\u00e9clencheur de relais ( 1 de 2 )<\/a><\/strong> <\/td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/td><td><strong><a href=\"https:\/\/espacerm.com\/webgen\/declencheur-de-relais-interface-web-et-bluetooth-actives-simultanement\/\">D\u00e9clencheur de relais \u2013 Interfaces Web et Bluetooth  actives simultan\u00e9ment&nbsp;-&gt;<\/a><\/strong><\/td><\/tr><\/tbody><\/table>\n","protected":false},"excerpt":{"rendered":"<p>Abordons maintenant la programmation du ESP32. C&rsquo;est pratiquement le m\u00eame programme que l&rsquo;interface Web, mais la partie Web est remplac\u00e9e par la partie BLUETOOTH. Fonctions de la DEL Une DEL RGB est utilis\u00e9e pour afficher 2 conditions Vert&nbsp; &nbsp; &nbsp; &nbsp;: Le circuit est fonctionnel Orange : Le voltage de la source d\u2019alimentation est sous [&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\/2330"}],"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=2330"}],"version-history":[{"count":69,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/2330\/revisions"}],"predecessor-version":[{"id":3442,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/2330\/revisions\/3442"}],"wp:attachment":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/media?parent=2330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}