Attribut:Step Content

This is a property of type Text.

Affichage de 20 pages utilisant cette propriété.
C
<nowiki>Cette première étape permet à un Wemos D1 mini (ou autre carte compatible Arduino avec puce Wi-Fi) de se connecter au Wi-Fi dans un environnement connu, et qui ne change pas ; C'est-à-dire que l'on à accès à une borne Wi-Fi, on connait son mot de passe - aka "clé de sécurité réseau", et a priori la carte va rester dans cet environnement.<br /><br /><br />Ces bibliothèques sont pré-chargées dans l'environnement Arduino, il n'est pas nécessaire d'aller les chercher dans le gestionnaire de bibliothèques.<br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Connexion Wi-Fi de base<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include <ESP8266WiFi.h> // Pour le Wemos D1 Mini, ou ...<br />#include <WiFi.h> // ... Pour l'ESP32<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left"><br /></td></tr><tr><br /><td rowspan="3" valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Démarrage de la connexion<br /></td><td valign="middle" align="left">WiFi.begin(SSID, SecKey) ; // Où SSID est le nom du point d'accès Wi-Fi, et SecKey son mot de passe<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Test de la connexion<br /></td><td valign="middle" align="left">if (WiFi.Status() == WL_CONNECTED) { (...) }<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Récupération de l'adresse IP<br /></td><td>WiFi.localIP() ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Utilisation<br /></td><td>Le test de la connexion, et la récupération de l'adresse IP peuvent aussi être utilisés dans le loop().<br /></td></tr></table><br /><br /><br />Pour connaître toutes les autres possibilités de ces bibliothèques, voir leurs références, respectivement [https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi ici] (D1 Mini) et [https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFi ici] (ESP32).<br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 1 : connexion basique au Wi-Fi</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 6 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 7 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 8 </span><br /><span class="lineno"> 9 </span><span class="c1">// Bibliothèques WiFi : UNE SEULE EST NECESSAIRE, choisir celle correspondant à votre matériel. </span><br /><span class="lineno">10 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno">11 </span><br /><span class="lineno">12 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WiFi.h> // A utiliser pour le D1 Mini </span><span class="cp"></span><br /><span class="lineno">13 </span><span class="c1">//#include <WiFi.h> // A utiliser pour l'ESP32</span><br /><span class="lineno">14 </span><br /><span class="lineno">15 </span><span class="c1">// Définition du point d'accès Wi-Fi et de son mot de passe ("clé de sécurité")</span><br /><span class="lineno">16 </span><span class="c1">// A REMPLACER PAR LES VERITABLES VALEURS CORRESPONDANT A VOTRE EMPLACEMENT</span><br /><span class="lineno">17 </span> <br /><span class="lineno">18 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"MA_BOX_INTERNET"</span><span class="p">;</span><br /><span class="lineno">19 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"MA_CLE_DE_SECURITE"</span><span class="p">;</span><br /><span class="lineno">20 </span><br /><span class="lineno">21 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">22 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">23 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">24 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">25 </span><br /><span class="lineno">26 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">27 </span><br /><span class="lineno">28 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">29 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">30 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">31 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">32 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple de connexion Wi-Fi basique"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">33 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">34 </span><br /><span class="lineno">35 </span> <span class="c1">// Démarrage de la tentative de connexion, avec le nom du point d'accès Wi-Fi et son mot de passe</span><br /><span class="lineno">36 </span><br /><span class="lineno">37 </span> <span class="nf">WiFi</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span> <span class="n">mySecKey</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">38 </span><br /><span class="lineno">39 </span> <span class="c1">// Attente de la connexion pendant 10 secondes (20 x 500 ms)</span><br /><span class="lineno">40 </span><br /><span class="lineno">41 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connexion à "</span><span class="p">);</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="p">;</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">" "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">42 </span> <span class="kr">int</span> <span class="n">tryNumber</span> <span class="o">=</span> <span class="mi">1</span> <span class="p">;</span><br /><span class="lineno">43 </span> <span class="k">while</span> <span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">status</span><span class="p">()</span> <span class="o">!=</span> <span class="n">WL_CONNECTED</span><span class="p">)</span><br /><span class="lineno">44 </span> <span class="p">{</span><br /><span class="lineno">45 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span><br /><span class="lineno">46 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span><br /><span class="lineno">47 </span> <span class="k">if</span> <span class="p">(</span><span class="o">++</span><span class="n">tryNumber</span> <span class="o">></span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">48 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">()</span> <span class="p">;</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Pas de connexion, abandon"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">49 </span> <span class="k">return</span> <span class="p">;</span><br /><span class="lineno">50 </span> <span class="p">}</span><br /><span class="lineno">51 </span> <span class="p">}</span> <br /><span class="lineno">52 </span><br /><span class="lineno">53 </span> <span class="c1">// La connexion a réussi ! On affiche l'adresse IP obtenue.</span><br /><span class="lineno">54 </span> <br /><span class="lineno">55 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté ! Adresse IP : "</span><span class="p">);</span><br /><span class="lineno">56 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">57 </span> <br /><span class="lineno">58 </span><span class="p">}</span><br /><span class="lineno">59 </span><br /><span class="lineno">60 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">61 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">62 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">63 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">64 </span> <span class="cm">/* On ne fait rien de particulier sur cet exemple */</span><br /><span class="lineno">65 </span><span class="p">}</span><br /></pre></div></nowiki>  , <nowiki>Dans l'étape précédente on supposait que le Wi-Fi était permanent (cas où les cartes ne quittent pas notre labo, par exemple). Mais si on souhaite faire voyager nos cartes (démos dans des écoles, etc ...), on a trois possibilités : <br /><br />*On vient avec son environnement de développement Arduino, on met à jour le code Arduino avec les nouvelles informations Wi-Fi, et on téléverse le code sur toutes nos cartes ... un peu laborieux, n'est-il pas ?<br />*ou bien, on dispose en permanence d'un téléphone mobile avec forfait données (4G ou +), et on utilise systématiquement celui-ci en mode "Point d'accès mobile". C'est donc ce téléphone qui sera vu en permanence comme le point d'accès Wi-Fi préféré de votre carte (D1 mini ou ESP32), quelque soit l'endroit où vous vous trouvez. Pas toujours possible ...<br />*et sinon, on utilise la bibliothèque "WiFiManager", qui nous simplifie grandement la tâche !<br /><br />En effet, cette bibliothèque permet d'enregistrer de façon pérenne (même si on débranche la carte) le dernier Point d'Accès Wi-Fi sur lequel la carte a réussi à se connecter. La bibliothèque va d'abord chercher à se connecter sur ce Point d'Accès "connu". Et si ça ne fonctionne pas (on a changé de lieu, par exemple), alors elle va se positionner elle-même en mode "Point d'Accès", et va proposer sur l'adresse 192.168.4.1 une interface web permettant d'afficher les Points d'Accès Wi-Fi environnants, et d'en sélectionner un. Le nouveau Point d'Accès choisi sera sauvegardé pour les fois suivantes. <br /><br /><br /><u>Interface web du WiFi Manager :</u><br /><br />#Avec un téléphone ou ordinateur, connectez-vous au point d'accès "AP_PetitDeb" et tapez le mot de passe associé. Il y aura probablement un message indiquant qu'Internet n'est pas disponible, c'est normal, ne pas en tenir compte ;<br />#Sur votre navigateur préféré, tapez "192.168.4.1", ce qui fera apparaître l'interface web générée par la bibliothèque WiFiManager. Cliquez sur "Configure WiFi", vous arrivez sur le choix du point d'accès.<br />#Choisissez alors votre point d'accès Wi-Fi préféré, son nom sera reporté dans la case "SSID", complétez avec le mot de passe dans la case "Password", et cliquez sur Save<br /><br /><br/><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions r seau WiKi WiFiManager S.png" data-sourceimage="https://www.wikidebrouillard.org/images/f/f8/Code_minimal_des_fonctions_r_seau_WiKi_WiFiManager_S.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Code_minimal_des_fonctions_r_seau_WiKi_WiFiManager_S.png" class="image" title="Utilisation du WiFiManager"><img alt="Image permettant de comprendre l'utilisation de la bibliothèque WiFiManager" src="/images/thumb/f/f8/Code_minimal_des_fonctions_r_seau_WiKi_WiFiManager_S.png/800px-Code_minimal_des_fonctions_r_seau_WiKi_WiFiManager_S.png" width="800" height="574" data-file-width="1200" data-file-height="861" /></a></div></div></span></div><br /><br /><br />'''Bibliothèque'''<br /><br /><br><br />La bibliothèque doit être rajoutée à l'environnement Arduino dans le gestionnaire de Bibliothèques (voir [https://www.wikidebrouillard.org/wiki/Importer_des_biblioth%C3%A8ques_dans_l%27interface_Arduino ici] pour le mode d'emploi) :<br /><br /><br/><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Image.png" data-sourceimage="https://www.wikidebrouillard.org/images/5/53/Code_minimal_des_fonctions_reseau_Image.png"><span ><div class="floatleft"><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Image.png" class="image" title="Bibliothèque WiFiManager"><img alt="Image de la Bibliothèque WiFiManager dans le Gestionnaire de Bibliothèques Arduino" src="/images/5/53/Code_minimal_des_fonctions_reseau_Image.png" width="756" height="110" data-file-width="756" data-file-height="110" /></a></div></span></div><br /><br /><br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Bibliothèque Wifi Manager<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include <WiFiManager.h><br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left">WiFiManager myWiFiManager;<br /></td></tr><tr><br /><td rowspan="3" valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Déclaration du mode bloquant<br /></td><td valign="middle" align="left">myWiFiManager.setConfigPortalBlocking(true); // ... ou rien (mode par défaut)<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Déclaration du mode non bloquant<br /></td><td>myWiFiManager.setConfigPortalBlocking(false);<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Tentative de connexion à un PA Wi-Fi<br /></td><td>if (myWiFiManager.autoConnect(Nom_AP, MotDePasse_AP)) { (... connexion OK !) }<br /></td></tr><tr><br /><td valign="middle" height="41" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Activation régulière pour le mode non bloquant<br /></td><td valign="middle" align="left">myWiFiManager.process() ; // Obligatoire en mode non bloquant<br /></td></tr></table><br /><br />Pour connaître toutes les autres possibilités de cette bibliothèque, voir sa référence, [https://jp112sdl.github.io/WiFiManager/ ici].<br /><br /><br /><br />'''Code minimal : mode bloquant (par défaut)'''<br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 2 : Connexion à un point d'accès choisi par l'utilisateur</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * CAS A : MODE BLOQUANT - On attend tant que l'utilisateur n'a pas choisi son Point d'Accès Wi-Fi</span><br /><span class="lineno"> 6 </span><span class="cm"> * </span><br /><span class="lineno"> 7 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 8 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 9 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno">10 </span><br /><span class="lineno">11 </span><span class="c1">// Bibliothèque WiFiManager. Un seule bibibliothèque suffit ici, quelque soit la carte (ESP32 ou Wemos D1 Mini)</span><br /><span class="lineno">12 </span><br /><span class="lineno">13 </span><span class="cp">#include</span> <span class="cpf"><WiFiManager.h> // Gestion de la connexion Wi-Fi (recherche de points d'accès) </span><span class="cp"></span><br /><span class="lineno">14 </span><span class="n">WiFiManager</span> <span class="n">myWiFiManager</span><span class="p">;</span> <span class="c1">// Création de mon instance de WiFiManager.</span><br /><span class="lineno">15 </span><br /><span class="lineno">16 </span><span class="c1">// Définition de la carte lorsqu'elle se positionne en mode "Point d'Accès".</span><br /><span class="lineno">17 </span> <br /><span class="lineno">18 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// Nom du point d'accès</span><br /><span class="lineno">19 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span> <span class="c1">// Mot de passe, 8 caractères au minimum</span><br /><span class="lineno">20 </span><br /><span class="lineno">21 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">22 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">23 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">24 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">25 </span><br /><span class="lineno">26 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">27 </span><br /><span class="lineno">28 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">29 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">30 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">31 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">32 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple de connexion Wi-Fi évoluée"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">33 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">34 </span><br /><span class="lineno">35 </span> <span class="c1">// Tentative de connexion au Wi-Fi. Si la carte n'a pas réussi se connecter au dernier Point d'Accès connu,</span><br /><span class="lineno">36 </span> <span class="c1">// alors elle va se positionner en mode Point d'Accès, demandera sur l'adresse 192.168.4.1 quel nouveau</span><br /><span class="lineno">37 </span> <span class="c1">// Point d'Accès choisir. Par défaut, on restera bloqué tant que l'utilisateur n'aura pas fait de choix.</span><br /><span class="lineno">38 </span> <br /><span class="lineno">39 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion au Wi-Fi ..."</span><span class="p">);</span><br /><span class="lineno">40 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myWiFiManager</span><span class="p">.</span><span class="n">autoConnect</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span> <span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">41 </span> <br /><span class="lineno">42 </span> <span class="c1">// Wi-Fi en mode standard ok --> On affiche l'adresse IP obtenue.</span><br /><span class="lineno">43 </span><br /><span class="lineno">44 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté ! Adresse IP : "</span><span class="p">);</span><br /><span class="lineno">45 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">46 </span> <br /><span class="lineno">47 </span> <span class="p">}</span><br /><span class="lineno">48 </span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">49 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion Wi-Fi KO :-("</span><span class="p">);</span> <br /><span class="lineno">50 </span> <span class="p">}</span><br /><span class="lineno">51 </span> <br /><span class="lineno">52 </span><span class="p">}</span><br /><span class="lineno">53 </span><br /><span class="lineno">54 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">55 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">56 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">57 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">58 </span> <span class="cm">/* On ne fait rien de particulier sur cet exemple */</span><br /><span class="lineno">59 </span><span class="p">}</span><br /></pre></div><br /><br /><br /><br />'''Code minimal : mode non bloquant'''<br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 2 : Connexion à un point d'accès choisi par l'utilisateur</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * CAS B : MODE NON BLOQUANT - On peut faire autre chose en attendant que l'utilisateur ait choisi</span><br /><span class="lineno"> 6 </span><span class="cm"> * son Point d'Accès Wi-Fi</span><br /><span class="lineno"> 7 </span><span class="cm"> * </span><br /><span class="lineno"> 8 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 9 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno">10 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno">11 </span><br /><span class="lineno">12 </span><span class="c1">// Bibliothèque WiFiManager. Un seule bibibliothèque suffit ici, quelque soit la carte (ESP32 ou Wemos D1 Mini)</span><br /><span class="lineno">13 </span><br /><span class="lineno">14 </span><span class="cp">#include</span> <span class="cpf"><WiFiManager.h> // Gestion de la connexion Wi-Fi (recherche de points d'accès) </span><span class="cp"></span><br /><span class="lineno">15 </span><span class="n">WiFiManager</span> <span class="n">myWiFiManager</span><span class="p">;</span> <span class="c1">// Création de mon instance de WiFiManager.</span><br /><span class="lineno">16 </span><br /><span class="lineno">17 </span><span class="c1">// Définition de la carte lorsqu'elle se positionne en mode "Point d'Accès".</span><br /><span class="lineno">18 </span> <br /><span class="lineno">19 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// Nom du point d'accès</span><br /><span class="lineno">20 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span> <span class="c1">// Mot de passe, 8 caractères au minimum</span><br /><span class="lineno">21 </span><br /><span class="lineno">22 </span><span class="c1">// Pour les besoins de l'exemple (traces)</span><br /><span class="lineno">23 </span><br /><span class="lineno">24 </span><span class="kr">bool</span> <span class="n">IAmNotConnected</span> <span class="o">=</span> <span class="kr">true</span> <span class="p">;</span><br /><span class="lineno">25 </span><br /><span class="lineno">26 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">27 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">28 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">29 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">30 </span><br /><span class="lineno">31 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">32 </span><br /><span class="lineno">33 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">34 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">35 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">36 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">37 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple de connexion Wi-Fi évoluée"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">38 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">39 </span><br /><span class="lineno">40 </span> <span class="c1">// Déclaration du mode "non bloquant".</span><br /><span class="lineno">41 </span> <span class="c1">// Bonus : suppression des traces fournies par le WiFiManager (il est très bavard)</span><br /><span class="lineno">42 </span> <br /><span class="lineno">43 </span> <span class="n">myWiFiManager</span><span class="p">.</span><span class="n">setConfigPortalBlocking</span><span class="p">(</span><span class="kr">false</span><span class="p">);</span> <br /><span class="lineno">44 </span> <span class="n">myWiFiManager</span><span class="p">.</span><span class="n">setDebugOutput</span><span class="p">(</span><span class="kr">false</span><span class="p">);</span> <br /><span class="lineno">45 </span><br /><span class="lineno">46 </span> <span class="c1">// Tentative de connexion au Wi-Fi. Si la carte n'a pas réussi se connecter au dernier Point d'Accès connu,</span><br /><span class="lineno">47 </span> <span class="c1">// alors elle va se positionner en mode Point d'Accès, demandera sur l'adresse 192.168.4.1 quel nouveau</span><br /><span class="lineno">48 </span> <span class="c1">// Point d'Accès choisir. On ne reste pas bloqué, la suite du setup() va se dérouler, et le WiFiManager</span><br /><span class="lineno">49 </span> <span class="c1">// traitera les demandes ultérieurement, dans la fonction loop().</span><br /><span class="lineno">50 </span> <br /><span class="lineno">51 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion au Wi-Fi ..."</span><span class="p">);</span><br /><span class="lineno">52 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myWiFiManager</span><span class="p">.</span><span class="n">autoConnect</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span> <span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">53 </span> <br /><span class="lineno">54 </span> <span class="c1">// Wi-Fi en mode standard ok --> On affiche l'adresse IP obtenue.</span><br /><span class="lineno">55 </span><br /><span class="lineno">56 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté ! Adresse IP : "</span><span class="p">);</span><br /><span class="lineno">57 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">58 </span> <br /><span class="lineno">59 </span> <span class="p">}</span><br /><span class="lineno">60 </span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">61 </span><br /><span class="lineno">62 </span> <span class="c1">// Wi-Fi standard KO, on est passé en mode AP, qui sera traité dans le loop().</span><br /><span class="lineno">63 </span> <br /><span class="lineno">64 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Pas de point Wi-Fi connu, passage en mode AP (identifiant </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">)"</span><span class="p">);</span> <br /><span class="lineno">65 </span> <span class="p">}</span><br /><span class="lineno">66 </span> <br /><span class="lineno">67 </span><span class="p">}</span><br /><span class="lineno">68 </span><br /><span class="lineno">69 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">70 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">71 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">72 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">73 </span> <br /><span class="lineno">74 </span> <span class="c1">// Obligatoire en mode non bloquant, pour que le WiFiManager continue sa tâche.</span><br /><span class="lineno">75 </span><br /><span class="lineno">76 </span> <span class="n">myWiFiManager</span><span class="p">.</span><span class="nf">process</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno">77 </span><br /><span class="lineno">78 </span> <span class="c1">// Test pour savoir si on est enfin connecté - on ne l'affiche qu'une fois pour limiter les traces</span><br /><span class="lineno">79 </span><br /><span class="lineno">80 </span> <span class="k">if</span> <span class="p">(</span><span class="n">IAmNotConnected</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">81 </span> <span class="k">if</span> <span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">status</span><span class="p">()</span> <span class="o">==</span> <span class="n">WL_CONNECTED</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">82 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté au point d'accès "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">SSID</span><span class="p">())</span> <span class="o">+</span> <span class="s">", Adresse IP : "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">83 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">84 </span> <span class="n">IAmNotConnected</span> <span class="o">=</span> <span class="kr">false</span> <span class="p">;</span><br /><span class="lineno">85 </span> <span class="p">}</span><br /><span class="lineno">86 </span> <span class="p">}</span><br /><span class="lineno">87 </span> <br /><span class="lineno">88 </span><span class="p">}</span><br /></pre></div><br/></nowiki>  , <nowiki>Il existe des cas particuliers où une application n'a en fait pas besoin du Wi-Fi pour aller envoyer ou recevoir des données d'Internet, mais souhaite être juste être considérée comme un Point d'Accès Wi-Fi. Ce mode est suffisant si l'on souhaite commander notre carte depuis un système proche. Par exemple pour commander un système domotique en mode web depuis notre mobile ... petit "spoiler" de l'épisode 2 :-) <br /><br /><br />Pour utiliser le mode "Point d'Accès", on garde les librairies de base, vues à l'étape 1, en utilisant d'autres fonctions. <br/><br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Mode Point d'Accès<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include <ESP8266WiFi.h> // Pour le Wemos D1 Mini, ou ...<br />#include <WiFi.h> // ... Pour l'ESP32<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left"><br /></td></tr><tr><br /><td rowspan="3" valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Lancement du mode AP<br />avec mot de passe<br /></td><td valign="middle" align="left">if (WiFi.softAP(SSID, SecKey)) { (... succès ... } ; // Où SSID est le nom du point d'accès Wi-Fi, et SecKey son mot de passe<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Lancement du mode AP<br />sans mot de passe<br/><br /></td><td valign="middle" align="left">if (WiFi.softAP(SSID)) { (... succès ... } ; // Où SSID est le nom du point d'accès Wi-Fi<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Récupération de l'adresse IP de base<br /></td><td>WiFi.softAPIP() ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Utilisation<br /></td><td>La récupération de l'adresse IP peut aussi être utilisée dans le loop().<br /></td></tr></table><br /><br /><br />Pour connaître toutes les autres possibilités de ces bibliothèques, voir leurs références, respectivement [https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi ici] (D1 Mini) et [https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFi ici] (ESP32).<br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 3 : Configuration en mode Point d'Accès</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 6 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 7 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 8 </span><br /><span class="lineno"> 9 </span><span class="c1">// Bibliothèques WiFi : UNE SEULE EST NECESSAIRE, choisir celle correspondant à votre matériel. </span><br /><span class="lineno">10 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno">11 </span><br /><span class="lineno">12 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WiFi.h> // A utiliser pour le D1 Mini </span><span class="cp"></span><br /><span class="lineno">13 </span><span class="c1">//#include <WiFi.h> // A utiliser pour l'ESP32</span><br /><span class="lineno">14 </span><br /><span class="lineno">15 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span><br /><span class="lineno">16 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span><br /><span class="lineno">17 </span><br /><span class="lineno">18 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">19 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">20 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">21 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">22 </span><br /><span class="lineno">23 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">24 </span><br /><span class="lineno">25 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">26 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">27 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">28 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"-----------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">29 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple en mode Point d'Accès"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">30 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"-----------------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">31 </span><br /><span class="lineno">32 </span> <span class="c1">// Déclaration du mode "Point d'Accès"</span><br /><span class="lineno">33 </span><br /><span class="lineno">34 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Déclaration Mode AP, SSID </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">35 </span><br /><span class="lineno">36 </span> <span class="k">if</span> <span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAP</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span><span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">37 </span><br /><span class="lineno">38 </span> <span class="c1">// Voilà, nous somme en mode "Point d'Accès", notre carte sera visible des systèmes Wi-Fi environnants,</span><br /><span class="lineno">39 </span> <span class="c1">// au même titre que les autres box Wi-Fi du voisinage. Par contre, ça s'arrête là, et si une fois</span><br /><span class="lineno">40 </span> <span class="c1">// connecté sur ce Point d'Accès "AP_PetitDeb" on cherche à joindre notre carte sur l'adresse IP obtenue</span><br /><span class="lineno">41 </span> <span class="c1">// ci-dessous par WiFi.softAPIP(), on aura droit à un beau "ERR_CONNECTION_REFUSED". Normal, on n'a pas</span><br /><span class="lineno">42 </span> <span class="c1">// précisé dans l'application ce qu'il faut faire : voir exemple suivant Code_Minimal_Etape4.</span><br /><span class="lineno">43 </span> <br /><span class="lineno">44 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Mode AP OK, IP Address : "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">45 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAPIP</span><span class="p">())</span> <span class="p">;</span><br /><span class="lineno">46 </span> <span class="p">}</span><br /><span class="lineno">47 </span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">48 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Mode AP KO ... :-("</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">49 </span> <span class="p">}</span><br /><span class="lineno">50 </span> <br /><span class="lineno">51 </span><span class="p">}</span><br /><span class="lineno">52 </span><br /><span class="lineno">53 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">54 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">55 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">56 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">57 </span> <br /><span class="lineno">58 </span> <span class="c1">// Rien de spécial dans cet exemple</span><br /><span class="lineno">59 </span> <br /><span class="lineno">60 </span><span class="p">}</span><br /></pre></div></nowiki>  ,
<nowiki>Une première possibilité d'utilisation du Wi-Fi sur nos cartes, est d'y définir un mini-serveur web , qui nous permettra d'afficher voire de modifier, depuis n'importe quel navigateur, des données gérées par la carte - et par conséquent de récupérer la valeur de capteurs (température, ...) ou gérer des actionneurs (moteurs, leds, ...).<br /><br /><br />On peut trouver quelques exemples d'applications de ce type, réalisée par des Petits Débrouillards, en particulier le [https://github.com/julienrat/petitbot Petit Bot], petit robot commandable, ou encore [https://www.wikidebrouillard.org/wiki/Commander_un_D1_mini_avec_une_interface_web Commander un D1 mini avec une interface web], permettant d'animer des leds, de gérer un moteur, et de récupérer des données du D1 mini sur une interface web.<br /><br /><br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Site web<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include <ESP8266WebServer.h> // Pour le D1 Mini, ou ...<br /><br />#include <WebServer.h> // ... pour l'ESP32<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création du serveur web (sur le port 80)<br /></td><td valign="middle" align="left">ESP8266WebServer myWeb(80); // Pour le D1 Mini , ou ...<br /><br />// WebServer myWeb(80) ; // ... pour l'ESP32<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Déclaration de la fonction qui s'occupera<br />de la génération de la page web<br /></td><td valign="middle" align="left">myWeb.on ( "/", runPage01 );<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Démarrage du serveur web<br /></td><td>myWeb.begin();<br /></td></tr><tr><br /><td valign="middle" height="41" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Traitement des requêtes web<br /></td><td valign="middle" align="left">myWeb.handleClient();<br /></td></tr></table><br/>'''Code Minimal 4a : affichage d'un paramètre de la carte.'''<br /><br /><br />La page web hébergée sur notre carte doit être codée en HTML. La page peut être assez évoluée, intégrer du code javascript, être formatée en mode CSS, etc ... Dans l'exemple "minimal" ci-dessous, on se contente d'une page HTML basique.<br /><br />''Une fois le code téléversé sur votre carte, pour voir le résultat, connectez-vous (avec un ordinateur ou un mobile) sur le point d'accès "AP_PetitDeb" (mot de passe "PSWD1234"), puis lancez votre navigateur préféré et tapez 192.168.4.1.''<br /><br/><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Ecran-Etape-4.png" data-sourceimage="https://www.wikidebrouillard.org/images/9/98/Code_minimal_des_fonctions_reseau_Ecran-Etape-4.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Ecran-Etape-4.png" class="image" title="Ecran-Etape-4A"><img alt="Ecran-Etape-4A" src="/images/9/98/Code_minimal_des_fonctions_reseau_Ecran-Etape-4.png" width="785" height="336" data-file-width="785" data-file-height="336" /></a></div></div></span></div><br /><br /><br /><br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 4 : site WEB</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * CAS A : Page HTML Basique, consultation d'une variable de la carte</span><br /><span class="lineno"> 6 </span><span class="cm"> * </span><br /><span class="lineno"> 7 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 8 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 9 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 10 </span><br /><span class="lineno"> 11 </span><span class="c1">// Bibliothèques WiFi et WebServer: ATTENTION, choisir celles correspondant à votre matériel. </span><br /><span class="lineno"> 12 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno"> 13 </span><br /><span class="lineno"> 14 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WiFi.h> // A utiliser pour le D1 Mini </span><span class="cp"></span><br /><span class="lineno"> 15 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WebServer.h> // A utiliser pour le D1 Mini</span><span class="cp"></span><br /><span class="lineno"> 16 </span><span class="c1">//#include <WiFi.h> // A utiliser pour l'ESP32</span><br /><span class="lineno"> 17 </span><span class="c1">//#include <WebServer.h> // A utiliser pour l'ESP32</span><br /><span class="lineno"> 18 </span><br /><span class="lineno"> 19 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// On va utiliser le mode "Access Point" pour cet exemple</span><br /><span class="lineno"> 20 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span><br /><span class="lineno"> 21 </span><br /><span class="lineno"> 22 </span><span class="c1">// Déclaration de notre serveur web interne. </span><br /><span class="lineno"> 23 </span><br /><span class="lineno"> 24 </span><span class="n">ESP8266WebServer</span> <span class="nf">myWeb</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span> <span class="c1">// A utiliser pour le D1 Mini </span><br /><span class="lineno"> 25 </span><span class="c1">// WebServer myWeb(80) ; // A utiliser pour l'ESP32</span><br /><span class="lineno"> 26 </span><br /><span class="lineno"> 27 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 28 </span><span class="cm"> * webPage01 : formattage HTML de la page web. </span><br /><span class="lineno"> 29 </span><span class="cm"> * - En fait cette fonction doit rendre une chaîne (String) contenant l'intégralité du code HTML qui sera</span><br /><span class="lineno"> 30 </span><span class="cm"> * envoyé au navigateur de l'utilisateur.</span><br /><span class="lineno"> 31 </span><span class="cm"> * - On peut y insérer des informations de la carte, comme ici par exemple, le nom du Point d'accès (mySSID). </span><br /><span class="lineno"> 32 </span><span class="cm"> * Dans une véritable application, ça pourrait être la valeur d'un capteur de température.</span><br /><span class="lineno"> 33 </span><span class="cm"> * - Pour pouvoir débugger facilement le code HTML/Javascript sur un browser (par exemple Firefox / Outils </span><br /><span class="lineno"> 34 </span><span class="cm"> * supplémentaires / Outils de développement Web), il est préférable d'indenter le code à l'intérieur de la chaîne</span><br /><span class="lineno"> 35 </span><span class="cm"> * de caractère, et de mettre des sauts de ligne ("\n") à la fin de chaque ligne de code HTML. </span><br /><span class="lineno"> 36 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 37 </span><span class="kr">String</span> <span class="nf">webPage01</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 38 </span> <br /><span class="lineno"> 39 </span> <span class="kr">String</span> <span class="n">p</span><span class="p">;</span><br /><span class="lineno"> 40 </span> <span class="n">p</span> <span class="o">=</span> <span class="s">"<html lang=fr-FR><head><title>ETAPE 4 (Mini-Web)</title></head></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 41 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"<body></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 42 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <br><br><br><center><font size=</span><span class="se">\"</span><span class="s">12</span><span class="se">\"</span><span class="s">></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 43 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" Bonjour, je suis "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"...</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="c1">// C'est ici qu'on place l'information SSID.</span><br /><span class="lineno"> 44 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <br>... très heureux de te rencontrer !</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 45 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" </center></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 46 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"</body></html></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 47 </span> <span class="k">return</span> <span class="n">p</span><span class="p">;</span><br /><span class="lineno"> 48 </span> <br /><span class="lineno"> 49 </span><span class="p">}</span><br /><span class="lineno"> 50 </span><br /><span class="lineno"> 51 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 52 </span><span class="cm"> * runPage01 : gestion de la page web</span><br /><span class="lineno"> 53 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 54 </span><span class="kr">void</span> <span class="nf">runPage01</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 55 </span><br /><span class="lineno"> 56 </span> <span class="c1">// Affichage de la page Web.</span><br /><span class="lineno"> 57 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">send</span> <span class="p">(</span> <span class="mi">200</span><span class="p">,</span> <span class="s">"text/html"</span><span class="p">,</span> <span class="n">webPage01</span><span class="p">()</span> <span class="p">);</span> <br /><span class="lineno"> 58 </span><span class="p">}</span><br /><span class="lineno"> 59 </span><br /><span class="lineno"> 60 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 61 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno"> 62 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 63 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 64 </span><br /><span class="lineno"> 65 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno"> 66 </span><br /><span class="lineno"> 67 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno"> 68 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 69 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno"> 70 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 71 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple de serveur WEB"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 72 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 73 </span><br /><span class="lineno"> 74 </span> <span class="c1">// Déclaration du mode "Point d'Accès". On s'arrête là si échec.</span><br /><span class="lineno"> 75 </span><br /><span class="lineno"> 76 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Déclaration Mode AP, SSID </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 77 </span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAP</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span><span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno"> 78 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Mode AP KO ... :-("</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 79 </span> <span class="k">return</span> <span class="p">;</span><br /><span class="lineno"> 80 </span> <span class="p">}</span><br /><span class="lineno"> 81 </span><br /><span class="lineno"> 82 </span> <span class="c1">// Affichage de l'adresse IP principale du Point d'Accès.</span><br /><span class="lineno"> 83 </span><br /><span class="lineno"> 84 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Mode AP OK, IP Address : "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 85 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAPIP</span><span class="p">())</span> <span class="p">;</span><br /><span class="lineno"> 86 </span><br /><span class="lineno"> 87 </span> <span class="c1">// Définition des points d'entrée du serveur Web (un seul ici), et démarrage du serveur.</span><br /><span class="lineno"> 88 </span> <br /><span class="lineno"> 89 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">on</span> <span class="p">(</span> <span class="s">"/"</span><span class="p">,</span> <span class="n">runPage01</span> <span class="p">);</span><br /><span class="lineno"> 90 </span> <span class="n">myWeb</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span><br /><span class="lineno"> 91 </span> <br /><span class="lineno"> 92 </span><span class="p">}</span><br /><span class="lineno"> 93 </span><br /><span class="lineno"> 94 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 95 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno"> 96 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 97 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno"> 98 </span> <br /><span class="lineno"> 99 </span> <span class="c1">// Traitement des requêtes web.</span><br /><span class="lineno">100 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">handleClient</span><span class="p">();</span> <br /><span class="lineno">101 </span> <br /><span class="lineno">102 </span><span class="p">}</span><br /></pre></div><br/></nowiki>  , <nowiki><br/>'''Code Minimal 4b : actionner la carte via l'interface web'''<br /><br /><br />Dans l'exemple précédent, on se contente de récupérer un paramètre de la carte. Mais il est également possible de modifier un paramètre (par exemple l'état d'une des sorties de la carte, et donc d'agir sur un de ses périphériques : led, moteur, ...).<br /><br /><br />Le code ci-dessous présente donc un code "moins minimal", permettant d'afficher et de modifier une variable du programme Arduino. Dans une application réelle, il suffira alors d'utiliser cette variable pour afficher et agir sur sur l'état d'une des entrées/sorties de la carte.<br /><br />La partie HTML est un peu plus complexe, car on va y définir une fonction javascript, qui permettra de faire passer des informations du navigateur au serveur web hébergé. Voir les explications complémentaires dans le code lui-même. <br /><br /><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Ecran-Etape4B.png" data-sourceimage="https://www.wikidebrouillard.org/images/2/27/Code_minimal_des_fonctions_reseau_Ecran-Etape4B.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Ecran-Etape4B.png" class="image" title="Ecran-Etape4B"><img alt="Ecran-Etape4B" src="/images/2/27/Code_minimal_des_fonctions_reseau_Ecran-Etape4B.png" width="790" height="336" data-file-width="790" data-file-height="336" /></a></div></div></span></div> <br /><br /><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 4 : site WEB</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * CAS B : Page HTML plus évoluéee, et modification d'une variable de la carte</span><br /><span class="lineno"> 6 </span><span class="cm"> * </span><br /><span class="lineno"> 7 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 8 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 9 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 10 </span><br /><span class="lineno"> 11 </span><span class="c1">// Bibliothèques WiFi et WebServer: ATTENTION, choisir celles correspondant à votre matériel. </span><br /><span class="lineno"> 12 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno"> 13 </span><br /><span class="lineno"> 14 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WiFi.h> // A utiliser pour le D1 Mini </span><span class="cp"></span><br /><span class="lineno"> 15 </span><span class="cp">#include</span> <span class="cpf"><ESP8266WebServer.h> // A utiliser pour le D1 Mini</span><span class="cp"></span><br /><span class="lineno"> 16 </span><span class="c1">//#include <WiFi.h> // A utiliser pour l'ESP32</span><br /><span class="lineno"> 17 </span><span class="c1">//#include <WebServer.h> // A utiliser pour l'ESP32</span><br /><span class="lineno"> 18 </span><br /><span class="lineno"> 19 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// On va utiliser le mode "Access Point" pour cet exemple</span><br /><span class="lineno"> 20 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span><br /><span class="lineno"> 21 </span><br /><span class="lineno"> 22 </span><span class="c1">// Déclaration de notre serveur web interne, qui écoutera sur le port 80.</span><br /><span class="lineno"> 23 </span><br /><span class="lineno"> 24 </span><span class="n">ESP8266WebServer</span> <span class="nf">myWeb</span><span class="p">(</span><span class="mi">80</span><span class="p">);</span> <span class="c1">// A utiliser pour le D1 Mini </span><br /><span class="lineno"> 25 </span><span class="c1">// WebServer myWeb(80) ; // A utiliser pour l'ESP32</span><br /><span class="lineno"> 26 </span><br /><span class="lineno"> 27 </span><span class="c1">// Variable qui sera affichée et modifiée depuis notre interface web.</span><br /><span class="lineno"> 28 </span><br /><span class="lineno"> 29 </span><span class="kr">int</span> <span class="n">myValue</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span><br /><span class="lineno"> 30 </span><br /><span class="lineno"> 31 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 32 </span><span class="cm"> * webPage01 : formattage HTML de la page web. </span><br /><span class="lineno"> 33 </span><span class="cm"> * - En fait cette fonction doit rendre une chaîne (String) contenant l'intégralité du code HTML qui sera</span><br /><span class="lineno"> 34 </span><span class="cm"> * envoyé au navigateur de l'utilisateur.</span><br /><span class="lineno"> 35 </span><span class="cm"> * - Comme dans l'exemple précédent (Exemple_4A), on insère dans cette chaîne une information de la carte,</span><br /><span class="lineno"> 36 </span><span class="cm"> * ici la valeur de notre variable 'my value'. Mais on va aussi ajouter des boutons permettant de modifier</span><br /><span class="lineno"> 37 </span><span class="cm"> * cette valeur sur la carte. </span><br /><span class="lineno"> 38 </span><span class="cm"> * - Idem Exemple_4A : pour pouvoir débugger facilement le code HTML/Javascript sur un browser (par exemple </span><br /><span class="lineno"> 39 </span><span class="cm"> * Firefox / Outils supplémentaires / Outils de développement Web), il est préférable d'indenter le code à</span><br /><span class="lineno"> 40 </span><span class="cm"> * l'intérieur de la chaîne de caractère, et de mettre des sauts de ligne ("\n") à la fin de chaque ligne </span><br /><span class="lineno"> 41 </span><span class="cm"> * de code HTML. </span><br /><span class="lineno"> 42 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 43 </span><span class="kr">String</span> <span class="nf">webPage01</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 44 </span><br /><span class="lineno"> 45 </span> <span class="kr">String</span> <span class="n">p</span><span class="p">;</span> <br /><span class="lineno"> 46 </span><br /><span class="lineno"> 47 </span> <span class="c1">// Début de construction de la page web (entête, titre, paramètres)</span><br /><span class="lineno"> 48 </span> <br /><span class="lineno"> 49 </span> <span class="n">p</span> <span class="o">=</span> <span class="s">"<html lang=fr-FR><head></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <br /><span class="lineno"> 50 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"<title>ETAPE 4B</title></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="c1">// Titre de la page</span><br /><span class="lineno"> 51 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <meta charset='UTF-8'></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="c1">// Codage des caractères, UTF-8 est fortement recommandé</span><br /><span class="lineno"> 52 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"</head></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 53 </span><br /><span class="lineno"> 54 </span> <span class="c1">// Définitions CSS (), qui permettent de décrire le format des objets sur la page web. </span><br /><span class="lineno"> 55 </span> <span class="c1">// Si vous voulez tout savoir sur CSS, on peut trouver une bonne introduction ici : https://developer.mozilla.org/fr/docs/Learn/CSS</span><br /><span class="lineno"> 56 </span> <span class="c1">// et une référence complète ici : https://developer.mozilla.org/fr/docs/Web/CSS/Reference</span><br /><span class="lineno"> 57 </span> <br /><span class="lineno"> 58 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"<style></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 59 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" body { background-color: #000088; color: white; font-size: 25px; }</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="c1">// couleur fond écran (bleu foncé) et textes (blanc).</span><br /><span class="lineno"> 60 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" input { width:25%; margin:10px; font-size:20px; border-radius: 5px; }</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="c1">// format des boutons (taille, coins arrondis, ...).</span><br /><span class="lineno"> 61 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"</style></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 62 </span><br /><span class="lineno"> 63 </span> <span class="c1">// Début du code javascript. Javascript est le langage utilisé au niveau des navigateurs web (Firefox, Microsoft Edge, Google Chrome, ...)</span><br /><span class="lineno"> 64 </span> <span class="c1">// pour introduire un peu de dynamisme et d'intelligence dans les pages web. Cela peut permettre, par exemple, de réaliser une action </span><br /><span class="lineno"> 65 </span> <span class="c1">// locale et immediate, telle que l'agrandissement d'une image, le changement d'un texte, etc ... sans avoir à réinterroger le serveur web.</span><br /><span class="lineno"> 66 </span> <span class="c1">// </span><br /><span class="lineno"> 67 </span> <span class="c1">// Dans notre cas, la fonction 'addition(val)' ci-dessous va ajouter le paramètres 'val' à l'adresse du serveur web, et va ensuite appeler</span><br /><span class="lineno"> 68 </span> <span class="c1">// la page web de notre carte, avec ce paramètre. Par exemple, si l'adresse du site web de notre carte est 192.168.4.1, l'appel à la fonction</span><br /><span class="lineno"> 69 </span> <span class="c1">// addition(-1) va demander la page '192.168.4.1?add=-1'. Le paramètre 'add' de valeur '-1' sera alors exploité par la carte dans la </span><br /><span class="lineno"> 70 </span> <span class="c1">// fonction runPage01() définie plus bas. </span><br /><span class="lineno"> 71 </span> <span class="c1">//</span><br /><span class="lineno"> 72 </span> <span class="c1">// Dans un exemple réel on pourrait bien sûr définir plusieurs paramètres, du style '192.168.4.1?voyant=vert&servo1=90&servo2=0'</span><br /><span class="lineno"> 73 </span><br /><span class="lineno"> 74 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"<script></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 75 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"function addition(val) {</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <br /><span class="lineno"> 76 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" window.location = window.location.pathname + '?add=' + val ;</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <br /><span class="lineno"> 77 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"}</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span><br /><span class="lineno"> 78 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"</script></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 79 </span><br /><span class="lineno"> 80 </span> <span class="c1">// Corps de la page web : affichage de la valeur récupérée sur la carte, et de deux boutons 'ajouter 1' et 'enlever 1'.</span><br /><span class="lineno"> 81 </span> <span class="c1">// La fonction addition() définie dans le code javascript ci-dessus, sera appelée lorsqu'on appuie sur ces boutons.</span><br /><span class="lineno"> 82 </span> <br /><span class="lineno"> 83 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"<body><center></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 84 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" </br></br>Valeur actuelle : "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">myValue</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</br></br></span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <br /><span class="lineno"> 85 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <form></span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <br /><span class="lineno"> 86 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <input type='submit' value='ajouter 1' formaction='javascript:addition(1);' formmethod=post></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 87 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" <input type='submit' value='enlever 1' formaction='javascript:addition(-1);' formmethod=post></span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span><br /><span class="lineno"> 88 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">" </form></span><span class="se">\n</span><span class="s">"</span><span class="p">;</span><br /><span class="lineno"> 89 </span> <span class="n">p</span> <span class="o">+=</span> <span class="s">"</center></body></html>"</span> <span class="p">;</span><br /><span class="lineno"> 90 </span><br /><span class="lineno"> 91 </span> <span class="c1">// ça y est, la page web est complètement constituée !</span><br /><span class="lineno"> 92 </span><br /><span class="lineno"> 93 </span> <span class="k">return</span> <span class="n">p</span><span class="p">;</span><br /><span class="lineno"> 94 </span> <br /><span class="lineno"> 95 </span><span class="p">}</span><br /><span class="lineno"> 96 </span><br /><span class="lineno"> 97 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 98 </span><span class="cm"> * runPage01 : gestion de la page web</span><br /><span class="lineno"> 99 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">100 </span><span class="kr">void</span> <span class="nf">runPage01</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">101 </span><br /><span class="lineno">102 </span> <span class="c1">// Si la page a un paramètre 'add', alors on récupère sa valeur, et on l'ajoute à notre variable 'myValue'.</span><br /><span class="lineno">103 </span> <br /><span class="lineno">104 </span> <span class="k">if</span> <span class="p">(</span> <span class="n">myWeb</span><span class="p">.</span><span class="n">hasArg</span><span class="p">(</span><span class="s">"add"</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span> <br /><span class="lineno">105 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Traitement pge web, arg = '"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">myWeb</span><span class="p">.</span><span class="n">arg</span><span class="p">(</span><span class="s">"add"</span><span class="p">))</span> <span class="o">+</span> <span class="s">"'"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">106 </span> <span class="kr">int</span> <span class="n">myArg</span> <span class="o">=</span> <span class="n">myWeb</span><span class="p">.</span><span class="n">arg</span><span class="p">(</span><span class="s">"add"</span><span class="p">).</span><span class="n">toInt</span><span class="p">()</span> <span class="p">;</span> <br /><span class="lineno">107 </span> <span class="n">myValue</span> <span class="o">=</span> <span class="n">myValue</span> <span class="o">+</span> <span class="n">myArg</span> <span class="p">;</span><br /><span class="lineno">108 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Traitement page web, arg = '"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">myWeb</span><span class="p">.</span><span class="n">arg</span><span class="p">(</span><span class="s">"add"</span><span class="p">))</span> <span class="o">+</span> <span class="s">"' --> Nouvelle valeur : "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">myValue</span><span class="p">))</span> <span class="p">;</span><br /><span class="lineno">109 </span> <span class="p">}</span><br /><span class="lineno">110 </span><br /><span class="lineno">111 </span> <span class="c1">// On renvoie la page Web.</span><br /><span class="lineno">112 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">send</span> <span class="p">(</span> <span class="mi">200</span><span class="p">,</span> <span class="s">"text/html"</span><span class="p">,</span> <span class="n">webPage01</span><span class="p">()</span> <span class="p">);</span> <br /><span class="lineno">113 </span><span class="p">}</span><br /><span class="lineno">114 </span><br /><span class="lineno">115 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">116 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">117 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">118 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">119 </span><br /><span class="lineno">120 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">121 </span><br /><span class="lineno">122 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">123 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">124 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">125 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">126 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple de serveur WEB"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">127 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">128 </span><br /><span class="lineno">129 </span> <span class="c1">// Déclaration du mode "Point d'Accès". On s'arrête là si échec.</span><br /><span class="lineno">130 </span><br /><span class="lineno">131 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Déclaration Mode AP, SSID </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySSID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">132 </span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAP</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span><span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">133 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Mode AP KO ... :-("</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">134 </span> <span class="k">return</span> <span class="p">;</span><br /><span class="lineno">135 </span> <span class="p">}</span><br /><span class="lineno">136 </span><br /><span class="lineno">137 </span> <span class="c1">// Affichage de l'adresse IP principale du Point d'Accès.</span><br /><span class="lineno">138 </span><br /><span class="lineno">139 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Mode AP OK, IP Address : "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">140 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">softAPIP</span><span class="p">())</span> <span class="p">;</span><br /><span class="lineno">141 </span><br /><span class="lineno">142 </span> <span class="c1">// Définition des points d'entrée du serveur Web (un seul ici), </span><br /><span class="lineno">143 </span> <span class="c1">// et démarrage du serveur.</span><br /><span class="lineno">144 </span> <br /><span class="lineno">145 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">on</span> <span class="p">(</span> <span class="s">"/"</span><span class="p">,</span> <span class="n">runPage01</span> <span class="p">);</span><br /><span class="lineno">146 </span> <span class="n">myWeb</span><span class="p">.</span><span class="nf">begin</span><span class="p">();</span><br /><span class="lineno">147 </span> <br /><span class="lineno">148 </span><span class="p">}</span><br /><span class="lineno">149 </span><br /><span class="lineno">150 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">151 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">152 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">153 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">154 </span> <br /><span class="lineno">155 </span> <span class="c1">// Traitement des requêtes web.</span><br /><span class="lineno">156 </span> <span class="n">myWeb</span><span class="p">.</span><span class="n">handleClient</span><span class="p">();</span> <br /><span class="lineno">157 </span> <br /><span class="lineno">158 </span><span class="p">}</span><br /></pre></div></nowiki>  , *'''Episode 3 :''' [https://www.wikidebrouillard.org/wiki/Code_Minimal_R%C3%A9seau_-_(3)_Mon_D1_Mini_r%C3%A9cup%C3%A8re_des_donn%C3%A9es_sur_Internet_(Json) Mon Wemos D1 mini récupère des donnée sur Internet  (Json)]. *'''Episode 4 :''' [https://www.wikidebrouillard.org/wiki/Code_Minimal_R%C3%A9seau_-_(4)_Mes_Wemos_D1_Mini_discutent_sur_Internet_avec_MQTT Mon Wemos D1 mini discute sur Internet avec MQTT]. ''Ces épisodes sont indépendants les uns des autres''.   +
*'''Episode 4 :''' [https://www.wikidebrouillard.org/wiki/Code_Minimal_R%C3%A9seau_-_(4)_Mes_Wemos_D1_Mini_discutent_sur_Internet_avec_MQTT Mon Wemos D1 mini discute sur Internet avec MQTT.]   +, <nowiki>Nous allons maintenant nous intéresser à la récupération de données sur Internet (informations sur la météo, sur la pollution, sur les derniers recensements, ...). De nombreux serveurs de données, et en particulier les serveurs "Open Data" (offrant des données libres de droit), sont accessibles en mode web. C'est-à-dire qu'une simple requête dans la barre d'adresse de votre navigateur, permet de récupérer les informations souhaitées.<br /><br /><br /><br />Et, encore mieux, dans la plupart des cas, la réponse revient sous une forme standardisée de type '''JSON''' (JavaScript Objet Notation), que les navigateurs récents sont capables de décoder. A titre d'exemple, ouvrez un nouvel onglet dans votre navigateur, et recopiez dans la barre d'adresse ce qui suit ...<br /><br /><br/><br /> https://data.rennesmetropole.fr/api/records/1.0/search/?dataset=etat-du-trafic-en-temps-reel&q=rocade<br />... et vous devriez avoir en retour un texte de ce type : <br /> <br /> {"nhits": 63, "parameters": {"dataset": "etat-du-trafic-en-temps-reel", "q": "rocade", "rows": 10, "start": 0, "format": "json", "timezone": "UTC"}, "records": [{"datasetid": "etat-du-trafic-en-temps-reel", "recordid": "c8cd4fc9d2a9f1840170322c834f827fc100cc75", "fields": {"traveltimereliability": 100, "traveltime": 55, "predefinedlocationreference": "30023", "averagevehiclespeed": 91, "datetime": "2022-11-29T15:11:00+01:00", "gml_id": "v_rva_troncon_fcd.fid-722fb9f8_184c264cda5_453f", "trafficstatus": "freeFlow", "func_class": 666, "geo_point_2d": [48.14130932076887, -1.6781068587055177], '''(...)'''<br /><br />... mais que votre navigateur va quasi-immédiatement immédiatement reconnaître comme un format JSON, et afficher sous une forme plus structurée :<br /><br /><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Code JSON.png" data-sourceimage="https://www.wikidebrouillard.org/images/d/d7/Code_minimal_des_fonctions_reseau_Code_JSON.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Code_JSON.png" class="image" title="Exemple de réponse JSON"><img alt="Exemple de réponse JSON" src="/images/d/d7/Code_minimal_des_fonctions_reseau_Code_JSON.png" width="564" height="472" data-file-width="564" data-file-height="472" /></a></div></div></span></div><br /><br />Nous avons fait ici appel au serveur Open Data de la ville de Rennes, et avons fait une requête demandant l'état du trafic sur la rocade principale. Ce même serveur propose un tas d'autres données libres, et on peut trouver sur Internet une multitude d'autres serveurs "Open Data" en mode JSON.</nowiki>  , <nowiki>... bon, ok, mais mon D1 mini n'a pas de navigateur ?<br /><br /><br />C'est là où deux bibliothèques vont nous être utiles : <br /><br />*la première pour permettre à notre carte se connecter au serveur de données en mode sécurisé (car la plupart des sites web ont une adresse ''''https'''://www...') : '''WiFiClientSecure'''. Celle-ci est intégrée de base dans l'environnement de développement Arduino.<br />*la seconde pour décoder le format JSON et extraire facilement les éléments de réponse qui nous intéressent : '''ArduinoJson'''. Celle-ci doit être récupérée dans le gestionnaire de bibliothèques :<br/> <div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Biblio ArduinoJSON.png" data-sourceimage="https://www.wikidebrouillard.org/images/9/92/Code_minimal_des_fonctions_reseau_Biblio_ArduinoJSON.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Biblio_ArduinoJSON.png" class="image" title="Bibliothèque ArduinoJSON"><img alt="Bibliothèque ArduinoJSON" src="/images/9/92/Code_minimal_des_fonctions_reseau_Biblio_ArduinoJSON.png" width="752" height="107" data-file-width="752" data-file-height="107" /></a></div></div></span></div><br /><br />Les possibilités sont multiples, et l'exploitation des données JSON par les cartes D1 mini ou ESP32, peut prendre des formes très sympathiques : voir par exemple les réalisations "[https://www.wiki.lesfabriquesduponant.net/index.php?title=POCL_:_VOIR_DEMAIN Voir Demain]" et "[https://www.wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Hawaiiiii Hawaiiiii]" issues d'un hackathon organisé en décembre 2021 par Les Petits Débrouillards Grand Ouest et L'Edulab de l'Université de Rennes 2.<br /><br/><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Copie tableau mode img cause bug si tableau wiki.png" data-sourceimage="https://www.wikidebrouillard.org/images/9/94/Code_minimal_des_fonctions_reseau_Copie_tableau_mode_img_cause_bug_si_tableau_wiki.png"><span ><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Copie_tableau_mode_img_cause_bug_si_tableau_wiki.png" class="image" title="Fonctions JSON"><img alt="Fonctions JSON" src="/images/thumb/9/94/Code_minimal_des_fonctions_reseau_Copie_tableau_mode_img_cause_bug_si_tableau_wiki.png/800px-Code_minimal_des_fonctions_reseau_Copie_tableau_mode_img_cause_bug_si_tableau_wiki.png" width="800" height="191" data-file-width="1293" data-file-height="309" /></a></span></div><br /><br /><br />Pour connaître toutes les autres possibilités de cette bibliothèque, voir sa référence, [https://github.com/256dpi/arduino-mqtt ici].<br /><br /><br />'''Code minimal :'''<br /><br /><br />Bon, en fait, pas tout à fait "minimal" : <br /><br />*pour des raisons de clarté, nous avons défini deux fonctions : '''serverRequest''' pour générer la requête auprès du serveur et récupérer la réponse, et '''showJSONAnswer''' pour analyser la réponse (décodage des informations JSON).<br />*pour faciliter la réutilisation de ce code, plutôt que de tout traiter dans le setup(), nous activerons ces fonctions régulièrement, depuis la boucle loop(), ce qui est le mode de fonctionnement habituel.<br /><br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 5 : Données JSON</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 6 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 7 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 8 </span><br /><span class="lineno"> 9 </span><span class="c1">// Bibliothèques requises</span><br /><span class="lineno"> 10 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno"> 11 </span><br /><span class="lineno"> 12 </span><span class="cp">#include</span> <span class="cpf"><WiFiManager.h> // Gestion de la connexion Wi-Fi (recherche de points d'accès) </span><span class="cp"></span><br /><span class="lineno"> 13 </span><span class="cp">#include</span> <span class="cpf"><WiFiClientSecure.h> // Gestion de la connexion (HTTP) à un serveur de données</span><span class="cp"></span><br /><span class="lineno"> 14 </span><span class="cp">#include</span> <span class="cpf"><ArduinoJson.h> // Fonctions de décodage JSON des réponses du serveur. </span><span class="cp"></span><br /><span class="lineno"> 15 </span><br /><span class="lineno"> 16 </span><br /><span class="lineno"> 17 </span><br /><span class="lineno"> 18 </span><span class="c1">// Variables globales</span><br /><span class="lineno"> 19 </span><br /><span class="lineno"> 20 </span><span class="n">WiFiManager</span> <span class="n">myWiFiManager</span><span class="p">;</span> <span class="c1">// Création de mon instance de WiFiManager.</span><br /><span class="lineno"> 21 </span><span class="n">WiFiClientSecure</span> <span class="n">myWiFiClient</span><span class="p">;</span> <span class="c1">// Création de mon instance de client WiFi.</span><br /><span class="lineno"> 22 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// Nom de la carte en mode Point d'Accès.</span><br /><span class="lineno"> 23 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span> <span class="c1">// Mot de passe associé, 8 caractères au minimum.</span><br /><span class="lineno"> 24 </span><br /><span class="lineno"> 25 </span><span class="kr">char</span><span class="o">*</span> <span class="n">Data_HOST</span> <span class="o">=</span> <span class="s">"data.rennesmetropole.fr"</span><span class="p">;</span> <span class="c1">// Serveur web hébergeant les données qui nous intéressent</span><br /><span class="lineno"> 26 </span><span class="kr">int</span> <span class="n">Data_PORT</span> <span class="o">=</span> <span class="mi">443</span><span class="p">;</span> <span class="c1">// Port sur lequel envoyer la requête</span><br /><span class="lineno"> 27 </span><span class="kr">char</span><span class="o">*</span> <span class="n">Data_REQUEST</span> <span class="o">=</span> <span class="c1">// Requête (sur cet exemple : demande de l'état du trafic au point</span><br /><span class="lineno"> 28 </span> <span class="c1">// 31553, correspondant à la porte de Saint-Malo de la rocade de Rennes </span><br /><span class="lineno"> 29 </span> <span class="s">"/api/records/1.0/search/?dataset=etat-du-trafic-en-temps-reel&q=31553"</span><span class="p">;</span> <br /><span class="lineno"> 30 </span><br /><span class="lineno"> 31 </span><br /><span class="lineno"> 32 </span><span class="kr">const</span> <span class="kr">int</span> <span class="n">MAX_RESPONSE_SIZE</span> <span class="o">=</span> <span class="mi">6000</span> <span class="p">;</span> <span class="c1">// Taille max de la réponse attendue d'un serveur. A modifier en fonction du besoin.</span><br /><span class="lineno"> 33 </span><span class="kr">char</span> <span class="n">Data_Response</span><span class="p">[</span><span class="n">MAX_RESPONSE_SIZE</span><span class="p">]</span> <span class="p">;</span> <span class="c1">// Buffer qui contiendra la réponse du serveur.</span><br /><span class="lineno"> 34 </span> <br /><span class="lineno"> 35 </span><span class="cp">#define TEN_SECONDS 10000 </span><span class="c1">// On appelera le serveur de données toutes les 10000 ms = 10 secondes.</span><br /><span class="lineno"> 36 </span><span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myWakeUp</span> <span class="p">;</span> <span class="c1">// Timer mis en place pour limiter le nombre d'appels au serveur de données.</span><br /><span class="lineno"> 37 </span><br /><span class="lineno"> 38 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 39 </span><span class="cm"> * serverRequest() : Envoi requête HTTP au serveur et récupération de la réponse</span><br /><span class="lineno"> 40 </span><span class="cm"> * paramètres : </span><br /><span class="lineno"> 41 </span><span class="cm"> * - pHost : nom du serveur ; </span><br /><span class="lineno"> 42 </span><span class="cm"> * - pPort : port sur lequel est appelé le serveur ; </span><br /><span class="lineno"> 43 </span><span class="cm"> * - pRequest : requête au serveur.</span><br /><span class="lineno"> 44 </span><span class="cm"> * - pResponse : endroit où stocker la réponse</span><br /><span class="lineno"> 45 </span><span class="cm"> * - pRespMax : nombre max de caractères autorisés pour la réponse</span><br /><span class="lineno"> 46 </span><span class="cm"> * valeur de retour : </span><br /><span class="lineno"> 47 </span><span class="cm"> * -2 = réponse tronquée (trop de caractères) ;</span><br /><span class="lineno"> 48 </span><span class="cm"> * -1 = pas de réponse ;</span><br /><span class="lineno"> 49 </span><span class="cm"> * 0 = pas de connexion au serveur ;</span><br /><span class="lineno"> 50 </span><span class="cm"> * 1 = ok.</span><br /><span class="lineno"> 51 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 52 </span><span class="kr">int</span> <span class="nf">serverRequest</span><span class="p">(</span><span class="kr">char</span><span class="o">*</span> <span class="n">pHost</span><span class="p">,</span> <span class="kr">int</span> <span class="n">pPort</span><span class="p">,</span> <span class="kr">char</span><span class="o">*</span> <span class="n">pRequest</span><span class="p">,</span> <span class="kr">char</span> <span class="o">*</span><span class="n">pResponse</span><span class="p">,</span> <span class="kr">int</span> <span class="n">pRespMax</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 53 </span> <br /><span class="lineno"> 54 </span> <span class="kr">const</span> <span class="kr">int</span> <span class="n">API_TIMEOUT</span> <span class="o">=</span> <span class="mi">15000</span><span class="p">;</span> <span class="c1">// Pour être sûr de recevoir l'en-tête de la réponse client.</span><br /><span class="lineno"> 55 </span><br /><span class="lineno"> 56 </span> <span class="c1">// Comme la connexion est sécurisée (protocole HTTPS), il faudrait indiquer le certificat du site web.</span><br /><span class="lineno"> 57 </span> <span class="c1">// Pour simplifier, on va utiliser l'option magique ".setInsecure()", ce qui n'est pas important dans </span><br /><span class="lineno"> 58 </span> <span class="c1">// notre exemple, où les données échangées ne sont pas confidentielles.</span><br /><span class="lineno"> 59 </span><br /><span class="lineno"> 60 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="n">setInsecure</span><span class="p">();</span><br /><span class="lineno"> 61 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">setTimeout</span><span class="p">(</span><span class="n">API_TIMEOUT</span><span class="p">);</span><br /><span class="lineno"> 62 </span><br /><span class="lineno"> 63 </span> <span class="c1">// Connexion au serveur (on essaie 5 fois, avec un intervalle d'une seconde)</span><br /><span class="lineno"> 64 </span><br /><span class="lineno"> 65 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"--- Connexion au serveur ["</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">pHost</span><span class="p">)</span> <span class="o">+</span> <span class="s">"] "</span><span class="p">);</span> <br /><span class="lineno"> 66 </span> <span class="kr">int</span> <span class="n">nbTries</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><br /><span class="lineno"> 67 </span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">pHost</span><span class="p">,</span> <span class="n">pPort</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno"> 68 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"."</span><span class="p">);</span><br /><span class="lineno"> 69 </span> <span class="k">if</span> <span class="p">(</span><span class="o">++</span><span class="n">nbTries</span> <span class="o">></span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 70 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Connexion impossible :-("</span><span class="p">);</span><br /><span class="lineno"> 71 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">stop</span><span class="p">();</span><br /><span class="lineno"> 72 </span> <span class="k">return</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><br /><span class="lineno"> 73 </span> <span class="p">}</span><br /><span class="lineno"> 74 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span><br /><span class="lineno"> 75 </span> <span class="p">}</span> <br /><span class="lineno"> 76 </span><br /><span class="lineno"> 77 </span> <span class="c1">// Connecté à notre serveur ! --> Envoi de la requête URL. Il faut envoyer en fait une suite de lignes : </span><br /><span class="lineno"> 78 </span> <span class="c1">// "GET <notre requête> HTTP/1.1"</span><br /><span class="lineno"> 79 </span> <span class="c1">// "Host: <nom du serveur>"</span><br /><span class="lineno"> 80 </span> <span class="c1">// "Connection: close"</span><br /><span class="lineno"> 81 </span> <span class="c1">// <ligne vide></span><br /><span class="lineno"> 82 </span> <span class="c1">// Cet envoi se fait simplement grâce à la fonction println du client WiFi, similaire à celle que </span><br /><span class="lineno"> 83 </span> <span class="c1">// l'on utilise pour envoyer des données au moniteur série pour nos traces.</span><br /><span class="lineno"> 84 </span><br /><span class="lineno"> 85 </span> <span class="kr">String</span> <span class="n">myURL</span> <span class="o">=</span> <span class="kr">String</span><span class="p">(</span><span class="n">pRequest</span><span class="p">);</span><br /><span class="lineno"> 86 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">()</span> <span class="p">;</span> <br /><span class="lineno"> 87 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Connexion OK ! --> Envoi requête URL - "</span> <span class="o">+</span> <span class="n">myURL</span><span class="p">);</span><br /><span class="lineno"> 88 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"GET "</span> <span class="o">+</span> <span class="n">myURL</span> <span class="o">+</span> <span class="s">" HTTP/1.1"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 89 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Host: "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">pHost</span><span class="p">))</span> <span class="p">;</span><br /><span class="lineno"> 90 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connection: close"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 91 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">println</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno"> 92 </span> <br /><span class="lineno"> 93 </span> <span class="c1">// Attente de la réponse ....(on essaie 50 fois, avec un intervalle de 100ms, donc 5 secondes en tout)</span><br /><span class="lineno"> 94 </span> <br /><span class="lineno"> 95 </span> <span class="n">nbTries</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span><br /><span class="lineno"> 96 </span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">available</span><span class="p">()){</span><br /><span class="lineno"> 97 </span> <span class="k">if</span> <span class="p">(</span><span class="o">++</span><span class="n">nbTries</span> <span class="o">></span> <span class="mi">50</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 98 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Pas de réponse :-("</span><span class="p">);</span><br /><span class="lineno"> 99 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">stop</span><span class="p">();</span><br /><span class="lineno">100 </span> <span class="k">return</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><br /><span class="lineno">101 </span> <span class="p">}</span><br /><span class="lineno">102 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span><br /><span class="lineno">103 </span> <span class="p">}</span><br /><span class="lineno">104 </span><br /><span class="lineno">105 </span> <span class="c1">// Récupération de l'en-tête de la réponse (dont on ne fera rien)</span><br /><span class="lineno">106 </span> <span class="c1">// Cette entête est une suite de caractères, composant un certain nombre de lignes (ie se terminant par '\n'), </span><br /><span class="lineno">107 </span> <span class="c1">// la dernière ligne de l'entête n'est composée que du caractère "\r" (suivie du '\n') ;</span><br /><span class="lineno">108 </span> <br /><span class="lineno">109 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Réponse OK --> Récupération de l'en-tête ..."</span><span class="p">);</span><br /><span class="lineno">110 </span> <span class="kr">String</span> <span class="n">myLine</span> <span class="p">;</span><br /><span class="lineno">111 </span> <span class="k">while</span> <span class="p">(</span><span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">available</span><span class="p">())</span> <span class="p">{</span><br /><span class="lineno">112 </span> <span class="n">myLine</span> <span class="o">=</span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">readStringUntil</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span><br /><span class="lineno">113 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myLine</span> <span class="o">==</span> <span class="s">"</span><span class="se">\r</span><span class="s">"</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">114 </span> <span class="k">break</span><span class="p">;</span><br /><span class="lineno">115 </span> <span class="p">}</span><br /><span class="lineno">116 </span> <span class="p">}</span><br /><span class="lineno">117 </span><br /><span class="lineno">118 </span> <span class="c1">// Entête reçue ! On va alors recopier dans pResponse tous les caractères qui suivent </span><br /><span class="lineno">119 </span> <span class="c1">// en faisant attention à ne pas dépasser la taille du buffer.</span><br /><span class="lineno">120 </span><br /><span class="lineno">121 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Entête ok --> Récupération des données ..."</span><span class="p">);</span><br /><span class="lineno">122 </span> <span class="kr">int</span> <span class="n">myIndex</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span><br /><span class="lineno">123 </span> <span class="k">while</span> <span class="p">(</span><span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">available</span><span class="p">())</span> <span class="p">{</span><br /><span class="lineno">124 </span><br /><span class="lineno">125 </span> <span class="kr">char</span> <span class="n">myResp</span> <span class="o">=</span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">read</span><span class="p">();</span><br /><span class="lineno">126 </span> <span class="cm">/* Debug supprimé ... Serial.println(myResp) ; */</span><br /><span class="lineno">127 </span> <span class="n">pResponse</span><span class="p">[</span><span class="n">myIndex</span><span class="p">]</span> <span class="o">=</span> <span class="n">myResp</span><span class="p">;</span> <br /><span class="lineno">128 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myIndex</span><span class="o">++</span> <span class="o">>=</span> <span class="n">pRespMax</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">129 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"*** Réponse trop longue : "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">pRespMax</span><span class="p">)</span> <span class="o">+</span> <span class="s">"caractères, et ne peut pas être traitée"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">130 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">stop</span><span class="p">();</span><br /><span class="lineno">131 </span> <span class="k">return</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span><br /><span class="lineno">132 </span> <span class="p">}</span><br /><span class="lineno">133 </span> <span class="n">pResponse</span><span class="p">[</span><span class="n">myIndex</span><span class="p">]</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span> <span class="c1">// Vu sur forums : conseillé d'ajouté 'fin de chaîne' systématiquement</span><br /><span class="lineno">134 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">;</span> <span class="c1">// Et également d'ajouter ce tout petit délai pour éviter des plantages.</span><br /><span class="lineno">135 </span> <br /><span class="lineno">136 </span> <span class="p">}</span><br /><span class="lineno">137 </span><br /><span class="lineno">138 </span> <span class="c1">// Tout s'est bien passé ! On arrête notre client WiFi</span><br /><span class="lineno">139 </span><br /><span class="lineno">140 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Récupération des données ok ("</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">myIndex</span><span class="p">)</span> <span class="o">+</span> <span class="s">" caractères)."</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">141 </span> <span class="n">myWiFiClient</span><span class="p">.</span><span class="nf">stop</span><span class="p">();</span><br /><span class="lineno">142 </span> <span class="k">return</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">143 </span><br /><span class="lineno">144 </span><span class="p">}</span><br /><span class="lineno">145 </span><br /><span class="lineno">146 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">147 </span><span class="cm"> * showJSONAnswer : Décodage de la structure de données JSON</span><br /><span class="lineno">148 </span><span class="cm"> * Paramètres :</span><br /><span class="lineno">149 </span><span class="cm"> * - pResponse : endroit se trouve la réponse (au format JSON) du serveur</span><br /><span class="lineno">150 </span><span class="cm"> * - pRespMax : nombre max de caractères autorisés pour la réponse</span><br /><span class="lineno">151 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">152 </span><span class="kr">void</span> <span class="nf">showJSONAnswer</span><span class="p">(</span><span class="kr">char</span> <span class="o">*</span><span class="n">pResponse</span><span class="p">,</span> <span class="kr">int</span> <span class="n">pRespMax</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">153 </span><br /><span class="lineno">154 </span> <span class="c1">// Création de notre structure JSON</span><br /><span class="lineno">155 </span> <span class="c1">// Le besoin en mémoire (capacity) doit être vérifié sur l'assistant https://arduinojson.org/v6/assistant/</span><br /><span class="lineno">156 </span> <span class="c1">// 1) dans la première page de l'assistant, sélectionnez le processeur (par exemple "ESP8266"), le mode</span><br /><span class="lineno">157 </span> <span class="c1">// "Deserialize", et le type d'entrée "char*", puis cliquez sur le bouton "Netx:JSON"</span><br /><span class="lineno">158 </span> <span class="c1">// 2) Lancez votre requête depuis un navigateur. Dans notre exemple, tapez dans la barre d'adresse :</span><br /><span class="lineno">159 </span> <span class="c1">// "https://data.rennesmetropole.fr/api/records/1.0/search/?dataset=etat-du-trafic-en-temps-reel&q=31553"</span><br /><span class="lineno">160 </span> <span class="c1">// 3) Recopiez la réponse obtenue - sous sa forme "Données Brutes" du navigateur vers l'assistant</span><br /><span class="lineno">161 </span> <span class="c1">// 4) L'assistant va alors préconiser le bon objet à créer (StaticJsonDocument ou DynamicJsonDocument),</span><br /><span class="lineno">162 </span> <span class="c1">// ainsi que la taille à réserver. L'assistant va même proposer un exemple de programme exploitant toutes </span><br /><span class="lineno">163 </span> <span class="c1">// les informations de la structure JSON. </span><br /><span class="lineno">164 </span> <span class="c1">// Pour notre exemple, l'assistant a proposé la définition qui suit.</span><br /><span class="lineno">165 </span> <br /><span class="lineno">166 </span> <span class="n">StaticJsonDocument</span><span class="o"><</span><span class="mi">1024</span><span class="o">></span> <span class="n">doc</span><span class="p">;</span><br /><span class="lineno">167 </span><br /><span class="lineno">168 </span> <span class="c1">// Décodage de la réponse JSON.</span><br /><span class="lineno">169 </span> <span class="c1">// La fonction deserializeJson va transformer la réponse "texte" du serveur, en une structure de données recopiée</span><br /><span class="lineno">170 </span> <span class="c1">// dans la variable 'doc', où il sera ensuite facile d'aller chercher les informations souhaitées.</span><br /><span class="lineno">171 </span> <br /><span class="lineno">172 </span> <span class="n">DeserializationError</span> <span class="n">error</span> <span class="o">=</span> <span class="n">deserializeJson</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="n">pResponse</span><span class="p">,</span> <span class="n">pRespMax</span><span class="p">);</span><br /><span class="lineno">173 </span> <span class="k">if</span> <span class="p">(</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">174 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Décodage réponse JSON KO, code "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">error</span><span class="p">.</span><span class="n">f_str</span><span class="p">()))</span> <span class="p">;</span><br /><span class="lineno">175 </span> <span class="k">return</span><span class="p">;</span><br /><span class="lineno">176 </span> <span class="p">}</span><br /><span class="lineno">177 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Décodage réponse JSON OK !"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">178 </span><br /><span class="lineno">179 </span> <span class="c1">// Nous pouvons maintenant extraire facilement les informations qui nous intéressent,</span><br /><span class="lineno">180 </span> <span class="c1">// en n'oubliant pas le niveau de profondeur de la donnée au sein de la structure JSON. </span><br /><span class="lineno">181 </span> <span class="c1">// Ce niveau de profondeur est incrémenté par le nombre de '{' ou '[' rencontrés, et </span><br /><span class="lineno">182 </span> <span class="c1">// décrémenté lors de la rencontre des ']' et {}'. Sur notre exemple 'rocade de Rennes',</span><br /><span class="lineno">183 </span> <span class="c1">// cela donne ceci :</span><br /><span class="lineno">184 </span> <span class="c1">// +-----------------------------------------------------------------+</span><br /><span class="lineno">185 </span> <span class="c1">// | { | ... Entrée niveau 1</span><br /><span class="lineno">186 </span> <span class="c1">// | "nhits": 1, |</span><br /><span class="lineno">187 </span> <span class="c1">// | "parameters": { | ... Entrée niveau 2</span><br /><span class="lineno">188 </span> <span class="c1">// | "dataset": "etat-du-trafic-en-temps-reel", |</span><br /><span class="lineno">189 </span> <span class="c1">// | (...) |</span><br /><span class="lineno">190 </span> <span class="c1">// | }, | ... Retour niveau 1</span><br /><span class="lineno">191 </span> <span class="c1">// | "records": [ | ... Début d'un tableau : niveau 2</span><br /><span class="lineno">192 </span> <span class="c1">// | { | ... Entrée niveau 3</span><br /><span class="lineno">193 </span> <span class="c1">// | (...) | |</span><br /><span class="lineno">194 </span> <span class="c1">// | "fields": { | ... Entrée niveau 4</span><br /><span class="lineno">195 </span> <span class="c1">// | (...) |</span><br /><span class="lineno">196 </span> <span class="c1">// | "averagevehiclespeed": 88, |</span><br /><span class="lineno">197 </span> <span class="c1">// | (...) |</span><br /><span class="lineno">198 </span> <span class="c1">// | "datetime": "2022-11-30T11:57:00+01:00", |</span><br /><span class="lineno">199 </span> <span class="c1">// +-----------------------------------------------------------------+</span><br /><span class="lineno">200 </span> <span class="c1">// ... et donc :</span><br /><span class="lineno">201 </span> <span class="c1">// - (1er niveau) --------- doc["nhits"] donnera la valeur 1,</span><br /><span class="lineno">202 </span> <span class="c1">// - (2ème niveau) -------- doc["parameters"]["dataset"] donnera la valeur "etat-du-trafic-en-temps-reel"</span><br /><span class="lineno">203 </span> <span class="c1">// - (4ème niveau) -------- doc["records"][0]["fields"]["averagevehiclespeed"] donnera la valeur 87</span><br /><span class="lineno">204 </span><br /><span class="lineno">205 </span> <span class="c1">// Extraction et affichage sur le port série de trois valeurs</span><br /><span class="lineno">206 </span><br /><span class="lineno">207 </span> <span class="kr">String</span> <span class="n">myLocRef</span> <span class="o">=</span> <span class="kr">String</span><span class="p">(</span><span class="n">doc</span><span class="p">[</span><span class="s">"records"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"fields"</span><span class="p">][</span><span class="s">"predefinedlocationreference"</span><span class="p">])</span> <span class="p">;</span><br /><span class="lineno">208 </span> <span class="kr">String</span> <span class="n">myTime</span> <span class="o">=</span> <span class="kr">String</span><span class="p">(</span><span class="n">doc</span><span class="p">[</span><span class="s">"records"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"fields"</span><span class="p">][</span><span class="s">"datetime"</span><span class="p">])</span> <span class="p">;</span><br /><span class="lineno">209 </span> <span class="kr">int</span> <span class="n">mySpeed</span> <span class="o">=</span> <span class="n">doc</span><span class="p">[</span><span class="s">"records"</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">"fields"</span><span class="p">][</span><span class="s">"averagevehiclespeed"</span><span class="p">]</span> <span class="p">;</span><br /><span class="lineno">210 </span> <br /><span class="lineno">211 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Vitesse au point "</span> <span class="o">+</span> <span class="n">myLocRef</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">212 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"le "</span> <span class="o">+</span> <span class="n">myTime</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">myTime</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">7</span><span class="p">)</span> <span class="o">+</span> <span class="s">"/"</span> <span class="o">+</span> <span class="n">myTime</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">213 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"à "</span> <span class="o">+</span> <span class="n">myTime</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span><span class="mi">13</span><span class="p">)</span> <span class="o">+</span> <span class="s">"h"</span> <span class="o">+</span> <span class="n">myTime</span><span class="p">.</span><span class="n">substring</span><span class="p">(</span><span class="mi">14</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="s">" "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">214 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">" : "</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">mySpeed</span><span class="p">)</span> <span class="o">+</span> <span class="s">" km/h."</span><span class="p">)</span> <span class="p">;</span> <br /><span class="lineno">215 </span><br /><span class="lineno">216 </span><span class="p">}</span><br /><span class="lineno">217 </span><br /><span class="lineno">218 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">219 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno">220 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">221 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">222 </span><br /><span class="lineno">223 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno">224 </span><br /><span class="lineno">225 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">226 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">227 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">228 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"-----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">229 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple extraction JSON"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">230 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"-----------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">231 </span><br /><span class="lineno">232 </span> <span class="c1">// Tentative de connexion au Wi-Fi. Si la carte n'a pas réussi se connecter au dernier Point d'Accès connu,</span><br /><span class="lineno">233 </span> <span class="c1">// alors elle va se positionner en mode Point d'Accès, demandera sur l'adresse 192.168.4.1 quel nouveau</span><br /><span class="lineno">234 </span> <span class="c1">// Point d'Accès choisir. Par défaut, on restera bloqué tant que l'utilisateur n'aura pas fait de choix.</span><br /><span class="lineno">235 </span> <br /><span class="lineno">236 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion au Wi-Fi ..."</span><span class="p">);</span><br /><span class="lineno">237 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myWiFiManager</span><span class="p">.</span><span class="n">autoConnect</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span> <span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">238 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté ! Adresse IP : "</span><span class="p">);</span><br /><span class="lineno">239 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">240 </span> <span class="p">}</span><br /><span class="lineno">241 </span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">242 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion Wi-Fi KO :-("</span><span class="p">);</span> <br /><span class="lineno">243 </span> <span class="p">}</span><br /><span class="lineno">244 </span><br /><span class="lineno">245 </span> <span class="c1">// Initialisation du timer qui sera testé dans loop() - pour faire appel au serveur seulement toutes les 10 secondes </span><br /><span class="lineno">246 </span> <span class="c1">// millis() est une fonction système donnant le nombre de ms depuis le lancement ou la réinitialisation de la carte.</span><br /><span class="lineno">247 </span><br /><span class="lineno">248 </span> <span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myWakeUp</span> <span class="o">=</span> <span class="nf">millis</span><span class="p">()</span> <span class="o">+</span> <span class="n">TEN_SECONDS</span> <span class="p">;</span><br /><span class="lineno">249 </span><br /><span class="lineno">250 </span><span class="p">}</span><br /><span class="lineno">251 </span><br /><span class="lineno">252 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">253 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">254 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">255 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">256 </span><br /><span class="lineno">257 </span> <span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myNow</span> <span class="o">=</span> <span class="nf">millis</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno">258 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myNow</span> <span class="o">>=</span> <span class="n">myWakeUp</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">259 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Wake Up ! Nouvelle demande au serveur ..."</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">260 </span> <span class="k">if</span> <span class="p">(</span><span class="n">serverRequest</span><span class="p">(</span><span class="n">Data_HOST</span><span class="p">,</span> <span class="n">Data_PORT</span><span class="p">,</span> <span class="n">Data_REQUEST</span><span class="p">,</span> <span class="n">Data_Response</span><span class="p">,</span> <span class="n">MAX_RESPONSE_SIZE</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">261 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Réponse reçue du serveur, lancement analyse JSON ..."</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">262 </span> <span class="n">showJSONAnswer</span><span class="p">(</span><span class="n">Data_Response</span><span class="p">,</span> <span class="n">MAX_RESPONSE_SIZE</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">263 </span> <span class="p">}</span><br /><span class="lineno">264 </span> <span class="n">myWakeUp</span> <span class="o">=</span> <span class="n">myNow</span> <span class="o">+</span> <span class="n">TEN_SECONDS</span> <span class="p">;</span> <br /><span class="lineno">265 </span> <span class="p">}</span><br /><span class="lineno">266 </span><br /><span class="lineno">267 </span><span class="p">}</span><br /></pre></div><br /><br /><br/></nowiki>  
MQTT (Message Queuing Telemetry Transport) permet l'envoi et la réception de messages de petite taille. MQTT s'appuie sur un "broker MQTT", serveur externe, qui va recevoir les données d'un système, et les redistribuer à d'autres systèmes. MQTT est souvent utilisé pour collecter des données en provenance de petits capteurs (par exemple, capteurs de température dans un système domotique, capteurs de pollution au niveau d'une région voire d'un pays), car il a aussi comme avantage d'être peu consommateur de ressources. MQTT est basé sur un principe d'abonnement : le système émetteur doit préciser à quel sujet ("topic") se rattache son message, et tous les systèmes qui s'étaient préalablement abonnés à ce "topic" recevront alors le message. Principe proche de Twitter ou Instagram et leurs "hashtags", donc. On peut implémenter son propre broker MQTT (le code est libre d'usage), ou s'appuyer sur des brokers gérés par des associations ou des entreprises. Dans l'exemple ci-après, on utilise le broker des Petits Débrouillards, à utiliser avec modération. Mais ce n'est pas l'objet du tutoriel, nous nous intéressons ici uniquement à la partie "client", c'est à dire ce qu'il faut mettre en œuvre sur nos cartes D1 mini ou ESP.  +, <nowiki>Il existe plusieurs bibliothèques Arduino permettent de gérer des messages MQTT. Pour notre part, on utilise celle-ci (à aller chercher dans le gestionnaire de bibliothèque) :<br /><br/><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Code minimal des fonctions reseau Biblio MQTT.png" data-sourceimage="https://www.wikidebrouillard.org/images/d/d7/Code_minimal_des_fonctions_reseau_Biblio_MQTT.png"><span ><a href="/wiki/Fichier:Code_minimal_des_fonctions_reseau_Biblio_MQTT.png" class="image" title="Bibliothèque MQTT"><img alt="Bibliothèque MQTT" src="/images/d/d7/Code_minimal_des_fonctions_reseau_Biblio_MQTT.png" width="945" height="118" data-file-width="945" data-file-height="118" /></a></span></div><br /><br /><br /><br /><br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Gestion du MQTT<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include <MQTT.h><br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left">MQTTClient myMQTTClient;<br /></td></tr><tr><br /><td rowspan="5" valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup (ou le loop)<br /></td><td valign="middle" bgcolor="#999999" align="center">Initialisation<br /></td><td valign="middle" align="left">myMQTTClient.begin(@IP Broker, Port Broker, Client Wifi) ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Se préparer à la réception de messages<br /></td><td valign="middle" align="left">myMQTTClient.onMessage(référence de la fonction à appeler sur réception d'un message) ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Connexion au broker MQTT<br /></td><td>myMQTTClient.connect(ID unique)<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Souscrire à un "topic" particulier<br /></td><td>myMQTTClient.subscribe(topic) ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Publier un message<br /></td><td>myMQTTClient.publish(topic, message) ;<br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Activation régulière<br /></td><td>obligatoire : myMQTTClient.loop() ;<br /></td></tr></table><br /><br />Pour connaître toutes les autres possibilités de cette bibliothèque, voir sa référence, [https://github.com/256dpi/arduino-mqtt ici].<br /><br />'''Code minimal :'''<br /><br /><br /><br />Dans cet exemple, notre carte est à la fois émettrice (elle va envoyer des "Pings") et réceptrice sur le topic "PING_PONG". Elle va aussi répondre "Pong" sur réception d'un "Ping". En règle générale, dans les vraies applications, une carte est souvent émettrice (envoi de données d'un capteur de pollution, par exemple), et il peut y avoir une seule autre carte chargée d'exploiter les données remontées par plusieurs capteurs.<br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cm">/* =========================================================================================================</span><br /><span class="lineno"> 2 </span><span class="cm"> * </span><br /><span class="lineno"> 3 </span><span class="cm"> * CODE MINIMAL RESEAU - ETAPE 6 : Messages MQTT</span><br /><span class="lineno"> 4 </span><span class="cm"> * </span><br /><span class="lineno"> 5 </span><span class="cm"> * ---------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 6 </span><span class="cm"> * Les petits Débrouillards - décembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno"> 7 </span><span class="cm"> * ========================================================================================================= */</span><br /><span class="lineno"> 8 </span><br /><span class="lineno"> 9 </span><span class="c1">// Bibliothèques requises</span><br /><span class="lineno"> 10 </span><span class="c1">// ATTENTION AUX MAJUSCULES & MINUSCULES ! Sinon d'autres bibliothèques, plus ou moins valides, seraient utilisées.</span><br /><span class="lineno"> 11 </span><br /><span class="lineno"> 12 </span><span class="cp">#include</span> <span class="cpf"><WiFiManager.h> // Gestion de la connexion Wi-Fi (recherche de points d'accès) </span><span class="cp"></span><br /><span class="lineno"> 13 </span><span class="cp">#include</span> <span class="cpf"><WiFiClientSecure.h> // Gestion de la connexion à un serveur de données</span><span class="cp"></span><br /><span class="lineno"> 14 </span><span class="cp">#include</span> <span class="cpf"><MQTT.h> // Gestion des requêtes MQTT</span><span class="cp"></span><br /><span class="lineno"> 15 </span><br /><span class="lineno"> 16 </span><br /><span class="lineno"> 17 </span><span class="c1">// Variables globales</span><br /><span class="lineno"> 18 </span><br /><span class="lineno"> 19 </span><span class="n">WiFiManager</span> <span class="n">myWiFiManager</span><span class="p">;</span> <span class="c1">// Manager Wi-Fi</span><br /><span class="lineno"> 20 </span><span class="nf">WiFiClient</span> <span class="n">myWiFiClient</span> <span class="p">;</span> <span class="c1">// Client WiFi</span><br /><span class="lineno"> 21 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySSID</span> <span class="o">=</span> <span class="s">"AP_PetitDeb"</span> <span class="p">;</span> <span class="c1">// Nom de la carte en mode Point d'Accès.</span><br /><span class="lineno"> 22 </span><span class="kr">const</span> <span class="kr">char</span><span class="o">*</span> <span class="n">mySecKey</span> <span class="o">=</span> <span class="s">"PSWD1234"</span> <span class="p">;</span> <span class="c1">// Mot de passe associé, 8 caractères au minimum.</span><br /><span class="lineno"> 23 </span><br /><span class="lineno"> 24 </span><br /><span class="lineno"> 25 </span><span class="cp">#define MQTT_BROKER_IP "debrouillards.ddns.net" </span><span class="c1">// Serveur sur lequel est installé le Broker MQTT.</span><br /><span class="lineno"> 26 </span><span class="cp">#define MQTT_BROKER_PORT 1883 </span><span class="c1">// Port sur lequel écoute le broker MQTT</span><br /><span class="lineno"> 27 </span><br /><span class="lineno"> 28 </span><span class="kr">char</span> <span class="n">MY_MQTT_ID</span><span class="p">[</span><span class="mi">20</span><span class="p">]</span> <span class="p">;</span> <span class="c1">// Id unique de notre objet, basé sur ESP.getChipId()</span><br /><span class="lineno"> 29 </span><span class="kr">const</span> <span class="kr">char</span> <span class="n">MY_MQTT_TOPIC</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"PING_PONG"</span> <span class="p">;</span> <span class="c1">// Nom de notre topic (sujet) MQTT</span><br /><span class="lineno"> 30 </span><br /><span class="lineno"> 31 </span><span class="n">MQTTClient</span> <span class="n">myMQTTClient</span><span class="p">;</span> <span class="c1">// Client MQTT</span><br /><span class="lineno"> 32 </span><br /><span class="lineno"> 33 </span><span class="kr">bool</span> <span class="n">IHaveToAnswer</span> <span class="o">=</span> <span class="kr">false</span> <span class="p">;</span> <span class="c1">// Passe à 'true' si on doit répondre.</span><br /><span class="lineno"> 34 </span><br /><span class="lineno"> 35 </span><span class="cp">#define TEN_SECONDS 10000 </span><span class="c1">// On enverra un message au broker toutes les 10000 ms = 10 secondes.</span><br /><span class="lineno"> 36 </span><span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myWakeUp</span> <span class="p">;</span> <span class="c1">// Timer mis en place pour limiter le nombre d'envois au broker.</span><br /><span class="lineno"> 37 </span><br /><span class="lineno"> 38 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 39 </span><span class="cm"> * MQTT_Received : réception d'un message MQTT</span><br /><span class="lineno"> 40 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 41 </span><span class="kr">void</span> <span class="nf">MQTT_Received</span><span class="p">(</span><span class="kr">String</span> <span class="o">&</span><span class="n">topic</span><span class="p">,</span> <span class="kr">String</span> <span class="o">&</span><span class="n">payload</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 42 </span><br /><span class="lineno"> 43 </span> <span class="kr">char</span> <span class="n">myTrace</span><span class="p">[</span><span class="mi">80</span><span class="p">]</span> <span class="p">;</span><br /><span class="lineno"> 44 </span><br /><span class="lineno"> 45 </span> <span class="n">sprintf</span><span class="p">(</span><span class="n">myTrace</span><span class="p">,</span> <span class="s">"Réception sur le topic </span><span class="se">\"</span><span class="s">%s</span><span class="se">\"</span><span class="s"> du message MQTT </span><span class="se">\"</span><span class="s">%s</span><span class="se">\"</span><span class="s">."</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 46 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="n">myTrace</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 47 </span><br /><span class="lineno"> 48 </span> <span class="c1">// Comme indiqué dans la documentation, il ne faut pas renvoyer de messages dans cette fonction,</span><br /><span class="lineno"> 49 </span> <span class="c1">// ça risque de mal se passer (blocages, ...). Si on souhaite répondre au message reçu, il vaut</span><br /><span class="lineno"> 50 </span> <span class="c1">// mieux mettre à jour une variable globale, qui sera vérifiée dans la partie loop().</span><br /><span class="lineno"> 51 </span><br /><span class="lineno"> 52 </span> <span class="k">if</span> <span class="p">(</span><span class="n">payload</span> <span class="o">==</span> <span class="kr">String</span><span class="p">(</span><span class="s">"Ping"</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno"> 53 </span> <span class="n">IHaveToAnswer</span> <span class="o">=</span> <span class="kr">true</span> <span class="p">;</span><br /><span class="lineno"> 54 </span> <span class="p">}</span><br /><span class="lineno"> 55 </span> <br /><span class="lineno"> 56 </span><span class="p">}</span><br /><span class="lineno"> 57 </span><br /><span class="lineno"> 58 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 59 </span><span class="cm"> * MQTT_Connect : Connexion - ou reconnexion - au broker MQTT.</span><br /><span class="lineno"> 60 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 61 </span><span class="kr">void</span> <span class="nf">MQTT_Connect</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 62 </span><br /><span class="lineno"> 63 </span> <span class="c1">// Vérification WiFi OK.</span><br /><span class="lineno"> 64 </span> <br /><span class="lineno"> 65 </span> <span class="kr">int</span> <span class="n">nbTries</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span><br /><span class="lineno"> 66 </span> <span class="k">while</span> <span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="n">status</span><span class="p">()</span> <span class="o">!=</span> <span class="n">WL_CONNECTED</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 67 </span> <span class="k">if</span> <span class="p">(</span><span class="n">nbTries</span><span class="o">++</span> <span class="o">></span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 68 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion WiFi KO :-("</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 69 </span> <span class="k">return</span> <span class="p">;</span><br /><span class="lineno"> 70 </span> <span class="p">}</span><br /><span class="lineno"> 71 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span><br /><span class="lineno"> 72 </span> <span class="p">}</span><br /><span class="lineno"> 73 </span><br /><span class="lineno"> 74 </span> <span class="c1">// Connexion au broker.</span><br /><span class="lineno"> 75 </span> <br /><span class="lineno"> 76 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Connexion MQTT, Id unique </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">MY_MQTT_ID</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s"> "</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 77 </span> <span class="n">nbTries</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">;</span><br /><span class="lineno"> 78 </span> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">myMQTTClient</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="n">MY_MQTT_ID</span><span class="p">))</span> <span class="p">{</span> <br /><span class="lineno"> 79 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"."</span><span class="p">)</span> <span class="p">;</span> <br /><span class="lineno"> 80 </span> <span class="k">if</span> <span class="p">(</span><span class="n">nbTries</span><span class="o">++</span> <span class="o">></span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno"> 81 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">" KO :-("</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno"> 82 </span> <span class="k">return</span> <span class="p">;</span><br /><span class="lineno"> 83 </span> <span class="p">}</span><br /><span class="lineno"> 84 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span><br /><span class="lineno"> 85 </span> <span class="p">}</span><br /><span class="lineno"> 86 </span><br /><span class="lineno"> 87 </span> <span class="c1">// Abonnement au topic.</span><br /><span class="lineno"> 88 </span> <br /><span class="lineno"> 89 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"--- Abonnement au sujet </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">"</span><span class="p">)</span> <span class="p">;</span> <br /><span class="lineno"> 90 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">);</span> <br /><span class="lineno"> 91 </span> <br /><span class="lineno"> 92 </span><span class="p">}</span><br /><span class="lineno"> 93 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------</span><br /><span class="lineno"> 94 </span><span class="cm"> * SETUP : Initialisation</span><br /><span class="lineno"> 95 </span><span class="cm"> * -------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno"> 96 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno"> 97 </span><br /><span class="lineno"> 98 </span> <span class="c1">// Initialisation de la liaison série, affichage 1er message</span><br /><span class="lineno"> 99 </span><br /><span class="lineno">100 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span><br /><span class="lineno">101 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">102 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <br /><span class="lineno">103 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"---------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">104 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Exemple messages MQTT"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">105 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"---------------------"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">106 </span><br /><span class="lineno">107 </span> <span class="c1">// Tentative de connexion au Wi-Fi. Si la carte n'a pas réussi se connecter au dernier Point d'Accès connu,</span><br /><span class="lineno">108 </span> <span class="c1">// alors elle va se positionner en mode Point d'Accès, demandera sur l'adresse 192.168.4.1 quel nouveau</span><br /><span class="lineno">109 </span> <span class="c1">// Point d'Accès choisir. Par défaut, on restera bloqué tant que l'utilisateur n'aura pas fait de choix.</span><br /><span class="lineno">110 </span> <br /><span class="lineno">111 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion au Wi-Fi ..."</span><span class="p">);</span><br /><span class="lineno">112 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myWiFiManager</span><span class="p">.</span><span class="n">autoConnect</span><span class="p">(</span><span class="n">mySSID</span><span class="p">,</span> <span class="n">mySecKey</span><span class="p">))</span> <span class="p">{</span><br /><span class="lineno">113 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">();</span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Connecté ! Adresse IP : "</span><span class="p">);</span><br /><span class="lineno">114 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="nf">WiFi</span><span class="p">.</span><span class="nf">localIP</span><span class="p">());</span><br /><span class="lineno">115 </span> <span class="p">}</span><br /><span class="lineno">116 </span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">117 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Connexion Wi-Fi KO :-("</span><span class="p">);</span> <br /><span class="lineno">118 </span> <span class="p">}</span><br /><span class="lineno">119 </span><br /><span class="lineno">120 </span> <span class="c1">// Initialisation du MQTT</span><br /><span class="lineno">121 </span><br /><span class="lineno">122 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Initialisation MQTT ..."</span><span class="p">);</span><br /><span class="lineno">123 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="n">MQTT_BROKER_IP</span><span class="p">,</span> <span class="n">MQTT_BROKER_PORT</span><span class="p">,</span> <span class="n">myWiFiClient</span><span class="p">);</span> <span class="c1">// lancement du client MQTT ...</span><br /><span class="lineno">124 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="n">onMessage</span><span class="p">(</span><span class="n">MQTT_Received</span><span class="p">);</span> <span class="c1">// ... qui appelera la fonction MQTT_Received si un message est reçu.</span><br /><span class="lineno">125 </span><br /><span class="lineno">126 </span> <span class="n">strncpy</span><span class="p">(</span><span class="n">MY_MQTT_ID</span><span class="p">,</span> <span class="kr">String</span><span class="p">(</span><span class="n">ESP</span><span class="p">.</span><span class="n">getChipId</span><span class="p">()).</span><span class="n">c_str</span><span class="p">(),</span><span class="kr">sizeof</span><span class="p">(</span><span class="n">MY_MQTT_ID</span><span class="p">))</span> <span class="p">;</span> <span class="c1">// Fabrication de mon ID unique, sur la base du n° de puce</span><br /><span class="lineno">127 </span> <span class="n">MY_MQTT_ID</span><span class="p">[</span><span class="kr">sizeof</span><span class="p">(</span><span class="n">MY_MQTT_ID</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="sc">'\0'</span> <span class="p">;</span><br /><span class="lineno">128 </span><br /><span class="lineno">129 </span> <span class="c1">// Connexion au broker </span><br /><span class="lineno">130 </span><br /><span class="lineno">131 </span> <span class="n">MQTT_Connect</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno">132 </span> <br /><span class="lineno">133 </span> <span class="c1">// Initialisation du timer qui sera testé dans loop() - pour faire appel au serveur seulement toutes les 10 secondes </span><br /><span class="lineno">134 </span> <span class="c1">// millis() est une fonction système donnant le nombre de ms depuis le lancement ou la réinitialisation de la carte.</span><br /><span class="lineno">135 </span><br /><span class="lineno">136 </span> <span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myWakeUp</span> <span class="o">=</span> <span class="nf">millis</span><span class="p">()</span> <span class="o">+</span> <span class="n">TEN_SECONDS</span> <span class="p">;</span><br /><span class="lineno">137 </span><br /><span class="lineno">138 </span><span class="p">}</span><br /><span class="lineno">139 </span><br /><span class="lineno">140 </span><span class="cm">/* --------------------------------------------------------------------------------------------------------------</span><br /><span class="lineno">141 </span><span class="cm"> * LOOP : fonction appelée régulièrement par le système</span><br /><span class="lineno">142 </span><span class="cm"> * ------------------------------------------------------------------------------------------------------------- */</span><br /><span class="lineno">143 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span> <br /><span class="lineno">144 </span><br /><span class="lineno">145 </span> <span class="c1">// Réactivation du client MQTT</span><br /><span class="lineno">146 </span><br /><span class="lineno">147 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="nb">loop</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno">148 </span> <span class="nf">delay</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">;</span> <span class="c1">// Problèmes de stabilité Wi-Fi ? (Cf. doc MQTT)</span><br /><span class="lineno">149 </span><br /><span class="lineno">150 </span> <span class="c1">// Reconnexion au broker MQTT si nécessaire ...</span><br /><span class="lineno">151 </span><br /><span class="lineno">152 </span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">myMQTTClient</span><span class="p">.</span><span class="nf">connected</span><span class="p">())</span> <span class="p">{</span><br /><span class="lineno">153 </span> <span class="n">MQTT_Connect</span><span class="p">();</span><br /><span class="lineno">154 </span> <span class="p">}</span><br /><span class="lineno">155 </span><br /><span class="lineno">156 </span> <span class="c1">// Si on a précédemment reçu un 'Ping', on va répondre 'Pong'</span><br /><span class="lineno">157 </span><br /><span class="lineno">158 </span> <span class="k">if</span> <span class="p">(</span><span class="n">IHaveToAnswer</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">159 </span> <span class="n">IHaveToAnswer</span> <span class="o">=</span> <span class="kr">false</span> <span class="p">;</span><br /><span class="lineno">160 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Envoi de la réponse </span><span class="se">\"</span><span class="s">Pong</span><span class="se">\"</span><span class="s"> sur le topic </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">."</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">161 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">,</span> <span class="s">"Pong"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">162 </span> <span class="p">}</span><br /><span class="lineno">163 </span><br /><span class="lineno">164 </span> <span class="c1">// Envoi d'un message toutes les 10 secondew.</span><br /><span class="lineno">165 </span> <br /><span class="lineno">166 </span> <span class="kr">unsigned</span> <span class="kr">long</span> <span class="n">myNow</span> <span class="o">=</span> <span class="nf">millis</span><span class="p">()</span> <span class="p">;</span><br /><span class="lineno">167 </span> <span class="k">if</span> <span class="p">(</span><span class="n">myNow</span> <span class="o">>=</span> <span class="n">myWakeUp</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">168 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="s">"Wake Up ! envoi du message </span><span class="se">\"</span><span class="s">Ping</span><span class="se">\"</span><span class="s"> sur le topic </span><span class="se">\"</span><span class="s">"</span> <span class="o">+</span> <span class="kr">String</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\"</span><span class="s">."</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">169 </span> <span class="n">myMQTTClient</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="n">MY_MQTT_TOPIC</span><span class="p">,</span> <span class="s">"Ping"</span><span class="p">)</span> <span class="p">;</span><br /><span class="lineno">170 </span> <span class="n">myWakeUp</span> <span class="o">=</span> <span class="n">myNow</span> <span class="o">+</span> <span class="n">TEN_SECONDS</span> <span class="p">;</span> <br /><span class="lineno">171 </span> <span class="p">}</span><br /><span class="lineno">172 </span><br /><span class="lineno">173 </span><br /><span class="lineno">174 </span><span class="p">}</span><br /></pre></div></nowiki>  , ... Si vous avez suivi tous les épisodes ... :-) Les exemples de code "minimal" fournis peuvent servir de base pour vos futures réalisations, ou pour gagner un temps précieux pendant un hackathon. Tous les codes sont regroupés dans un dossier compressé, accessible dans la rubrique "Fichiers" en début de cette page. Pour aller plus loin, n'hésitez pas à copier ces programmes minimaux, et à les modifier en douceur pour obtenir autre chose que des traces dans le moniteur série Arduino. Juste quelques idées ... <br/> *Sur la base du code de l'étape 4 (serveur web), et d'un [https://www.wikidebrouillard.org/wiki/Item:Servomoteur servomoteur], fabriquer un coffre secret qui ne s'ouvre que lorsque son/sa propriétaire tape un code sur son téléphone ; *Sur la base du code de l'étape 5 (JSON) et d'un [https://www.wikidebrouillard.org/wiki/Item:Ruban_de_Led_-_WS2812B ruban de leds], faire un thermomètre affichant la température de votre ville préférée. Il y a de nombreux sites web proposant gratuitement (si on n'abuse pas) des informations météo en mode JSONs, par exemple : **[https://api.tutiempo.net/fr/json.html TuTiempo.net] **[https://openweathermap.org/api OpenWeather] **[https://prevision-meteo.ch/services Previsionsmeteo.ch] *Sur la base du code de l'étape 6 (MQTT), et d'un [https://www.wikidebrouillard.org/wiki/Item:Capteur_de_temp%C3%A9rature_et_d%27humidit%C3%A9_DHT11 capteur de température et d'humidité], ... ah, on me glisse dans l’oreillette que [https://www.wikidebrouillard.org/wiki/Envoyer_des_donn%C3%A9es_sur_le_WEB_gr%C3%A2ce_%C3%A0_MQTT ça existe déjà sur le Wikidébrouillard] ! (avec une autre bibliothèque MQTT). ... Ou bien alors, avec deux D1 Mini, deux [https://www.wikidebrouillard.org/wiki/Item:Bouton_poussoir boutons poussoirs] et deux [https://www.wikidebrouillard.org/wiki/Item:Ruban_de_Led_-_WS2812B rubans de leds], faire une version "jeu à distance" du célèbre [https://www.wikidebrouillard.org/wiki/D1-Pong D1-Pong] !  +
Avec Arduino nous réalisons des montages qui utilisent 4 types de composants : * des capteurs, * des actionneurs, * des cartes électroniques programmables, * des éléments structurant les circuits (breadbord, cables, autres composant électroniques, etc.). Un capteur capte des informations qui sont utilisées par le programme de la carte pour déclencher des actions : * illuminer, * bouger, * chauffer, * colorer, * lancer une musique, * ... Les actionneurs sont donc très divers et ont leurs mode de fonctionnement. Généralement, il s'agit de leurs envoyer une information ou une quantité de courant. <br/>  +, Pour utiliser une LED, il faut : * des cables duponts, * une breadboard, * une résistance, * une LED  +
Il existe deux catégories de capteurs : * Les capteurs Analogiques * Les capteurs Numériques Les capteurs Analogiques : Ils renvoient du courant à l'Arduino. Ils sont reliés aux broches Analogiques de la carte qui sont capables de transformer le courant en information (un signal numérique). Les capteurs Numériques : Il renvoient un 1 ou un 0 à l'Arduino <br/>  +, <nowiki>Un bouton poussoir est un composant qui ouvre (le courant ne passe plus) ou ferme (le courant passe) un circuit électrique.<br /><br /><br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">Bouton poussoir<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left"><br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left"><br /></td></tr><tr><br /><td valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Démarrage de l’objet<br /></td><td valign="middle" align="left">pinMode(num_broche,INPUT_PULLUP) ;<br /></td></tr><tr><br /><td valign="middle" height="41" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Utilisation<br /></td><td valign="middle" align="left">int val_bouton = digitalRead(num_broche);<br/><br /></td></tr></table><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="c1">////////////////////////</span><br /><span class="lineno"> 2 </span><span class="c1">// *Code Minimal* //</span><br /><span class="lineno"> 3 </span><span class="c1">// -Le Bouton- //</span><br /><span class="lineno"> 4 </span><span class="c1">////////////////////////</span><br /><span class="lineno"> 5 </span><span class="cm">/*Les programmes "Code Minimal" des petits débrouillards sont conçu pour </span><br /><span class="lineno"> 6 </span><span class="cm">permettre la prise en main rapide d'un composant électronique.</span><br /><span class="lineno"> 7 </span><span class="cm">A retrouver sur https://www.wikidebrouillard.org</span><br /><span class="lineno"> 8 </span><br /><span class="lineno"> 9 </span><span class="cm">-Le Bouton-</span><br /><span class="lineno">10 </span><br /><span class="lineno">11 </span><span class="cm">Matériel :</span><br /><span class="lineno">12 </span><span class="cm">- un D1 mini</span><br /><span class="lineno">13 </span><span class="cm">- un bouton</span><br /><span class="lineno">14 </span><br /><span class="lineno">15 </span><span class="cm">le bouton branché à la broche D3 du D1 mini </span><br /><span class="lineno">16 </span><span class="cm">car la broche D3 possède une résistance de pullup interne</span><br /><span class="lineno">17 </span><span class="cm">Une résistance de pullup c'est lorsque la broche est branchée a une résistance reliée au niveau haut de la carte(HIGH)</span><br /><span class="lineno">18 </span><span class="cm">dans le D1 mini il y a donc une résistance de 10Kohm qui relie la broche D3 au +3,3V</span><br /><span class="lineno">19 </span><span class="cm"> D3---^/\/v---+3V3</span><br /><span class="lineno">20 </span><span class="cm"> </span><br /><span class="lineno">21 </span><span class="cm"> ___</span><br /><span class="lineno">22 </span><span class="cm"> / ___ \</span><br /><span class="lineno">23 </span><span class="cm">|_| | |</span><br /><span class="lineno">24 </span><span class="cm"> /_/ </span><br /><span class="lineno">25 </span><span class="cm"> _ ___ _ </span><br /><span class="lineno">26 </span><span class="cm"> |_| |___|_| |_</span><br /><span class="lineno">27 </span><span class="cm"> ___|_ _|</span><br /><span class="lineno">28 </span><span class="cm"> |___| |_|</span><br /><span class="lineno">29 </span><span class="cm">Les petits Débrouillards - décembre 2020 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno">30 </span><span class="cm">*/</span><br /><span class="lineno">31 </span><br /><span class="lineno">32 </span><span class="c1">// Déclaration des variables constantes</span><br /><span class="lineno">33 </span><span class="kr">const</span> <span class="kr">int</span> <span class="n">brocheBouton</span> <span class="o">=</span> <span class="n">D3</span><span class="p">;</span> <span class="c1">// Broche où est connectée le bouton </span><br /><span class="lineno">34 </span><span class="kr">const</span> <span class="kr">int</span> <span class="n">brocheLed</span> <span class="o">=</span> <span class="n">D4</span><span class="p">;</span> <span class="c1">// Broche D4, où la led interne au wemos est connectée</span><br /><span class="lineno">35 </span><br /><span class="lineno">36 </span><span class="c1">// Boucle d'initialisation</span><br /><span class="lineno">37 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">38 </span> <span class="nf">pinMode</span><span class="p">(</span><span class="n">brocheLed</span><span class="p">,</span> <span class="kr">OUTPUT</span><span class="p">);</span> <span class="c1">// Initialisation de la broche de la led en sortie</span><br /><span class="lineno">39 </span><br /><span class="lineno">40 </span> <span class="nf">pinMode</span><span class="p">(</span><span class="n">brocheBouton</span><span class="p">,</span> <span class="kr">INPUT_PULLUP</span><span class="p">);</span> <span class="c1">// Initialisation de la broche du bouton en entrée et activation du pull-up interne</span><br /><span class="lineno">41 </span><span class="p">}</span><br /><span class="lineno">42 </span><br /><span class="lineno">43 </span><span class="c1">//Boucle principale</span><br /><span class="lineno">44 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">45 </span><span class="c1">// Lecture de l'état du bouton et stockage dans la variable etatBouton</span><br /><span class="lineno">46 </span><span class="c1">// Déclaration de variable d'état locale (dite locale car déclarée dans la boucle "loop").</span><br /><span class="lineno">47 </span> <span class="kr">bool</span> <span class="n">etatBouton</span> <span class="o">=</span> <span class="nf">digitalRead</span><span class="p">(</span><span class="n">brocheBouton</span><span class="p">);</span> <span class="c1">//// Variable permettant de récupérer l'état du bouton</span><br /><span class="lineno">48 </span><br /><span class="lineno">49 </span> <span class="c1">// Si le bouton est appuyé, on éteins la led</span><br /><span class="lineno">50 </span> <span class="k">if</span> <span class="p">(</span><span class="n">etatBouton</span> <span class="o">==</span> <span class="kr">HIGH</span><span class="p">)</span> <span class="p">{</span><br /><span class="lineno">51 </span> <span class="c1">// extinction de la led</span><br /><span class="lineno">52 </span> <span class="nf">digitalWrite</span><span class="p">(</span><span class="n">brocheLed</span><span class="p">,</span> <span class="kr">HIGH</span><span class="p">);</span><br /><span class="lineno">53 </span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span><br /><span class="lineno">54 </span> <span class="c1">// sinon allumage de la led</span><br /><span class="lineno">55 </span> <span class="nf">digitalWrite</span><span class="p">(</span><span class="n">brocheLed</span><span class="p">,</span> <span class="kr">LOW</span><span class="p">);</span><br /><span class="lineno">56 </span> <span class="p">}</span><br /><span class="lineno">57 </span><span class="p">}</span><br /></pre></div><br/></nowiki>  , <nowiki>==Bibliothèque : ==<br />Pour utiliser facilement ce capteur, nous vous conseillons d'utiliser la bibliothèque Grove BME280 (présente dans le gestionnaire de bibliothèques arduino)<br /><br />plus d'infos pour [https://www.wikidebrouillard.org/wiki/Importer_des_biblioth%C3%A8ques_dans_l%27interface_Arduino Importer des bibliothèques dans l'interface Arduino]<div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Item-BME280 Capture decran du 2020-12-11 14-37-37.png" data-sourceimage="https://www.wikidebrouillard.org/images/9/94/Item-BME280_Capture_decran_du_2020-12-11_14-37-37.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Item-BME280_Capture_decran_du_2020-12-11_14-37-37.png" class="image"><img alt="Item-BME280 Capture decran du 2020-12-11 14-37-37.png" src="/images/9/94/Item-BME280_Capture_decran_du_2020-12-11_14-37-37.png" width="828" height="114" data-file-width="828" data-file-height="114" /></a></div></div></span></div>La bibliothèque est disponible ici : https://github.com/Seeed-Studio/Grove_BME280<br />==Câblage : ==<br /><div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Item-BME280 Capture decran du 2020-12-11 14-42-46.png" data-sourceimage="https://www.wikidebrouillard.org/images/3/33/Item-BME280_Capture_decran_du_2020-12-11_14-42-46.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Item-BME280_Capture_decran_du_2020-12-11_14-42-46.png" class="image"><img alt="Item-BME280 Capture decran du 2020-12-11 14-42-46.png" src="/images/thumb/3/33/Item-BME280_Capture_decran_du_2020-12-11_14-42-46.png/400px-Item-BME280_Capture_decran_du_2020-12-11_14-42-46.png" width="400" height="289" data-file-width="937" data-file-height="677" /></a></div></div></span></div><br /><br /><br />==Le code minimal : ==<br /><table class="wikitable" cellspacing="0" border="0"><br /><tr><br /><td height="17" bgcolor="#999999" align="left"><br /></td><td valign="middle" bgcolor="#999999" align="center"><br /></td><td bgcolor="#999999" align="center">BME280<br /></td></tr><tr><br /><td rowspan="2" valign="middle" height="49" bgcolor="#999999" align="center">Avant le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Importation de la bibliothèque<br /></td><td valign="middle" align="left">#include "Seeed_BME280.h"<br />#include <Wire.h><br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création de l’objet<br /></td><td valign="middle" align="left">BME280 bme280; // je crée l'objet "bme280" (qui est un BME280)<br /></td></tr><tr><br /><td valign="middle" height="17" bgcolor="#999999" align="center">Dans le Setup<br /></td><td valign="middle" bgcolor="#999999" align="center">Démarrage de l’objet<br /></td><td valign="middle" align="left">bme280.init(); // ou bme280.init(0x76); ou bme280.init(0x77);<br /></td></tr><tr><br /><td valign="middle" height="41" bgcolor="#999999" align="center">Dans le Loop<br /></td><td valign="middle" bgcolor="#999999" align="center">Utilisation<br /></td><td valign="middle" align="left">bme280.getTemperature()<br /></td></tr></table><br />==Autres fonctionnalités==<br /><table class="wikitable"><br /><tr><br /><th colspan="2">Fonction<br /></th></tr><tr><br /><td>bme280.getPressure()<br /></td><td>Récupère la pression en pascal<br /></td></tr><tr><br /><td>bme280.getHumidity()<br /></td><td>Récupère l'humidité en %<br /></td></tr></table><br/><br />==Exemple : ==<br /><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="lineno"> 1 </span><span class="cp">#include</span> <span class="cpf">"Seeed_BMP280.h" // import de la bibliothèque BMP280</span><span class="cp"></span><br /><span class="lineno"> 2 </span><span class="cp">#include</span> <span class="cpf"><Wire.h> // Import de la bibliothèque I2C </span><span class="cp"></span><br /><span class="lineno"> 3 </span><span class="n">BMP280</span> <span class="n">bmp280</span><span class="p">;</span> <span class="c1">// création de l'objet</span><br /><span class="lineno"> 4 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span><br /><span class="lineno"> 5 </span><span class="p">{</span><br /><span class="lineno"> 6 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">begin</span><span class="p">(</span><span class="mi">9600</span><span class="p">);</span> <span class="c1">//initialisation de la liaison série</span><br /><span class="lineno"> 7 </span> <span class="n">bmp280</span><span class="p">.</span><span class="n">init</span><span class="p">();</span> <span class="c1">//initialisation du capteur</span><br /><span class="lineno"> 8 </span><span class="p">}</span><br /><span class="lineno"> 9 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span><br /><span class="lineno">10 </span><span class="p">{</span> <br /><span class="lineno">11 </span> <span class="kr">float</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">bmp280</span><span class="p">.</span><span class="n">getTemperature</span><span class="p">();</span> <span class="c1">//récupération de la température</span><br /><span class="lineno">12 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">print</span><span class="p">(</span><span class="s">"Température : "</span><span class="p">);</span> <span class="c1">// affichage de la température dans le terminal série</span><br /><span class="lineno">13 </span> <span class="nf">Serial</span><span class="p">.</span><span class="nf">println</span><span class="p">(</span><span class="n">temp</span><span class="p">);</span><br /><span class="lineno">14 </span><span class="p">}</span><br /></pre></div><br/></nowiki>  ,
... puisque la page est obsolète ... (mais le Wiki impose au moins une étape)  +
Si tu as déjà utilisé une bouteille avec un bouchon percé pour une autre expérience, tu peux la récupérer et passer cette étape ! Pose le bouchon sur une table et perce une dizaine de trous en appuyant et tournant avec une vrille, une vis ou un clou. Plus tu auras de trous, plus ta pluie sera efficace ! Ensuite, tu peux remplir la bouteille d’eau et remettre le bouchon. Tu peux également ajouter du colorant alimentaire à l’eau si tu veux mieux la voir.  +, Avant tout, il faut s’assurer que les éponges tiennent dans les barquettes plastiques choisies. Elles n’ont pas besoin d’en occuper tout l’espace, mais c’est mieux si c’est le cas ! Si besoin, découpe-les pour les faire rentrer. Dans l’idéal, il faudra 2 éponges identiques. Dans notre expérience, elles représenteront différents sols. La première devra être humide. Pour cela, plonge-la dans l’eau puis essore la bien. La deuxième devra être gorgée d'eau. Dans ce cas, presse la bien pour chasser l'air et laisse la reprendre sa forme sous l'eau. Découpe une feuille de plastique (ou d’aluminium) à la taille d’une des éponges.  +, La barquette plastique nous servira de bassin versant. Tu peux déjà identifier ses limites : les bords définissent la ligne de partage des eaux. Pour l’estuaire, nous allons découper une ouverture au centre d’un des petits côtés de la barquette. Découpe aux ciseaux une petite ouverture (quelques millimètres de largeur) sur chaque barquette.  +,
On remplit une bouteille d'eau que l'on pose sur la table. - Ensuite on prend la boite hermétique, que l'on perce a plusieurs endroits en dessous et un trou de même diamètre au centre du couvercle. - On prend une autre bouteille assez large pour pouvoir y mettre la boite hermétique ( de façon a ce qu'elle dépasse légèrement ). - On verse le contenu de la bouteille d'eau dans la boite hermétique, jusqu'à ras bord. puis on ferme le bouchon.  +
Ajouter des pièces les unes après les autres.  +, L'eau se bombe (elle fait une voute sur le dessus du verre)  +, Remplir un verre d'eau à ras bord.  +
Le schéma de montage, également indiqué dans le code Arduino, est défini dans la première image. Nous recommandons d'utiliser une "breadboard", pour fixer le D1 mini et gérer l'ensemble des connexions. Nous avons utilisé ici celle livrée dans le kit d'initiation Arduino (Starter kit Arduino®). Les leds, les résistances, et le potentiomètre, proviennent d'ailleurs du même kit. Le montage des 5 leds (sur les pins D0 à D4) ne pose pas de problème particulier, attention cependant à respecter la polarité +/-, et ne pas oublier de mettre les résistances afin de limiter le courant électrique. Concernant le servo moteur, il faut l'alimenter via le pin GND, bien sûr, et la sortie 5V du D1 mini (celui-ci a également une sortie 3,3v, insuffisante pour le servomoteur). La commande du servomoteur sera connectée quant à elle, sur le pin D7 du D1 mini. Et enfin,le potentiomètre aura ses deux connexions externes connectées d'une part sur GND, d'autre part sur le pin '''3,3V''' (important, car c'est la tension maximale qui sera alors disponible sur la connexion centrale du potentiomètre, et qui sera acceptée par le pin A0 du D1 mini ; au-delà le D1 mini risque de souffrir).  +, Le code Arduino est commenté, et devrait permettre de comprendre le fonctionnement des différents éléments, et de procéder à des modifications. Pour simplifier la compréhension (et il est d'ailleurs recommandé de faire de même pour vos propres programmes un tant soit peu complexes), on a utilisé plusieurs onglets pour séparer les différentes fonctionnalités : <br/> #'''A_D1_WiFi''' contient les variables globales (susceptibles d'être également utilisées dans les autres onglets), ainsi que les deux fonctions 'de base' du D1 Mini, similaires à celles utilisées dans les Arduino : #*'''setup''' : c'est la première fonction appelée au démarrage du D1 Mini, après téléversement ou ré-allumage. C'est ici qu'on va initialiser le WiFi, démarrer le serveur web, définir l'état initial des leds, etc ... #*'''loop''' : cette fonction est appelée régulièrement, c'est à partir de là qu'on réalise les activités souhaitées, telles que consultation ou modification des différents pins, calculs divers, etc ...<br/> #'''B_Serveur_Web''' : gère toute la partie web, à savoir la génération de la page web, et également le traitement à effectuer lorsque cette page est demandée par un client (navigateur sur un PC ou un téléphone). C'est le module le plus complexe, il nécessite de connaître HTML, CSS, et Javascript pour tenter des modifications. <br/> #'''C_Cmd_Leds''' gère les commandes dites 'évoluées' des leds (par exemple clignotement ou défilement). A partir de l'état (éteint ou allumé) actuel des leds, les fonctions de ce module déterminent quel doit être le nouvel état de ces leds. Elles réactivent ensuite un timer permettant de définir quand le prochain changement aura lieu (et donc la vitesse de clignotement ou de défilement). <br/> #'''D_Servomoteur''' gère le servomoteur avec une seule et simple fonction. <br/> #'''E_Potentiomètre''' gère la lecture de l'entrée analogique du D1 Mini (qui va lire la valeur fournie par le potentiomètre). Si l'utilisateur a demandé à ce que le potentiomètre agisse sur la vitesse du servomoteur, alors la valeur lue sera appliquée au servomoteur. <br/> #'''F_Schéma_Montage''' décrit le montage matériel autour du D1 mini.<br/>  , On suppose ici que le logiciel Arduino est déjà installé, ainsi que la bibliothèque de gestion du D1 mini (voir pré-requis). #Téléchargez le fichier '''A_D1_WiFi.zip''' (Cf. rubrique "Fichiers ci-dessus"), puis en extraire le répertoire '''A_D1_WiFi''', qui contient tous les modules Arduino (*.ino") - Cf image n° 1. #Double-cliquez sur le fichier '''A_D1_WiFi.ino''', ce qui lancera le logiciel Arduino, sous lequel vous aurez 6 onglets correspondant aux 6 fichiers - Cf. image n° 2. #Connectez le D1 mini au port USB de votre ordinateur. #Dans le menu "Outil", positionnez le bon type de carte, et le bon port - Cf. image n°3. Si cette carte n'est pas définie, ou que le port est grisé, revérifier la configuration Arduino grâce au prérequis [[Utiliser le D1 mini avec Arduino]]. #Cliquez sur l'icône de téléversement - Cf.. image n° 4, et patientez. Si le téléversement se termine bien - Cf. image n°5, bravo ! Si un message d'erreur indique que le port n'est pas le bon, il faut le modifier dans l'onglet outil et relancer cette étape.<br/>  +,
Munissez vous de deux bouteilles identiques. De préférence lisses. D'un rouleau de scotch De 2 Billes Et d'un cutter <br/>  +, Découpez le fond des bouteilles a l'aide du cutter. Scotchez-les ensembles par le coté coupé. Puis introduisez les billes dans les bouteilles.  +, Après avoir placés les billes au centre du dispositif, faire en sorte que chaque bille atteigne les bords opposés du dispositif  +
* Le lien vous redirige vers l’interface de vote (« isoloir virtuel »). * Cliquez sur '''« Commencer »''' pour lancer le processus de vote   +, * Sélectionnez votre ou vos choix parmi les options proposées. * Une fois votre sélection faite, cliquez sur '''« Suivant »''' pour valider votre bulletin.   +, *Une page vous invite à confirmer votre vote à l’aide d’un '''code de vérification'''. *Ouvrez votre boîte mail, récupérez ce code, puis saisissez-le dans la page de confirmation. *Cliquez enfin sur '''« Soumettre »''' pour finaliser votre vote.   +,
<nowiki>Pour récupérer l'adresse mac de ton microcontrôleur exécute cette commande dans la console :<br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">import</span> <span class="nn">network</span> <span class="p">;</span> <span class="kn">import</span> <span class="nn">ubinascii</span> <span class="p">;</span> <br /><span class="n">ubinascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">network</span><span class="o">.</span><span class="n">WLAN</span><span class="p">()</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="s1">'mac'</span><span class="p">),</span><span class="s1">':'</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><br /></pre></div>L'adresse mac sera affichée entre guillemets.<br /><br />Tu peux aussi utiliser le bloc '''Récupérer l'adresse MAC'''.</nowiki>  +, Premièrement, tu dois enregistrer un ou plusieurs destinataires. Utilise le bloc '''Enregistrer un destinataire''' et renseigne l'adresse MAC du microcontrôleur à qui tu veux envoyer le message. Ensuite, tu peux envoyer un message à tous les destinataires enregistrés avec le bloc '''Envoyer un message à tous les destinataires'''.  +, Le bloc '''Quand message reçu''' faire te permet de regarder périodiquement si un message a été reçu et d'exécuter ensuite le code de ton choix. Ce bloc te fournit 2 variables : '''host''' et '''msg'''. '''Host''' contient l'adresse mac de l'expéditeur. '''Msg''' contient le message reçu. <br/>  +
On réalise le montage comme sur le schéma ou la photo. * La broche 11 est connectée au bouton. * L'autre coté du bouton est connecté au +5V * Lorsqu'on appuie sur le bouton, la broche reçoit 5V (elle est en état "HAUT"). On charge le premier programme sur l'Arduino. On ouvre le moniteur série. Il ressort dans le moniteur série un résultat qui n'est pas satisfaisant : *L'état est fluctuant. *Parfois après un appuis, l'état reste haut longtemps après qu'on ait relâché le bouton. *Le comportement est imprévisible.  +, On réalise le montage comme sur le schéma ou la photo. *La broche 11 est connectée au bouton et au +5V par l'intermédiare d'une résistance dite de pullup. *L'autre coté du bouton est connecté au GND *Lorsqu'on appuie sur le bouton, la broche passe de +5V à GND. On charge le premier programme sur l'Arduino On ouvre le moniteur série. Le résultat est mieux ! Les états sont clairs !  +, <nowiki>Oui !<br /><br />L'Arduino possède une résistance de pullup interne pour chaque broche numérique (c'est le cas pour d'autres carte comme le [[Item:D1 mini|D1 mini]] mais pas sur toutes les broches).<br /><br /><br />Elle s'active dans le "setup" avec la fonction INPUT_PULLUP <br /><br/><div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="nf">pinMode</span><span class="p">(</span><span class="n">brocheBouton</span><span class="p">,</span> <span class="kr">INPUT_PULLUP</span><span class="p">);</span><br /><span class="p">}</span><br /></pre></div><br/></nowiki>  +
Fiche “interactions“ 15 cartes espèces Bobine de ficelle d’au moins 3m  +, Chaque participant se voit attribuer une espèce et affiche son rôle. Ensuite, les enfants vont devoir, ensemble, tenter de définir leurs places au sein de la chaîne alimentaire, en formant une ligne courbe censé illustrer cette hiérarchie, où chacun se place en fonction de leurs rôles.  +, L’animateur.rice vient alors distribuer une ficelle à l’individu en bas de la chaîne (phytoplancton), puis l’objectif sera que tout le monde soit relier par cette ficelle, qui illustrera leurs interactions. Pour cela, chacun lève la main quand iel pense être en interaction avec tel ou tel spécimen. Enfin, l’animateur.rice demandera, par exemple aux prédateurs supérieurs victimes de pêche accidentelle de tirer sur leur morceau de ficelle, puis au phytoplancton, menacé par l’acidification de l’océan, de tirer à son tour sur la ficelle. Tout le monde ressentira alors la tension de la ficelle, illustrant un système basé sur l’interdépendance des espèces entre elles et et des pressions qu’elles subissent.  +,
Matériel: - Une loupe - Une feuille de papier ou un morceau de bois - Un bon soleil de printemps ou d'été. - Lunette de soleil (C'est pour éviter d'avoir mal au yeux tout au long de l'expérience, ce n'est pas une protection totale) - Une bouteille remplie d'eau en cas d'accident<br/><div class="icon-instructions caution-icon"> <div class="icon-instructions-icon"><i class="fa fa-exclamation-triangle"></i></div> <div class="icon-instructions-text">...Attention, cette expérience est à faire avec un adulte. En effet, tu peux te brûler la main, les yeux ou autres. Dès que l'on sort avec la loupe, il faut que celle-ci soit le plus à l'abri du soleil lorsqu'elle n'est pas utilisée</div> </div>  +, Pose ta cible (morceau de bois ou papier) sur une surface qui ne brûle pas, dans un espace dégagé et en l'absence de matériel inflammable à proximité. (Dans une forêt en plein été, c'est par exemple, dangereux pour toi et tu pourrais provoquer un incendie) Puis positionne ta loupe dans l'axe entre le soleil et la cible.  +, En faisant varier la distance de la loupe à la cible, tu constateras que le point lumineux s'agrandit ou se rétrécit. Il faut obtenir le point le plus petit. De la fumée peut alors commencer à se dégager!! Si tu enlèves ta loupe et la poses à l'abris, tu constateras que ta cible a brûlé au niveau du point lumineux  +
'''Parmi les espèces suivantes, qui mange qui ? '''Reconstitue, à l’aide des vignettes, 6 petites chaînes alimentaires des récifs coralliens de l’île de la Réunion : #krill, baleine à bosse, phytoplancton #triton conque, oursin, algues #phytoplancton, anémone, krill #oursin, coraux, triton conque #zooplancton, mérou, phytoplancton, poisson-clown #coraux, requin, poisson-papillon, mérou, zooplancton Note tes réponses sur une feuille, elles te serviront à l'étape suivante.  +, Tu viens de définir un premier type d'interactions entre les espèces : la relation proie-prédateur (qui mange qui), mais il en existe bien d'autres ! Tu vas en découvrir quelques-unes ci dessous. - Place sur ton réseau trophique '''le rémora rayé''' sous '''le requin''', et '''la lamproie''' sous '''la baleine à bosse'''. '''L’anémone de mer''' et '''le poisson clown''' sont également côte à côte. - '''Identifie les autres types d'interactions (positives (+), négatives (-) ou neutres (0)) qui existent entre ces 6 espèces''', en t'aidant des définitions ci-dessous : *'''Le commensalisme''' (+/0) est une relation dans laquelle une espèce tire profit de l’association des deux espèces (concernant la nourriture, l’abri, le transport...), alors que l’autre n’y trouve ni avantage ni inconvénient. ''(ex : mousse sur les troncs d’arbres).'' *'''Le parasitisme''' (+/-) est une relation dans laquelle un organisme (le parasite) tire profit de l'hôte, parfois entraînant sa mort ''(ex : Plasmodium falciparum, parasite véhiculé par le moustique, qui cause le paludisme chez l’humain).'' *'''Le mutualisme''' (+/+) est une association à bénéfices réciproques entre deux espèces qui peuvent mener une vie indépendante ''(ex : abeilles et et plantes à fleurs associées).'' *'''La symbiose''' (+/+) est une association à bénéfices réciproques entre deux espèces indissociables ''(ex : certaines bactéries dans nos intestins).''<br/> '''Maintenant, à toi de jouer !''' 1- Le rémora rayé se nourrit des déchets non mangés par le requin. Il parcourt également de grandes distances sur son ventre et se protège ainsi contre ses prédateurs, ce qui ne dérange pas le requin. '''De quel type d'interaction s’agit-il ?''' 2- La lamproie s'attaque à la baleine en utilisant sa ventouse buccale pour se coller à sa peau. Ses dents peuvent râper la peau et pénétrer dans la chair pour se nourrir. '''De quel type d'interaction s’agit-il ?''' 3- Le poisson-clown trouve dans l'anémone une protection contre les prédateurs et un lieu de ponte. Il nettoie les tentacules de l'anémone et la défend contre les attaques du poisson-papillon qui veut la dévorer. Il peut même servir d’appât pour attirer des proies vers l'anémone.  '''De quel type d'interaction s’agit-il ?''' Vérifie tes réponses à l'aide des schémas de l'étape 6.  , - Découpe 16 rectangles dans du papier (tu peux plier une feuille en 4 pour avoir les 16 rectangles) - Ouvre l’annexe “[https://www.wikidebrouillard.org/images/7/7a/Concurrents_ou_associ_s_dans_le_milieu_marin_16_cartes_organismes_marins.pdf 16 cartes organismes marins]” et pour chaque rectangle découpé, écris le nom d’un des organismes marins de l’annexe - Si tu ne connais pas certaines espèces, découvre-les plus en détail dans l’annexe “[https://www.wikidebrouillard.org/images/6/6a/Concurrents_ou_associ_s_dans_le_milieu_marin_Presentation_des_organismes_marins.pdf Présentation des organismes marins]” (Facultatif : si tu as une imprimante couleur, tu peux directement imprimer les cartes de l’annexe)  +,
'''Parmi les espèces suivantes, qui mange qui ?''' Reconstitue à l’aide des 10 vignettes ci-contre les 4 petites chaînes alimentaires : 1 - Exemple : loup, herbe, chevreuil. ''L'herbe est mangée par le chevreuil qui est lui-même mangé par le loup'' : herbe → chevreuil → loup (la flèche signifie “est mangé par”) 2 - Vipère, mûre, hibou, mulot 3 - Chenille, hibou, mulot, feuille de ronce 4 - Renard, lapin, herbe, loup 5 - Mulot, chenille, loup, feuille de ronce, renard Note tes réponses sur une feuille, elles te serviront à l'étape suivante. Et les végétaux, comment se nourrissent-ils ? Quelle forme ont ces chaînes alimentaires ?  +, Pour commencer, rassemble le matériel nécessaire à l'expérience : - annexe “[https://www.wikidebrouillard.org/images/d/d7/Concurrents_ou_associ_s_dans_le_milieu_terrestre_Vignettes_Esp_ces.pdf Vignettes espèces]” - annexe "[https://www.wikidebrouillard.org/images/5/57/Concurrents_ou_associ_s_dans_le_milieu_terrestre_R_seau_trophique_-_compl_ter.pdf Réseau trophique - à compléter]" - annexe "[https://www.wikidebrouillard.org/images/3/3c/Concurrents_ou_associ_s_dans_le_milieu_terrestre_R_seau_trophique_-_Solution.pdf Réseau trophique - solution]" - du papier - un crayon - des ciseaux Si tu as, tu peux utiliser aussi : - une imprimante couleur  +, - Si tu as une imprimante couleur, imprime les annexes “[https://www.wikidebrouillard.org/images/d/d7/Concurrents_ou_associ_s_dans_le_milieu_terrestre_Vignettes_Esp_ces.pdf Vignettes espèces]” et “[https://www.wikidebrouillard.org/images/5/57/Concurrents_ou_associ_s_dans_le_milieu_terrestre_R_seau_trophique_-_compl_ter.pdf Réseau trophique - à compléter]”. - Si tu n’as pas d’imprimante couleur, découpe 16 rectangles de papier (tu peux plier une feuille en 4 pour avoir les 16 rectangles). - Ouvre l’annexe “[https://www.wikidebrouillard.org/images/d/d7/Concurrents_ou_associ_s_dans_le_milieu_terrestre_Vignettes_Esp_ces.pdf Vignettes espèces]” et écris sur chaque rectangle le nom d’une espèce de l’annexe. - Réunis des feuilles A4 et des crayons de couleurs et/ou des feutres.  +,
Le schéma ci-contre présente différents types d'interactions dans un milieu terrestre : relations de prédation, de parasitisme (''vers nématodes/racines des salades'') mais aussi de coopération : commensalisme (''cloportes/fourmis et spores de champignons/vers de terre''), symbiose ''(champignons mycorhizes/racines des arbres'') et mutualisme (''bactéries de l’intestin/hérissons'')). '''Que se passe-t-il si l'on perturbe ce réseau trophique ?''' <br/> *Un jardinier supprime un tas de bois mort dans un coin de son jardin (impactant fortement les carabes qui y habitent) ou retourne le sol à la bêche (menaçant les vers de terre). '''Si tu enlèves les cartes “Vers de terre” et “Carabes”''' '''de ton réseau trophique, que se passe-t-il pour les autres espèces en interactions ?''' Si tu veux, tu peux recommencer en retirant une ou deux autres espèces situées à différents endroits du réseau. *'''Selon toi, de quelles manières l’humain peut-il interagir sur ce réseau trophique ? Quelles conséquences cela peut-il avoir ?'''  +, Pour commencer, rassemble le matériel nécessaire à l'expérience : - annexe “[https://www.wikidebrouillard.org/images/8/82/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Qui_mange_qui.pdf Vignettes qui mange qui] ” - annexe “[https://www.wikidebrouillard.org/images/8/80/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Concurrents_ou_associ_s.pdf Vignettes concurrents ou associés]” - annexe "[https://www.wikidebrouillard.org/images/f/f9/Concurrents_ou_associ_s_dans_le_sol_R_seau_trophique_-_compl_ter.pdf Réseau trophique - à compléter]" - annexe "[https://www.wikidebrouillard.org/images/0/08/Concurrents_ou_associ_s_dans_le_sol_R_seau_trophique_-_solution.pdf Réseau trophique - solution]" - du papier - un crayon - des ciseaux Si tu as, tu peux utiliser aussi : - une imprimante  +, - Si tu as une imprimante , imprime les annexes “[https://www.wikidebrouillard.org/images/8/82/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Qui_mange_qui.pdf Vignettes qui mange qui] ”, “[https://www.wikidebrouillard.org/images/8/80/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Concurrents_ou_associ_s.pdf Vignettes concurrents ou associés] ”  et “[https://www.wikidebrouillard.org/images/f/f9/Concurrents_ou_associ_s_dans_le_sol_R_seau_trophique_-_compl_ter.pdf Réseau trophique - à compléter]”. - Découpe les vignettes des annexes “[https://www.wikidebrouillard.org/images/8/82/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Qui_mange_qui.pdf Vignettes qui mange qui] ” et “[https://www.wikidebrouillard.org/images/8/80/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Concurrents_ou_associ_s.pdf Vignettes concurrents ou associés] ”, sans les mélanger. - Si tu n’as pas d’imprimante, découpe 19 petits rectangles de papier (tu peux plier une feuille A4 en 5 pour les avoir). - Ouvre l’annexe “[https://www.wikidebrouillard.org/images/8/82/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Qui_mange_qui.pdf Vignettes qui mange qui]” et écris sur chaque rectangle le nom d’une espèce de l’annexe. - Ouvre l’annexe “[https://www.wikidebrouillard.org/images/8/80/Concurrents_ou_associ_s_dans_le_sol_Vignettes_Concurrents_ou_associ_s.pdf Vignettes concurrents ou associés]” et écris sur chaque rectangle le nom d’une espèce de l’annexe. - Ouvre l’annexe “[https://www.wikidebrouillard.org/images/f/f9/Concurrents_ou_associ_s_dans_le_sol_R_seau_trophique_-_compl_ter.pdf Réseau trophique - à compléter]” et recopie le réseau à l’identique sur une feuille A4.  +,