Attribut:Step Content

This is a property of type Text.

Affichage de 100 pages utilisant cette propriété.
1
Ferme un œil et balade ton doigt devant jusqu'à ne plus le voir d'un côté et de l'autre. Dessine sur une feuille le champ de vision de cet œil. Recommence exactement pareil pour l'autre œil, sans changer de place.  +, Tu peux aussi essayer de regarder le paysage en alternant rapidement un œil fermé puis l'autre.  +, Prends un crayon dans ta main. Ferme un œil Demande à quelqu'un de dessiner une petite croix sur un papier En gardant ton œil fermé, vise rapidement la croix avec la pointe de ton crayon  +,
A
'''Pour commencer, rassemble le matériel nécessaire à l'expérience :''' *annexe “[https://www.wikidebrouillard.org/images/3/3a/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Fleurs_et_fruits.pdf Fleurs et fruits]” *annexe “[https://www.wikidebrouillard.org/images/4/4d/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Coupe_de_fleur.pdf Coupe de fleur]” *annexe “[https://www.wikidebrouillard.org/images/a/aa/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Cycle_de_vie_d_une_fleur.pdf Cycle de vie d'une fleur]” *annexe "[https://www.wikidebrouillard.org/images/2/22/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Jardin_fleuri.jpg Jardin fleuri]” *annexe “[https://www.wikidebrouillard.org/images/e/e8/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexes_Plantes_fleurs.pdf Plantes à fleurs]” *annexe "[https://www.wikidebrouillard.org/images/c/c0/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexes_Plantes_fleurs_-_SOLUTION.pdf Plantes à fleurs - solution]" *10 bouchons ou des confettis *2 gobelets *Papier *Crayon '''Si tu as, tu peux utiliser aussi :''' *une pomme *de vrais fleurs (avec pistil et étamines) *une loupe ou une loupe binoculaire  +, Si tu as une pomme, coupe-la en 2. Fais bien attention en utilisant le couteau : demande de l’aide à un adulte. '''Sur une feuille, trace un tableau avec 2 colonnes :''' *dans la première colonne, écris Fleurs pollinisées par les insectes" ; *dans la deuxième, écris "Fleurs pollinisées par le vent".  +, 1) Observe ta pomme coupée en deux ou sa coupe (et celle de la courgette) dans l’annexe “[https://www.wikidebrouillard.org/images/3/3a/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Fleurs_et_fruits.pdf Fleurs et fruits]”, et compare les différentes vignettes : *'''Qu’observes-tu ? Que trouve-t-on à l'intérieur du fruit ? Quel lien fais-tu entre la fleur et le fruit ? Selon toi, comment les plantes à fleurs se reproduisent-elles ?''' 2) La fleur est le lieu de reproduction de la plante. Observe l’annexe “[https://www.wikidebrouillard.org/images/4/4d/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Coupe_de_fleur.pdf Coupe de fleur]” et l’annexe “[https://www.wikidebrouillard.org/images/a/aa/A_quoi_servent_les_fleurs_-_Comment_leur_pollen_est-il_transport_Annexe_Cycle_de_vie_d_une_fleur.pdf Cycle de vie d'une fleur]”. Si possible, observe également de vraies fleurs : *Repère les organes mâles (étamines) qui renferment le pollen et l'organe femelle (pistil) relié à l'ovule de la fleur. Tu peux les regarder de plus près à l’aide d’une loupe ou d’une loupe binoculaire. *'''Où se trouve le nectar et à quoi peut-il servir ?''' *'''Comment le pollen d'une fleur atteint-il le pistil d'une autre fleur ?'''  +,
- Verse 2 cuillères à café de sel dans le verre. - Ajoute 4 cuillères à soupe d'eau déminéralisée dans le verre. - Fais chauffer 5 secondes la solution au micro ondes  +, - Inseres l'entonoir dans le verre et poses les compresses de gase par dessus - Verses le contenu du bol dans l'entonnoir, tu peux presser les compresses afin de bien essorer le jus  +, - Ajoutes doucement l'alcool au mélange et recouvres d'un film étirable ton verre - Remues tout doucement ton verre - Patientes quelques minutes  +,
Les pêcheur·euses tirent au dé puis avancent leur chalutier tour à tour. Les poissons passés sous un bateau sont pêchés et récupérés en fin de tour. On note ses prises sur un papier.  +, Après les déplacements et les prises soit ... ...les navires rentrent au port (Tous les 2 tours). Après, l’« esprit de l’océan » fait grandir chaque poisson dans la mer en posant un poisson de taille supérieur dessus. ...les œufs des poissons éclosent (Tour 3, 6 et 9), pour chaque poisson de taille 2,3 ou 4 l’« esprit de l’océan » place sur une case voisine un bébé poisson (taille 1), un maximum à l’abri de la pêche. Pour s’y retrouver sur la fiche de déroulé de partie faire avancer le pion à chaque tour.  +, Le jeu se termine au bout des 20 tours (2 x 10 tours), il faut remplir le tableau des résultats et discuter de ceux-ci.  +,
Dans un premier temps, nous voulions imaginer le mécanisme de notre avion et de la rampe avant de commencer à créer un prototype. -Le mécanisme de l'avion est simple : le long du corps de ce dernier, il y a une rainure dans laquelle un élastique est attachée à un trombone de chaque côté. L'un est fixe, l'autre est relié à l'hélice. Lorsque nous faisons tourner l'hélice, le trombone tourne avec et entraîne à son tour l'élastique qui se tort sur lui-même. -Le mécanisme de la rampe est plus facile que celui de l'avion. Nous avons choisi de faire une sorte de lance pierre. C'est-à-dire de planter deux clous au bout de la rampe à chaque coin, puis d'y attacher un élastique. Ainsi notre avion est propulsé à la fois par son hélice et par la rampe.  +, Une fois les mécanismes imaginés, nous pouvions nous attaquer au design. Le principal enjeu du design que ce soit celui de l'avion ou de la rampe est qu'il doit tenir compte des contraintes liées aux mécanismes. -Pour l'avion, nous l'avons modélisé grâce aux logiciels Catia, Sketchup afin de pouvoir l'imprimer par la suite. Nous avons fait le choix de le faire ressembler à un planeur au niveau des ailes, il a donc de longues ailes situées plutôt à l'arrière du corps de l'avion. Pour le corps, nous étions contraint d'effectuer une rainure pour y insérer le mécanisme de propulsion. -En ce qui concerne la rampe, nous avons fait simple : une planche en bois pas trop étroite que nous avons découpée (avec une scie classique, ou une scie sauteuse peu importe) à la longueur souhaitée. Puis nous avons planté les clous sur la face avant. Enfin au milieu de la rampe, une rainure de 1cm a été faite. Pour réduire les frottements et permettre à l'avion de profiter au maximum de la rampe, nous avons aussi poncé la rampe avec du papier à poncer afin de réduire les impuretés du bois.  +, -Pour la rampe, nous avons choisi d'utilisé un élastique tendu, puissant et qui permettrait de renvoyer un maximum d'énergie à notre avion. Il s'agit d'un type d'élastique d'une longueur de 10m, utilisé pour les lances pierre et de la marque Schleuder. -Pour l'avion, une imprimante 3D était obligatoire pour l'imprimer. Le plastique utilisé était du PLA mais vous pouvez utiliser autre chose. Pour assembler les pièces (deux ailes, hélice, corps) nous avons utilisé de la colle (colle forte, colle chaude.. ). Enfin, pour le mécanisme de l'hélice, il peut fonctionner avec un élastique classique. Mais rien n'empêche d'en utiliser un de meilleure qualité. l'impression des pièces de l'avion a duré environ 11h, et la modélisation environ 5h.  +,
Il est possible d'"accorder" correctement ses verres. En effet, jusqu'à présent, la gamme obtenue n'était pas parfaite. Pour l'améliorer, utilise un accordeur qui vous permettra d'ajuster la hauteur d'eau dans chaque verre. Du verre de gauche vers le verre de droite : DO, RÉ, MI, FA, SOL, LA, SI, et DO. Tu peux à présent jouer tes morceaux préférés !  +, Si tu utilises des verres, tu peux mouiller ton doigt pour le frotter sur le haut du verre. Avec un peu d'entrainement, tu pourras produire un autre type de son. Si tu utilises des bouteilles en verre, essaye de souffler au-dessus du goulot en posant tes lèvres sur le bord. Avec un peu d'entrainement, tu pourras créer ta flûte de pan.  +, Il te faut : - Plusieurs verres (ou bouteilles) en verre, de même taille et forme si possible - De l'eau - Une cuillère ou un petit verre pour transvaser l'eau - 1 crayon ou autre objet pouvant faire office de baguette Si tu souhaites faire la gamme de notes complète, il faudra alors 8 verres ou bouteilles. Pour aller plus loin, tu peux avoir besoin de : - 1 accordeur de guitare (voir le site https://www.accordersaguitare.com/) ou une application Android comme Guitar Tuna (gratuite). OU - 1 diapason  +,
Si le rouge de phénol se présente sous forme solide, dilues-en un peu dans de l’eau du robinet (de préférence dans un flacon compte-gouttes) sinon dans un pot transparent (on doit obtenir un liquide orangé).  +, Remplis à moitié un pot de vinaigre, Verses-y quelques gouttes de rouge de phénol liquide. Que se passe-t-il ?  +, Remplis à moitié un pot avec de l’eau du robinet, verses-y une cuillerée de bicarbonate et mélange. Ajoute ensuite quelques gouttes de rouge de phénol liquide. Que remarques tu ?  +,
Rassembler le matériel : * 2 verres en verre * 1 gobelet en plastique * 1 assiette de même matière que le gobelet * de l’eau chaude * 2 thermomètres <br/>  +, - Placer un thermomètre dans l’assiette et un autre thermomètre dans le verre en plastique. - Verser la même quantité d’eau chaude dans les 2 verres. - Vider ensuite l’eau d’un des verres dans le gobelet, et l’eau du second dans l’assiette. - Mesurer régulièrement la température en lisant les graduations des 2 thermomètres. La température de l’eau varie-t-elle de la même manière ?  +
Pour créer un chaîne de caractère avec du texte et une variable, utilise le bloc Créer un texte avec.  +, Pour afficher ton texte, va dans la section DBLOCADATA -> Écran. Ensuite, choisis une des fonctions affiche texte.  +
Vous pouvez utiliser le fichier disponible dans la liste du matériel pour vous aider à dessiner des image en "Pixel Art" et en déduire le code à mettre dans le programme Arduino.  +, Nous allons utiliser la bibliothèque LedControl (pour l'installer cliquer "outil" puis "Gérer les bibliothèques" est dans la recherche vous tapez LedControl et suivez les instructions). Pour afficher un smiley, je mettrais le programme bientôt ici.  +, Le cinéma c'est c'est une succession d'images, nous allons faire pareil avec le code "'''MatriceLed8X8-battementCoeur.ino'''" (voir dans la liste du matériel, onglet "Fichiers"). Chargez le code sur l'arduino, puis passez à l'étape suivante : le branchement de la matrice de LED.  +,
* Télécharger et installer le logiciel Arduino.   +, * Placer l'afficheur 7 segments sur la plaque.   +, * Brancher les deux fils noirs dans la masse GND.   +,
Pour notre projet, nous aurons besoin d'ajouter les bibliothèques suivantes via l'interface Arduino : -> Mini Grafx (by Daniel Eichborn) -> ESP8266 (by Weather Station) -> Json Streaming Parser -> ThingPulse XPT2046 Touch [[Importer des bibliothèques dans l'interface Arduino]] Vous pouvez installer que les bibliothèques ci-dessus.  +, Bien entendu, il faut avoir installé Arduino [[Installer l'environnement Arduino sur votre système]] '''Importer de nouvelles cartes dans l'interface Arduino''' '''1-Ajout d'un catalogue de cartes dans l'interface de développement Arduino''' [[Importer de nouvelles cartes dans l'interface Arduino]] Dans le champ '''"URL de gestionnaire de cartes supplémentaires"'''copiez-collez l'URL suivante : http://arduino.esp8266.com/stable/package_esp8266com_index.json '''2-Ajout de la carte''' -> Outils -> Type de carte -> Gestionnaire de carte -> Rechercher et installer '''ESP8266 by ESP8266 community''' '''3-Installer les pilotes''' Pour Windows et Mac, il est nécéssaire d'installer des pilotes. /!\ la connexion d'un Wemos D1 mini sur mac cause un "Kernel Panic" et fait planter le mac. Il faut installer des pilotes dédiés qu'on trouve ici : *[https://docs.wemos.cc/en/latest/ch340_driver.html Téléchargez les pilotes CH340 USB to UART]. Plus de détails ici : [[Utiliser_le_D1_mini_avec_Arduino]]  +, Openweather est un service en ligne permettant d'avoir des prévisions météo accessibles seulement si vous avez une clé d'accès à l'API (une clé d'API) Tout d'abord, rendez-vous sur le site https://openweathermap.org/ pour vous créer un compte. Cliquez ensuite sur l'onglet API keys, donnez un nom à votre clé et généré là. Copiez cette clé et collez là dans le code de votre projet. (Voir étape 5 ci-dessous)  +,
- Plier la feuille en deux dans le sens de la longueur en laissant un demi centimètre de décalage entre les deux bords de la feuille.  +, - Aligner et coller les deux bords afin d'obtenir un dessous d'aile plat et un dessus bombé.  +, - Placer les pailles dans les trous. Elles serviront de guide.  +,
Remplis la bassine avec de l'eau (au moins l'équivalent de la hauteur du verre).  +, Mets, si tu en as, le colorant dans l'eau.  +, Place le mouchoir ou le morceau de papier au fond du gobelet.  +,
Verser lentement l'eau dans l'entonnoir et l'eau reste dans l'entonnoir !  +, Faire entrer l'air dans le bocal à l'aide d'une paille.  +, === '''La manipulation''' === * Maintenir l'entonnoir au milieu de l'ouverture de la bouteille et le bloquer à l'aide de la pâte à modeler.  +,
*Roule les feuilles en tubes de diamètre légèrement supérieur à celui des œufs. *Réalise un cône avec le morceau de papier. *Fixe un œuf sur le cône. *Place les tubes de papier chacun sur une assiette puis fais tomber les œufs dans les tubes (celui avec le cône et un autre sans).   +
Choisir son contenant  +, À l'aide d'un cutter, dégager une ouverture sur le côté plein.  +, Aplatir le [http://www.wikidebrouillard.org/index.php?title=Sac_plastique&action=edit&redlink=1 sac plastique], et renforcer la partie centrale en plaçant du [http://www.wikidebrouillard.org/index.php?title=Scotch scotch].  +,
Mets une goutte d'eau au milieu (avec une pipette si c'est possible) et observe les allumettes s'écarter les une des autres !  +, Rajoute quelques gouttes de colorant dans l'eau pour la colorer, tu pourras voir le bois des allumettes se colorer légèrement !  +, <br/> *Une assiette *5 allumettes *De l'eau *Une pipette (facultatif) <br/>  +,
* Percer deux trous dans le bouchon de la bouteille. * Faire passer les fils dans un trou. * Faire passer la valve de chambre à air dans l'autre trou (partie métallique à l'extérieur). * Étanchéifier les trous avec le mastic. * Fixer la laine d'acier entre les deux extrémités des fils (côté intérieur). * Verser le vinaigre dans la bouteille. * Ajouter le bicarbonate de soude. * Visser le bouchon, valve en position fermée. * Attendre quelques minutes et ouvrir la valve. * Une fois la réaction chimique achevée, fermer la valve. * Brancher les fils aux bornes de la pile.   +
Cet outil permet de faire une première approche avec les enfants, on dresse un bilan de leur mobilité pour se rendre à l'école. Ils doivent se situer parmis l'une des trois colonnes que l'on trace au tableau : à pied, en vélo, ou en trotinette. En transport en commun ou en covoiturage. En voiture ou en moto avec les parents.  +, On propose aux volontaire de venir dessiner l'effet de serre. A travers ce schéma, les enfants prennent conscience des conséquences liées à l'accroissement de l'activité humaine et par conséquent du réchauffement climatique.  +, Une histoire qui reprend les conséquences liées à l'activitée humaine. A la fin de la lecture, ont invite les enfants à dessiner individuellement leur passage préféré.  +,
Il te faut essentiellement un sachet de thé et de quoi y mettre le feu. Prépare le sachet de thé : * Découpe la partie supérieure du sachet de thé. * Vide le contenu du sachet. * Déplie le sachet de manière à obtenir un tube. Prépare ton feu.  +, *Dispose le tube verticalement sur un plan qui ne craint pas le feu. (Ici c'est un couvercle de bocal mais ça peut être autre chose). *Enflamme le haut du tube avec une allumette. *Attention au décollage ! Alors, ça a marché ?   +
Commencez par dessiner un plan de votre arbalète. Incluez des mesures précises pour la longueur, la largeur et la profondeur de l'arme.  +, Sélectionnez des matériaux de qualité tels que du bois dur, de l'acier et des cordes robustes que l'on peut éventuellement trouver dans des chantiers.  +, Utilisez du bois dur ou de l'acier pour construire l'arc de l'arbalète. Assurez-vous que l'arc est suffisamment résistant pour résister à la tension de la corde.  +,
Prend un morceau de filtre à café que tu dois découper. Puis colorie la base du filtre Insère ce feuillage dans le fagot de cure-dent <br/>  +, Plonge le tronc de ton mini-arbre dans un récipient d’eau, en faisant bien attention de ne pas mouiller le feuillage.  +, Rassemblez un fagot de cure dents à maintenir avec un élastique, cela formera le tronc de l’arbre.  +
* Placer la bassine dans un endroit où elle est exposée à la lumière (du soleil si possible, d'un spot si vous habitez à Brest). * Verser de l'eau dans la bassine. * Plonger le miroir à moitié dans l'eau. * Orienter le reflet de la lumière vers la feuille blanche.   +
* Bassine remplie à moitié avec de l'eau * Un miroir (tu vas mettre dans l'eau) * Feuille de papier blanche <div class="icon-instructions info-icon"> <div class="icon-instructions-icon"><i class="fa fa-info-circle"></i></div> <div class="icon-instructions-text">...Cette expérience nécessite une grande source lumineuse: soit le soleil, soit une lampe très lumineuse.</div> </div><br/>   +, Plonge le miroir dans la bassine remplie à moitié d'eau. Place le miroir de biais afin qu'une partie soit dans l'eau. <br/>  +, Positionne la bassine de sorte que les rayons du soleil arrivent sur le miroir, en surtout sur la partie immergée (celle qui est dans l'eau). Maintenant, positionne la feuille blanche à de sorte à capter le reflet de la lumière: que peux-tu observer ? <br/>  +
''<u>'''Fabrique ton aspirateur à insectes :'''</u> '' *'''Perce le couvercle du bocal''' : sous la surveillance d'un adulte, à l'aide du marteau et du clou, perce 2 trous dans le couvercle. Il faut que les trous soient assez grands pour permettre d'y faire passer le tuyau, mais pas trop gros pour assurer l’étanchéité du dispositif *'''Coupe deux morceaux de tuyau''' avec les ciseaux : le premier d'environ 30 cm et le second d'environ 50 cm *'''Fixe un petit morceau de gaze''' avec l’élastique ou du ruban adhésif sur une extrémité du petit tuyau, pour éviter d'avaler un insecte *'''Enfile chaque tuyau dans un trou''', en positionnant l’extrémité avec la gaze à l’intérieur du pot. Ils doivent dépasser de quelques centimètres à l'intérieur du bocal. Si les tuyaux n’adhèrent pas complètement au couvercle, utilise de la pâte à modeler comme joint pour rendre le système hermétique. Cela permettra que ton aspiration soit assez puissante pour attraper des insectes. *'''Referme le pot avec le couvercle''' équipé des 2 tuyaux. <br/> *Imprime les '''annexes [https://www.wikidebrouillard.org/images/1/1c/Observer_la_faune_d_un_bloc_de_sol_TABLEAU_CAPTURE_V2.png « Tableau de capture »]''' et '''[https://www.wikidebrouillard.org/images/b/b5/Observer_la_faune_d_un_bloc_de_sol_Formulaire_JARDIBIODIV_ET_LES_PETITS_DEB_WIKI.pdf « Formulaire Jardibiodiv et les Petits deb »]'''. ''(facultatif)'' <br/>  +, *'''Délimite une zone où faire ta chasse à vue '''avec ton aspirateur à insectes. *'''Prends une photo du lieu choisi''', cette étape est importante si tu souhaites participer au programme de sciences participatives ''JardiBiodiv'' (cf. étape 5). *Envisage des temps de chasse à vue '''de 15 minutes''' sur une zone délimitée. *Sur cette zone, '''prends le temps d'observer les organismes du sol''' en soulevant des pierres, des briques, des morceaux de bois, un tas de feuilles, du compost, du paillage... Les organismes du sol aiment être pour la plupart à l'obscurité et dans un lieu assez humide. *'''Récolte les organismes '''identifiés : **''<u>si les organismes sont rapides et plus petits que le diamètre du tuyau , aspire-les ! </u>'' Pour cela : mets le plus petit tuyau dans ta bouche et plonge l’extrémité du plus grand tuyau au dessus de l’organisme observé. Aspire fort, de manière à ce qu’il soit piégé dans le pot de l’aspirateur à insectes ! **''<u>si les organismes sont lents, sont plus gros que le diamètre du tuyau ou entourés de mucus</u>'' comme les vers de terre et limaces, attrape-les à la main ou à l'aide d'une pince. *'''Ouvre le bouchon à vis avec précaution '''afin d’éviter que les animaux ne s’échappent. Dépose-les dans des récipients transparents (de préférence des boîtes loupe ou des boîtes de pétri). '''Combien de petits animaux du sol différents as tu pu observer pendant ta chasse à vue ?''' *'''Si tu le souhaites, tu peux refaire l’expérience plusieurs fois : cela te permettra de fournir des informations précieuses aux chercheur.se.s ! ''' *Si tu as réalisé plusieurs chasses à vue à différents endroits, tu pourras comparer les animaux récoltés : '''sont-ils les mêmes dans chaque bloc de sol ? En même quantité ?'''   +, '''Pour commencer, rassemble le matériel nécessaire à l'expérience :''' *un tuyau PVC souple, d’aquarium ou de robinetterie (diamètre interne < 10 mm) *un petit bocal de 100 à 180 ml (en plastique) à bouchon à vis (''plus le contenant est petit, plus il sera facile d’aspirer la quantité d’air pour aspirer assez fort pour récupérer les organismes)'' *de la gaze (compresse) *un élastique (ou du ruban adhésif) *de la pâte à modeler (ou pâte à fixer) *une paire de ciseaux (ou un cutter ou un couteau) *un clou et un marteau *une pince à épiler pour récupérer les animaux *plusieurs boîtes transparentes pour séparer les animaux et les observer *un appareil photo *une loupe *'''annexe [https://www.wikidebrouillard.org/images/e/e5/Pi_ger_la_faune_du_sol_Cl_s_d_identification_de_la_petite_faune_du_sol.pdf “Clés d’identification de la petite faune du sol”]''' *'''annexe [https://www.wikidebrouillard.org/images/1/1c/Observer_la_faune_d_un_bloc_de_sol_TABLEAU_CAPTURE_V2.png « Tableau de capture »]''' *'''annexe [https://www.wikidebrouillard.org/images/b/b5/Observer_la_faune_d_un_bloc_de_sol_Formulaire_JARDIBIODIV_ET_LES_PETITS_DEB_WIKI.pdf « Formulaire Jardibiodiv et les Petits deb »]''' *la connexion au [http://ephytia.inra.fr/fr/P/165/jardibiodiv site Jardibiodiv] ou l'application smartphone "Jardibiodiv" '''Si tu as, tu peux utiliser aussi :''' *une loupe binoculaire ou un microscope USB *une boîte loupe *une imprimante  +,
La carte mère est le système nerveux où tous les éléments sont regroupés.  +, Le processeur, c'est le cerveau du PC.  +, Le processeur monté sur la carte, puis le ventirad assemblé sur la carte mère.  +,
Remplir la bassine aux trois quarts et placer le glaçon pour observer le résultat : le glaçon flotte !  +, Vider la cartouche d'encre dans le verre en plastique (cette étape permet de mieux observer la suite). Remplissez après ça le verre d'eau à ras bord.  +, Placer le verre au congélateur (minimum 6h) pour obtenir un glaçon. Une fois l'eau transformée en glaçon vous pourrez découper le verre en plastique facilement d'où l'importance du gobelet en plastique.  +
Ajouter une grande quantité d’eau supplémentaire sous forme de pluie (arrosoir) ou crues. Observer ce qu’il se passe. Discuter sur la manière dont le débordement impacte la vie imaginée à l’étape précédente.  +, ''N.B. : Si le vocabulaire lié au bassin versant n'a pas été abordé lors d'une précédente activité, il est conseillé de réaliser cette étape.'' À l’aide des définitions suivantes, replacer chacun des mots en gras sur un point de la maquette : <br/> *Le '''lit du cours d’eau''' est l’espace occupé de manière permanente ou ponctuelle par l’écoulement de l’eau. On distingue le '''lit mineur''', ou lit naturel, où l’eau s’écoulera de façon permanente, du '''lit majeur''' qui est l’espace occupé par l’eau en période de crue ou d’inondation. *Lors de son cheminement, le cours d’eau crée parfois des '''méandres'''. Ces courbes très prononcées se produisent naturellement lorsque l’érosion naturelle des berges est détournée par la présence de matériaux plus solides. *'''Les berges''' délimitent le lit mineur. Elles sont maintenues par de la végétation composée d’arbres (par exemple d’aulnes, de saules, de frênes), d’arbustes et d’herbacées. L’ensemble des végétaux présents sur les berges et dans le lit majeur d’une rivière est appelé '''la ripisylve'''. *'''Les annexes hydrauliques''', telles que les bras morts ou les mares, sont reliées au cours d’eau en période de débordement du lit mineur sur le lit majeur. *Le cours d’eau s’écoule de '''l’amont''', où il prend sa source, souvent en montagne, vers '''l’aval''' en direction de la vallée, jusqu’à l’embouchure dans un autre cours d’eau plus grand, en lac ou en mer. <br/>  +, ''Précisions sur le matériel : Rassembler des figurines et personnages en lien avec les activités humaines et la biodiversité : tracteur, voiture, randonneur, pêcheur, bateau, maison, vache, loutre, cerf, arbre...'' ''L'arrosoir peut être remplacé par une bouteille d'eau dont on aura percé le bouchon avec plusieurs trous.'' Mettre une première quantité d’eau de façon à remplir la zone la plus creusée de la maquette. Disposer sur la maquette différentes figurines et discuter de l’organisation possible de la vie autour du cours d’eau : maisons, champs, promeneurs, agriculture, animaux, pêcheurs, bateaux.  +
* Allumer la plaque électrique : au maximum. * Poser un objet à environ 1 m de la plaque. * Aligner son regard au niveau de la surface de la plaque. * Regarder l'objet posé plus loin.   +
Pour réaliser cette activité il vous faudra une poubelle contenant des déchets "propres" en tout genre. Si ça n'est pas possible ont peux aussi très bien fonctionner avec des images sur lesquelles sont représentés les déchets. - des déchets '''organiques''' - des déchets en '''papiers''' - des déchets en '''cartons''' - des déchets en '''verre''' - des déchets '''métalliques''' - des déchets d'équipement électrique et électronique : '''DEEE''' - des déchets '''dangereux''' : inflammables, toxiques, dangereux pour l’environnement… - des ordures '''ménagères résiduelles''' - déchets '''verts''' Aussi, il vous faudra des bacs, des sacs ou des poubelles avec la couleur ou le logo associé à sa famille de tri. Si ça n'est pas possibles on peux matérialiser des zones sur une table ou au sol.  +, Les joueurs se placent devant les différents conteneurs de tri avec la poubelle d'ordures. On leur demande alors de placer les différents déchets dans les bons conteneurs. Il est possible de leur laisser à disposition la fiche explicative des logos de tri (dispo en fichiers). Une fois tous les objets placés, l'animateur.trice fait le bilan en corrigeant les erreurs avec les joueurs. <br/>  +
*Coupe dans le papier une bande de 1,5 cm x 9 cm, et une bande de 2 cm x 12 cm. *Forme deux anneaux avec les bandes. *Fixe-les aux extrémités de la paille à l'aide du ruban adhésif (la paille passe dans les anneaux). *Mets un trombone à l'extrémité de la paille du côté de l'anneau le plus petit.   +
La bobine de fil doit être percée en son centre. Vérifie qu'il n'y a pas de papier ou autre chose qui bouche le trou. A défaut d'une bobine, tu peux aussi utiliser un bouchon de liège que tu perceras de part et d'autre à l'aide d'une vrille assez grosse. Tu peux également utiliser une seringue suffisamment grosse pour que l'air passe avec un débit suffisant.  +, A l'aide d'une colle forte, ou d'un pistolet à colle chaude, colle la bobine ou le bouchon au centre du CD. ''Attention, les CD ont parfois un relief en leur centre, dans ce cas, colle sur la partie en relief pour que la partie la plus lisse soit en dessous de l'aéroglisseur.'' '''La jonction entre la bobine et le CD doit être parfaitement étanche.'''  +, Il est possible de procéder de deux manières différentes : - Place le ballon dégonflé sur la bobine, puis gonfle-le à l'aide d'une paille par en-dessous. - Ou bien gonfle d'abord le ballon et place-le ensuite sur la bobine. Dans ce cas, fais attention à ne pas perdre l'air du ballon.  +,
B
Souder des câbles Dupont à certain composants permet de les assembler plus facilement. C'est le cas notamment pour : * Le haut-parleur * L'interrupteur * Le bouton poussoir Sur le support de batterie, on soudera des câbles femelle ou des broches femelles pour éviter les contacts accidentels qui feraient des courts-circuits.  +, Avec le fichier joint (BOXSON_BOXSON_A_CUSTOMISER.pdf ou BOXSON_BOXSON_A_CUSTOMISER.svg), découpez les 6 pans de la boite carré avec une découpeuse laser (on peut aussi bricoler une boite en carton avec de la colle !)  +, Minutieusement, il s'agit de monter les différents composants sur la boite : *Bouton d'arcade, *Interrupteur, *Haut-parleur Puis de mettre le reste des composants dans la Boxson.  +,
Le matériel est tout simple : * 4 cables dupont * 1 breadboard * 1 D1 mini * 1 écran OLED * Sur la photo ne figure pas l'indispensable alimentation 5V  +, Le brochage se résume à 4 fils à brancher du D1 mini vers l'écran : * 5V vers VCC (fil rouge) * G vers GND (fil noir) * D6 vers SDA (Fil jaune) * D5 vers SCL (ou SCK (fil vert).  +, Point de vigilance : veiller à ce que les noms coïncident avec ceux du programme. Ne pas oublier la virgule finale.  +,
*Pose la balle de ping-pong sur un support horizontal. *Frotte le peigne sur le tissu. *Approche le peigne de la balle.   +
Verse de l’eau dans le [http://wikidebrouillard.org/index.php/Ballon_de_baudruche ballon de baudruche] jusqu’à ce qu'il atteigne la taille d'un œuf. Noue l'embouchure.  +, Dispose une petite quantité de coton sur le goulot de la [http://wikidebrouillard.org/index.php/Bouteille bouteille] et enflamme-le avec une [http://wikidebrouillard.org/index.php/Allumette allumette].  +, Pose rapidement le [http://wikidebrouillard.org/index.php/Ballon_de_baudruche ballon de baudruche]  sur le goulot de la [http://wikidebrouillard.org/index.php/Bouteille bouteille] (le plus verticalement possible).  +,
Pour réaliser l'expérience il te faut : - Un ballon de baudruche - Un feuille de papier - Une paire de ciseaux  +, * Découper avec les ciseaux des petits morceaux de papier. * Gonfler le ballon et nouer l'embouchure pour le fermer. * Frotter une partie du ballon sur des cheveux.   +, * Approcher le ballon des morceaux de papier. Que se passe-t-il ?   +
=== '''La manipulation''' === * Gonfler (pas trop !) et fermer le ballon de baudruche.  +, * Orienter le sèche-cheveux verticalement vers le haut.   +, Placer le ballon de baudruche dans le flux d'[http://www.wikidebrouillard.org/index.php?title=Air air].  +
Il te suffit de souffler dans ton ballon et de le gonfler... un peu mais pas trop! Il faut que ton ballon ne soit pas sous tension.  +, Il ne te reste plus qu'à percer ton ballon ! Trempe ton pic à brochette dans le liquide vaisselle (facultatif) pour plus de facilité et plante le à l'extrémité de ton ballon (là où le caoutchouc est plus foncé) et fais le ressortir par le petit noeud du dessus !  +
Préparation du matériel : - une paille - un ballon de baudruche - une pince à linge - 5 mètres de ficelle - du ruban adhésif  +, Gonfler le ballon, plus il sera gonflé plus il ira vite et loin. Fermer le ballon avec la pince à linge. Fixer la paille sur le ballon avec le ruban adhésif dans le sens de la longueur (de l'embout de gonflage à l'extérmité).  +, * Enfiler la ficelle dans la paille et tendre la ficelle entre deux points fixes, par exemple deux chaises, ou bien une chaise et une poignée de fenêtre. * Retirer la pince à linge et le bolide va être propulsé. Le ballon est même capable de monter si la ficelle est en pente.   +
Découper avec les ciseaux des petits morceaux de papier.  +, Gonfler le ballon et nouer l'embouchure pour le fermer.  +, Frotter une partie du ballon sur des cheveux  +,
Préparer : * Un bouchon de liège * 4 bouteilles d'eau * Un clou (ou une vrille) * 3 pailles * 4 pics à brochette * Du ruban adhésif * De l'eau  +, Coucher deux bouteilles l'une à côté de l'autre, en laissant entre elles un espace d'au moins la largueur d'une bouteille, pour constituer deux flotteurs (comme sur un catamaran)  +, Avec le ruban adhésif, fixer un « pont » reliant la partie avant des bouteilles avec deux pics à brochettes collés l'un contre l'autre. Utiliser les deux autres pics à brochettes pour attacher un deuxième « pont » sur la partie arrière des bouteilles.  +,
Cette étape a été assez courte. On s'est répartit les différents rôles dans le groupe et on a également établit un planning. On a donc eu en : Responsable matériel et fabrication : Rémi et Baptiste. Conception et conception 3d : Pierre et Martin. Documentation : Rémi et Roman Power Point : Baptiste et Pierre Budget : Quentin  +, Lors de cette phase on a créé des plans pour avoir différentes idées de ce qu'on pourrait fabriquer à l'atelier. On s'est notamment inspirer du bateau Mississipi pour créer nos plans. Et une vidéo sur youtube (cf lien ci dessous) qui présente une voiture à propulsion élastique nous a grandement aider pour trouver le moyen de faire avancer notre bateau. https://www.youtube.com/watch?v=ClIbBwREN7k&ab_channel=ProfesseurB  +, Lors de cette étape Pierre et Martin on modélisé sur catia V5 le bateau en 3d afin de pouvoir l'imprimer en 3d. Ils ont dû modéliser les pièces séparément afin de pouvoir les imprimer une à une et après assembler le bateau.  +,
Cette étape a été assez courte. On s'est répartit les différents rôles dans le groupe et on a également établit un planning. On a donc eu en  : Responsable matériel et fabrication : Rémi et Baptiste. Conception et conception 3d : Pierre et Martin. Documentation : Rémi et Roman Power Point : Baptiste et Pierre Budget : Quentin  +, Lors de cette phase on a créé des plans pour avoir différentes idées de ce qu'on pourrait fabriquer à l'atelier. On s'est notamment inspirer du bateau Mississipi pour créer nos plans. Et une vidéo sur youtube (cf lien ci dessous) qui présente une voiture à propulsion élastique nous a grandement aider pour trouver le moyen de faire avancer notre bateau. https://www.youtube.com/watch?v=ClIbBwREN7k&ab_channel=ProfesseurB  +, Après on a testé si l'élastique faisait bien tourner l'axe sur laquelle il y avait les pales. Et on a également testé s'il flotté. Lors de cette étape Pierre et Martin on modélisé sur catia V5 le bateau en 3d afin de pouvoir l'imprimer en 3d. Ils ont dû modéliser les pièces séparément afin de pouvoir les imprimer une à une et après assembler le bateau.  +,
Découper un petit bateau de la forme suivante en papier. Etaler une goutte de liquide vaisselle à l'arrière du bateau grâce au pic à brochette. Remplir la bassine d'eau. Poser le bateau sur l'eau bien à plat.  +
'''Pour commencer, rassemble le matériel nécessaire à l'expérience :''' *du papier aluminium *un ballon gonflé *tes cheveux '''Pour l’étape 4, tu peux aussi utiliser :''' *une feuille de papier *un crayon *une paire de ciseaux *du ruban adhésif *un ballon gonflé *[https://www.wikidebrouillard.org/images/6/66/Billes_sauteuses_ANNEXE_Ailes_insecte.pdf annexe “Ailes d’insectes”] *imprimante (facultatif)  +, Roule des petites billes de papier d'aluminium. Étale une grande feuille d'aluminium sur la table puis dépose les billes d'aluminium dessus. C'est prêt !  +, Frotte le ballon gonflé sur tes cheveux puis approche-le des billes d'aluminium posées au dessus de la feuille d'aluminium, sans les toucher.''' Que remarques-tu ? Que s’est-il passé ? '''  +,
<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, ne jamais manipuler le billet à la main !</div> </div><br/>  +, Le billet doit vraiment être entièrement mouillé, un bout resté sec brûlera.    +, Tenir toujours le billet avec la pince et le placer au dessus de l'assiette.    +,
Pour commencer, rassemble le matériel nécessaire à l'expérience : *des feuilles A4 *des crayons de couleurs/feutres jaune, vert, bleu *des ciseaux *annexe “[https://www.wikidebrouillard.org/images/6/61/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Vignettes_esp_ces.pdf Vignettes espèces]” *annexe “[https://www.wikidebrouillard.org/images/9/9c/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Poster_des_milieux.pdf Poster des milieux]” *annexe “[https://www.wikidebrouillard.org/images/b/b8/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_R_ponse_-_milieux_et_esp_ces.pdf Réponse - milieux et espèces]” *annexe “[https://www.wikidebrouillard.org/images/8/84/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Carte_du_monde.pdf Poster carte du monde]” Si tu as, tu peux utiliser aussi : 1 imprimante couleur (facultatif)  +, * Réunis des crayons de couleurs et/ou des feutres jaune, vert et bleu. *Prends 4 feuilles et trace le contour de chaque feuille avec une couleur attitrée : jaune, vert, bleu et blanc. *Si tu as une imprimante couleur, imprime l'annexe "[https://www.wikidebrouillard.org/images/6/61/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Vignettes_esp_ces.pdf Vignettes espèces]” et découpe les vignettes. *Si tu n’as pas d’imprimante couleur, découpe 21 rectangles de papier (tu peux plier deux feuilles A4 en 4 pour avoir 32 rectangles). *Ouvre l’annexe “[https://www.wikidebrouillard.org/images/6/61/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Vignettes_esp_ces.pdf Vignettes espèces]” et note sur chaque rectangle le nom d’une espèce présente sur l’annexe.   +, *Les 4 feuilles, de 4 couleurs différentes, représentent chacune '''UN milieu naturel.''' *A quoi la feuille jaune te fait-elle penser ? Dessine ou écris ce à quoi tu penses sur la feuille. *Répète cette même action avec les trois autres couleurs. *Ouvre ensuite l'annexe "[https://www.wikidebrouillard.org/images/9/9c/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Poster_des_milieux.pdf Poster des milieux]" et associe à chacune de tes feuilles le milieu naturel correspondant. *Ouvre maintenant l'annexe "[https://www.wikidebrouillard.org/images/8/84/Biodiversit_-_Diversit_des_esp_ces_et_des_milieux_Carte_du_monde.pdf Carte du monde]" et associe à chacune de tes feuilles le lieu où se trouve le milieu naturel. *'''Selon toi, quelles espèces peux-tu rencontrer dans chacun de ces milieux ?'''   +,
Pour commencer, rassemble le matériel nécessaire à l'expérience : *des crayons *une feuille de papier *annexe "[https://www.wikidebrouillard.org/images/2/20/Biodiversit_-_Diversit_des_individus_Questionnaire_qu_est-ce_qui_te_rend_unique.pdf Questionnaire : qu'est-ce qui te rend unique]" <u>Si tu as, tu peux utiliser aussi</u> : *1 imprimante (facultatif)  +, Ouvre l’annexe “[https://www.wikidebrouillard.org/images/2/20/Biodiversit_-_Diversit_des_individus_Questionnaire_qu_est-ce_qui_te_rend_unique.pdf Questionnaire : qu’est-ce qui te rend unique]”. *Imprime le questionnaire. *Si tu n’as pas d’imprimante, prends une feuille de papier.  +, *Remplis ou réponds sur une feuille au questionnaire "[https://www.wikidebrouillard.org/images/2/20/Biodiversit_-_Diversit_des_individus_Questionnaire_qu_est-ce_qui_te_rend_unique.pdf Qu’est-ce qui te rend unique]” *'''Choisis plusieurs personnes de ta famille ou des ami·e·s, puis, recherche les ressemblances et les différences entre vous.''' Pour faciliter les comparaisons, tu peux faire remplir le questionnaire également à ces personnes. *En ce qui concerne les caractères physiques décrits dans le questionnaire (couleur des cheveux, des yeux… ): '''qu'avez-vous en commun ? Mais sont-ils tous identiques ?''' *'''Selon toi, qu’est-ce qui rend chaque individu unique ?'''   +
mettre 2 cuillères à soupe de maïzena dans le sachet plastique  +, ajouter 2 cuillères à soupe d'eau et malaxer le sac  +, ajouter 6 gouttes d'huile et malaxer le sac  +,
Montage du circuit  +, Transfert du programme sur la carte WeMos  +, Fabrication des boites "gare" et "wagon"  +,
Voici le diagramme complété.  +, Sous forme de discussion, commencer par : *Associer les quatre définitions à leurs titres. Pour cela, faire le lien avec les autres expériences réalisées précédemment ; *Positionner le titre et sa définition sur le diagramme « Schéma représentant les quatre catégories de critères permettant de définir et d’évaluer l’état des cours d’eau ».  +, Utiliser la page une du document « Schéma décrivant la façon dont la classe de qualité est déterminée pour les cours d’eau » afin de comprendre de quelle façon fonctionne la note donnée aux écosystèmes. - Commencer par repérer qu’il suffit d’une note dégradée à un sous-critère pour que la note globale soit dégradée ; - Sur la page 2, déterminer la classe globale du cours d’eau ; - Sur la page 3, déterminer les sous-classes puis la classe globale du cours d’eau.  +,
Liste du matériel nécessaire: * 2 joysticks * 17 boutons (prévoir quelques boutons supplémentaires pour le remplacement) * 1 raspberry Pi * une carte SD * 2 Cartes hotkey * 1 adaptateur usb vga (en fonction de l’écran utilisé) * 1 écran * 2 câble USB 2 mâle/ USB 3 mâle * 1 paire d'enceintes * 1 clavier  +, Lien vers le modele 3D de la borne d'arcade: https://app.sketchup.com/share/tc/europe/LZH66Sw_kL0?stoken=sEU88ql9XvYLjVbO9LgSDM5VoZ7JtOarPwgxAJBlWttVOtI2Th00lahoVX8qJ5F5&source=web //!\\ Pour le montage, prévoir des cales/tasseau pour faciliter l'assemblage et permettre de déposer la planche avec les contrôles sans devoir visser. Cela permettra le remplacement du matériel et le mapping.  +, Munissez vous de votre carte SD, téléchargez recallbox (cf le lien en dessous) puis installez le sur la carte SD. https://www.recalbox.com/fr/download/stable/rpi/ //!\\ Point de vigilance: Sélectionnez le bon type de recallbox. Celui-ci dépend de votre type de raspberry  +,
Placer la bougie au centre du bocal puis allumer là. La bougie ne doit pas dépasser du bocal.  +, Verse un fond de vinaigre dans le bocal (la mèche de la bougie ne doit pas entrer en contact avec le vinaigre).  +, Met le bicarbonate dans le bocal avec la cuillère en évitant d'en verser sur la flamme de la bougie. Que se passe-t-il ?  +,
* Déchirer un morceau de papier pour en faire une boulette qui puisse entrer dans le goulot de la bouteille. * Coucher la bouteille sur une surface plane. * Placer la boulette dans le goulot de la bouteille. * Essayer de faire entrer la boulette dans la bouteille. Attention, pas le droit de toucher la [http://ancien.wikidebrouillard.org/index.php?title=Bouteille bouteille], ni la [http://ancien.wikidebrouillard.org/index.php?title=Boulette&action=edit&redlink=1 boulette] !   +
* Coupe une rondelle de bouchon de liège * Verse de l’eau dans la bassine * Déplie le trombone et coupes-en un bout. * Frotte une des extrémités du trombone avec l’aimant (si on a une épingle ou une aiguille, il suffit de la frotter avec l'aimant de la même manière) <br/>   +, Prépare : *Un aimant puissant *Un bouchon de liège *Un trombone (ou une épingle/aiguille) *Un cutter *Une bassine remplie d'eau *Une pince coupante (facultatif) <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 avec le cutter ou la pince coupante !</div> </div><br/>  +, Dépose le bouchon sur l'eau, pose le trombone ou l'aiguille sur le bouchon et observe ce qu'il se passe !  +
Pour l'alimentation, vous pouvez faire fonctionner la boite en 5V c'est donc assez souple : * Avec un chargeur de téléphone * Une batterie "power bank" pour téléphone * des piles en série (3 piles 1,5 V font parfaitement l'affaire) * ... Pour le haut-parleur, j'ai trouvé le mien dans un vieil ordinateur. Sur la photo, il manque du carton pour fabriquer la boite ainsi que les outils.  +, Pour faciliter les branchement, nous allons souder des embouts femelles de câbles dupont. Pour cela, on coupe des câbles et on dénude.  +, En ajoutant des embouts femelles de la même façon. La gaine thermo-retractable consolide les soudure et protège des contacts involontaires.  +,
Prendre une brosse en plastique souple à dent et couper la tête. A l'aide d'une pince, arrachez les poils du centre sur 4 rangées  +
* Découper la boîte de pellicule photo à la moitié de sa hauteur. Déposer la bille dans le fond de la boîte et la remplir d'huile. * Poser la boîte dans le verre et verser autour de celle-ci de l'alcool à brûler jusqu'à recouvrir la boîte. * Verser ensuite de l'eau tout doucement le long de la paroi du verre.   +
C
Réaliser l'axe avec d'un côté l'endroit où poser la balle, et d'un autre la où va venir taper le verre. L'axe fixe mesure 15cm, et celui qui sert à jeter la balle en mesure 30. Fixer avec une vis un simple bouchon de bouteille au bout de celui de 30cm afin de pouvoir y poser la balle (ou l'objet que vous souhaitez lancer).  +, Fixer l'axe aux armatures à l'aide des vis qui vont être vissées dans le bois, mais '''libres dans l'armature''' afin que l'axe puisse tourner (la rotation n'est pas possible si l'armature est vissée avec, donc <u>on y fait juste passer les vis</u>). Fixer la catapulte au support avec des vis (ici, le support est une planche de bois issue de recup) .  +, On fixe trois tasseaux verticaux de 50cm pour cadrer la chute du verre et le faire bien tomber sur la catapulte.  +,
Observe les différentes photos Quelles différences observes-tu? Quelles ressemblances oberves-tu?  +, Sur ces photos, nous remarquons que les coupes ont globalement une forme circulaire, avec des traits concentriques. Les espacements entre les traits sont réguliers ou irréguliers selon les arbres. On peut également bien observer l’écorce sur la photo 1 et 4. Chaque année, l’arbre possède une nouvelle cerne (cercle)  annuelle permettant de découvrir son passé et sa manière dont il a grandi. <br/>  +, Chaque cercle du tronc d’un arbre correspond à une année de croissance. Quel âge à l’arbre sur ce dessin? Puis sur la photo? Les couleurs de la photo ne sont pas naturelles, c'est pour te faciliter à compter les cernes! <br/>  +,
Essayer de faire tenir la canette sur son arête inférieure. Que se passe-t-il ?  +, Prends une canette et remplis-la d'eau, environ au tiers de son volume. Tu peux aussi le faire avec de la semoule, du sable ou de la farine, il faut juste que le matériau soit liquide ou composé de très petits grains.  +, Tu peux essayer avec différents niveaux dans la canette ou essayer de la remplir avec d'autres matériaux pour voir ce qui peut changer.  +,
Les trous rebouchés avant n'étant pas assez gros, il est nécessaire d'en créer à nouveau car le débit d'air qui circulera se doit d'être important. Pour cela, la perceuse, la scie sauteuse et la lime, nous ont été d'une grande aide. (Pour le grande tube en métal il est possible de prendre un tube de pvc, qui sera donc plus simple à percer. Cependant, il faudra une méthode différente pour le fixer au contenant à air.)  +, Il faut ensuite assembler les pièces entre elles, visser la tuyauterie à l'extincteur et au tube de propulsion.  +, Après avoir bien fini d'assembler chaque partie du canon, il est l'heure d'effectuer les premiers tests! A première vue, la puissance n'était pas très élevée, cela à cause des fuites d'air dans la tuyauterie. De plus, il nous semblait plus pratique de réduire la taille du tube de propulsion.  +,
'''<u>Pour commencer, rassemble le matériel nécessaire à l'expérience :</u>''' - un verre - une planche à découper - un couteau - de l’eau - du colorant alimentaire de couleur vive (rouge, bleu ou vert) ou de l’encre rouge ou bleu foncé - une branche de céleri avec des feuilles - 2 sacs en plastique transparents - 2 élastiques '''<u>Si tu as, tu peux utiliser aussi :</u>''' - 2 verres - de l’argile en poudre - du sel - du papier essuie-tout  +, - Ajoute du colorant alimentaire ou de l’encre dans un verre d’eau. - Fais tremper la branche de céleri dans l’eau colorée. - Avec un sac plastique, enferme hermétiquement une feuille attachée à la branche de céleri à l’aide d’un élastique. - Enferme juste de l’air avec un autre sac et ferme-le hermétiquement, de la même façon. - Observe régulièrement le céleri et les sacs plastiques. - Attends le lendemain pour réaliser la suite de l’expérience.  +, <div class="icon-instructions caution-icon"> <div class="icon-instructions-icon"><i class="fa fa-exclamation-triangle"></i></div> <div class="icon-instructions-text">Demande à un adulte de t'aider</div> </div>- Sur la planche à découper, coupe une petite lamelle du bas du céleri à l'horizontale puis une autre lamelle à la verticale. '''Que remarques-tu ?''' - Observe les feuilles du céleri : '''que vois-tu ?''' - Observe  également les deux sacs plastiques. '''Que se passe-t-il sur leurs parois ? Voit-on la même chose sur les parois des deux sacs ? Pourquoi ? À quoi sert le sac vide ?''' Tu peux compléter cette expérience en la reproduisant avec des fleurs blanches. Après les avoir trempées quelques jours dans l’encre ou le colorant alimentaire, tu pourras voir les pétales se colorer !  +,
Téléchargez le fichier [https://cloud.debrouillonet.org/s/TQR2Ad43267ZFcK Captobox.m5b] et téléversez le sur le site (CUSTOM (Beta)>open *m5b file) puis sélectionnez le fichier précedement téléchargé  +, Glissez déposez un "label" un zone de texte sur l'écran du M5StickC, puis recopiez le code suivant  +, Appuyez sur le bouton Lecture en haut à droite et si votre M5Stick est bien sur le même réseau et bien configuré, vous devriez voir apparaître la concentration en milligramme par metre cube d'air(μg/m3) de particules PM1.0 Attention, sur la photo c'est pas des ppm mais μg/m3  +,
Réaliser le montage suivant : C'est à dire : SDA a A4, SCL a A5, GND a GND et VIN a 5V  +, * Télécharger la librairie du capteur et placer la dans /Arduino/librairies (on dézippe et on crée un nouveau dossier). Lien pour le téléchargement : https://github.com/adafruit/Adafruit-BMP085-Library/archive/master.zip   +, <nowiki>Copier-coller ce code dans le programme arduino puis le téléverser dans la carte : #include "Wire.h" <br />#include "Adafruit_BMP085.h" // librairie spéciale pour cette famille de capteurs<br />Adafruit_BMP085 mySensor; // on crée un objet du type souhaite<br />float tempC; // variable qui contiendra la température <br />float pression; //variable pour la pression<br /> //A noter : la pression est renvoyé en Pa (Pascal), la météo donne la pression en hectoPascal, suffit d'enlever les 2 derniers chiffres tout simplement...<br />void setup() {<br /> Serial.begin(9600); //Pour changer, on lance la transmission PC - arduino<br /> mySensor.begin(); //Et la communication capteur-arduino<br />}<br />void loop() {<br /> tempC = mySensor.readTemperature(); //On lit la temperature <br /> pression=mySensor.readPressure(); //et on lit la pression<br />Serial.print("Temperature : "); <br />Serial.print(tempC);<br />Serial.println("C");<br />Serial.print("Pression: ");<br />Serial.print(pression);<br />Serial.println(" Pa");<br />Serial.println("");<br />delay(1000); <br />}</nowiki>  +,
1. Effectuer le câblage ci-dessous.  +, 1. Effectuer le câblage ci-dessous. (suite)  +, Télécharger le logiciel ARDUINO sur http://arduino.cc/en/main/software  +,
Cette étape, relativement simple, a consisté en réaliser des mesures et scier les premières pièces dans le bois afin de créer la base rectangulaire de notre catapulte.  +, Après avoir obtenu une structure, nous avons entamé la partie perçage afin de rajouter à cette structure de quoi soutenir notre mécanisme de projection (à l'aide de tourillons).  +, Réalisation de pièces nécessitant une certaine précision (engrenage, cuillère de projection).  +,
• Taille des encoches dans un socle de polystyrène, puis y enfonce les deux carrés face à face (les surfaces couvertes d'aluminium doivent être face à face). • Recouvre la boule de papier aluminium en mettant une des extrémités du fil sous celui-ci, avec un peu de colle, pour pouvoir ensuite la suspendre à une paille dans laquelle a été taillée une encoche. Plante ensuite la paille dans le socle restant. • Dispose la boule suspendue entre les deux plaques, sans qu'elle ne les touche. <br/>  +, • Prépare une boule en aluminium ainsi que deux socles en polystyrène expansé. • Découpe ensuite deux carrés de papier cartonné. Leur dimension doit être d'environ deux fois le diamètre de la boule, ni trop petit, ni trop grand. • Sur une face de chacun des carrés, colle une feuille d'aluminium. Attention ! Un seul des côtés doit être recouvert d'aluminium. <br/>  +, • Frotte un objet en plastique, ici une paille, tu peux le faire aussi avec une règle, avec un vêtement et approche-le d'un des carrés, puis éloigne-le.  +
Télécharger les fichiers et les imprimer sur des feuilles transparentes.  +, Choisissez les couches que vous voulez et essayez de trouver des liens entre elles, ou des anomalies. Y-a-t-il des usages qui ne sont pas compatibles avec le territoire ?  +, On y retrouve la terre et la mer. Qu'est-ce qui n'est pas représenté ? *Le relief ; *Les cours d'eau ; *Les habitations. On obtient alors une carte similaire à ce que l'on pourrait observer depuis le ciel. Mais ce type d'outil permet également de représenter des informations qui ne sont pas directement visibles.  +,
Nous avions le choix entre le trébuchet et la catapulte. Nous avons opter pour la catapulte car c'est le projet qui nous a paru le plus intéressant, elle permet plus de précision et lance les projectiles avec une vitesse plus réduite, ce qui dans un cadre scolaire nous parait plus judicieux.  +, En choisissant la catapulte, nous avons opté plutôt pour la précision que la puissance. Donc pour compenser ce manque de puissance qui aurait pu nous poser problème, nous avons testé et analysé plusieurs idées de conception en fonction de l'orientation de l'élastique pour voir la position dans laquelle l'élastique est le mieux placé pour obtenir un résultat satisfaisant.  +, Nous avons récupéré les matériaux utilisés pour la conception de la catapulte dans un chantier proche de l'école, ce qui nous a permis d'avoir le bois adapté. Par le biais de l'école, nous avons commandé un élastique robuste ainsi que des équerres de maintient et des vis. Nous avions déjà une cible et des fléchettes ce qui nous a permis de réduire les coûts considérablement.  +,
Pas de photo désolé Il suffit juste de planter une vis dans un bout de bois rectangulaire et suffisamment allongé Il faut ensuite faire un trou à l'aide d'une perceuse sur le côté de ce dernier  +, Pas de photo encore Il suffit de creuse 2 trous dans le bâtis à égale distance dans le bâtis, puis y rajouter une tige métallique faisant office d'axe. Il ne reste plus qu'à ajouter le levier précédemment fabriqué.  +
Avant de foncer tête baissée dans la construction de notre catapulte, il faut réfléchir un peu à quoi elle va ressembler. Il faut '''imaginer chaque pièce''' et savoir comment les modéliser avec le logiciel '''CATIA'''. Il faut également choisir des '''dimensions''' qui nous conviendraient afin que l’assemblage puisse se dérouler comme on le souhaite.  +, A présent, nous devons nous lancer dans la '''modélisation''' de chacune des pièces. Il faut faire attention aux '''dimensions''' et prendre en compte le fait que '''l’imprimante''' '''3D''' n’est pas hyper précise donc il ne faut pas faire de pièces trop fines par exemple. Et il faut laisser un peu de jeu entre les pièces qui doivent pivoter entre elles pour que tout se passe bien.  +, Une fois les pièces imprimées, il faut utiliser une pince pour '''enlever les supports''' qui sont collés aux pièces et il faut limer certaines pièces pour plus de précision.  +,
Commencez à créer le caisson de base. Nous avons juste à assembler les pièces en bois ainsi que la base que nous avons déjà découpé ! On assemble alors les planches, les 4 triangles, et le fond. Nous avons utilisé ici de la colle à bois, mais si on utilise des planches plus épaisses alors on pourra utiliser des vis.  +, Le moulinet servira à tirer le bras de lancer pendant la tension de l'élastique. On assemble les cubes troués avec les roulements à billes de handspinner. Nous avons utilisé un ancien stylo à bille dont on a retiré le fond et l'encre du stylo, en son centre on perce un petit trou pour faire passer le fil. Enfin on fixe les bouts du stylo dans les roulements à billes. Puis on colle au pistolet à colle chaude les cubes en bois à une extrémité du cercle servant de plateau tournant.  +, Commencer par découper la base de votre plateau. Nous l'avons fait avec un classeur de récupération. Un cercle de diamètre 20 cm, avec un fin trou au centre. Puis avec la deuxième face du classeur on découpe un carré plein de 25 cm de coté, avec un trou au centre. Le fond de la cagette en carré de 25 cm de coté.  +,
Comme tout projet qui se respecte, nous avons commencé par faire un croquis afin de se rendre compte des pièces à façonner et des dimensions de celles-ci.  +, Certaines pièces vont être créées par nous même! Pour ce faire, nous allons aller au "Jlab" de notre école afin façonner les pièces de nos rêves.  +, Nous avions un objectif de créer cette catapulte en réduisant au maximum nos dépenses… Objectif réussi puisque le seul achat que nous avons eu a effectuer est de la colle de bois, une catapulte aussi incroyable pour 1,47 euros, vous êtes bouche bée non?!  +,
- Sur la planche de 80 cm fixer le bol en plastique à l'opposé du coté qui possède le trou. - Placer la planche de 80 cm afin que tous les trous des différentes pièces soit alignés.  +, - Découper 1 plaque de contreplaqué de 45x40 en diagonale pour avoir 2 triangle égaux. - Découper 2 planches de 90 cm. - Découper 1 planche de 80 cm. - Découper 4 planches de 40 cm. - Découper 1 planche de 45 cm. - Découper 2 bâtons ronds de 40 cm. - Faire 1 trou sur chaque planche de 90 cm à 15 cm d'une extrémité, et 1 trou sur chaque plaque de contreplaqué au même niveau que celui de la planche quand vous placez le côté adjacent de la plaque le long de la planche. - Faire un trou dans l'épaisseur de la planche de 80 cm à 6 cm d'une extrémité.  +, 1) <u>Coté 1 de la structure :</u> - Prendre une planche de 90 cm et une planche de 40 cm. - A 40 cm du bout de la planche de 90 cm, visser la planche de 40 cm perpendiculairement à la planche de 90 cm, puis, ajouter 1 équerre d'assemblage pour un meilleur maintien. - Visser la plaque de contreplaqué à la construction en faisant correspondre l'angle droit du triangle à celui de la structure et en veillant à ce que les bords du triangle longent bien le bord de la planche perpendiculaire et celui de l'autre planche au niveau du sol, et en faisant apparaitre le trou réalisé à l'étape 1. 2) <u>Côté 2 de la structure :</u> - Recommencer la même opération que pour le côté 1. 3) <u>Assemblage des 2 côtés :</u> - Relier les deux côtés en vissant à chaque extrémité des planches de 90 cm une planche de 40 cm. Cela forme un rectangle de 90x40 pour la base de la catapulte. - Visser une planche de 45 cm sur les 2 planches perpendiculaires, en haut et sur la partie opposée de l'assemblage des planches et des triangles, pour les relier.  +,
Nous avons besoin d'une planche en bois, d'un élastique, de quelques clous ou de la colle pour assembler la catapulte.  +, Avant de commencer à construire, il est important de dessiner un plan de notre catapulte. Cela nous aidera à déterminer la taille, la forme et l'emplacement des différentes parties de la catapulte.  +, On commence par construire la base de la catapulte en utilisant du bois. On utilise une planche de bois pour créer la base. La base doit être suffisamment solide pour supporter la tension de l'élastique.  +,
A l'aide de colle, il faudra coller le raccord tube/vanne au bout de votre tube. Maintenant coupez votre tube pour qu'il fasse un longueur d'environ 30-35cm et collez le "Raccord tube" sur le bout du tube. Votre tube est prêt !  +, A l'aide d'une lime, enlevez le pas de vis du goulot de la bouteille ( attention de ne pas trop limer, enlevez uniquement le pas de vis ). Ensuite, trouez le fond de votre bouteille du diamètre de votre valve ( de même, attention de ne pas faire un trop gros trou ) et insérez votre valve dedans avec un peu de colle. A l'aide de colle, il faudra coller la vanne au goulot de votre bouteille. Mettez une bonne dose de colle, c'est grâce à cette opération que la bouteille va devenir hermétique. La bouteille est prête ! Vous pouvez assembler la bouteille et le tube.  +, Coupez un planche de 30x30cm puis découpez deux supports de la hauteur que vous souhaitez. Vissez le tout comme sur la photo.  +,
Pour la première étape, vous allez vous rendre sur Internet pour étudier le sujet de votre futur travail. Vous regarderez différents modèles de catapultes, grand ou petits, en bois ou en plastique, etc... afin de pouvoir y réfléchir seul ou en groupe et décider comment sera votre construction.  +, Rendez vous sur un site de modélisation tel que SolidWorks, Catia, Sketchup que vous pourrez trouver gratuitement sur Internet. Ces logiciels sont plus ou moins faciles à prendre en main mais certains tutos Youtube suffiront à maîtriser les bases pour une structure simple tel qu'une catapulte. Avant de modéliser, il est essentiel de savoir comment imprimer en 3d sa catapulte. Il ne fait pas créer de parois volantes ou non imprimables physiquement parlant. Vous pouvez donc penser à imprimer chaque pièce une à une puis les assembler lors du montage ou encore mettre votre catapulte sous forme de patron comme nous verrons ensuite.  +, Notre catapulte est sous forme de patron comme ci-joint. A gauche de l'écran se retrouve les normes de l'objet créé et sont donc ajustables en fonction de nos critères mais aussi de la capacité de l'imprimante à imprimer jusqu'à une dimension finie. On peut donc effectuer des retouches visuelles et de design pour perfectionner notre travail .  +,
ketchup agar-agar eau huile végétal casserole verre écumoire saladier entonnoir  +, Une fois le ketchup chaud ajouter un sachet de agar-agar, puis remettre le mélange dans le flacon du ketchup avec l’entonnoir  +, Remplir un verre d’huile végétal  +,
<br/> * une ou plusieurs bougies ( bougies chauffe plat par exemple) * une assiette * une boîte d'allumettes ou un briquet * un ou plusieurs bocaux en verre * De l'eau  +, Verse un peu d'eau au fond de l'assiette (on peut mettre du colorant dans l'eau pour que l'expérience soit plus visible). <br/>  +, Mets la bougie au milieu de l'assiette. Puis allume là !<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 en allumant de ne pas te brûler, ou de ne pas enflammer ce qui pourrait y avoir aux alentours.</div> </div> Couvre la bougie avec le verre puis observe ce qu'il se passe !  +
* Réaliser le montage en suivant la vidéo/le schéma.   +, * Lancer le logiciel Arduino.   +, * Brancher l'Arduino sur un port USB de l'ordinateur.   +,
Les sites d’informations en ligne, sur des réseaux sociaux, les sites collaboratifs peuvent fourmiller de fausses informations. Alors comment discerner le vrai du faux ? Voici quelques pistes. <br/> * Vérifier la source de l’information Il est très important de chercher la source de l’information. Vient-elle d’un spécialiste sur le sujet ou de Gérard, notre voisin bavard et intempérant ? Si cette information est rapportée par quelqu’un, qui est à l’origine de cette information ? Dans le cas où cette information vient d’un spécialiste, est-elle validée par ses pairs (ex. communauté des médecins dans le cas d’une fake news liée à une découverte d’un remède miracle) ? <br/> * Vérifier la confiance d’un site web Certains site internet sont plus sujets à être vecteurs de fake news que d’autres. Certains sites sont parfois volontairement satyriques (ils créent des articles humoristiques, parfois confondus comme de véritables informations ; l[http://www.legorafi.fr/ e Gorafi], [https://www.theonion.com/ The Onion], [https://parentsprofslemag.fr/ ParentsProfs], etc.) d’autres ne vérifient pas scrupuleusement leurs sources avant de rapporter une information. Voici un outil qui peut être utile pour tester la confiance envers un site internet : le [https://www.lemonde.fr/verification/ Décodex] créé par le magasine d’information Le Monde. <br/> * Visionner des médias spécialisés dans le « fact checking » Il est aussi possible de vérifier une information en la recherchant sur des sites spécialisés dans la discrimination d’informations. - Les Décodeurs du Monde : https://www.lemonde.fr/verification/ - Le vrai du faux de France info : https://www.francetvinfo.fr/vrai-ou-fake/ ou en version émission de radio https://www.francetvinfo.fr/replay-radio/le-vrai-du-faux/ - La désintox de Libération : https://www.liberation.fr/desintox,99721 - Factuel de l’AFP : https://factuel.afp.com/ - Hoaxbuster : https://www.hoaxbuster.com/ - La rubrique « fact check » de The Conversation : https://theconversation.com/fr/search?utf8=%E2%9C%93&q=fact+check - La chaîne Youtube WTFake de Aude Favre : https://www.youtube.com/channel/UC8Ux-LOyEXeioYQ4LFzpBXw - Moins fourni, mais non moins intéressant, les articles publiés sur Latribune (site d’information québécois) : https://www.latribune.ca/actualites/verification-faite  , Une vidéo peut elle aussi être une source de désinformation. S’agit-il plutôt d’une vidéo de « divertissement » ou plutôt de style « documentaire » ? En fonction du format, il peut y avoir plusieurs moyens pour falsifier une vidéo. Cela peut-être par exemple : - un montage vidéo ou/et une bande sonore trompeurs - un trucage vidéo (équivalent pour la vidéo de la « retouche » photographique) - etc. Pour appuyer tout cela, je vous invite à consulter le formidable travail réalisé par cette classe de 2nd : https://vimeo.com/166931978 et ce reportage réalisé avec une classe de CM2, qui démontre parfaitement à quel point 2 montages différents peuvent conduire à des informations opposées : https://www.reseau-canope.fr/notice/sens-critique.html <br/> * Mais alors comment s’en prémunir ? → Chercher d’éventuelles zones floues (car comme pour les retouches photo, les retouches vidéo laissent des traces). Se méfier généralement des vidéos de mauvaise qualité qui sont beaucoup plus simples à truquer. → Chercher d’éventuels mauvais raccords. → S’extraire de la musique d’ambiance s’il y en a une pour éviter d’avoir notre esprit critique trompé. Exemple d’une vidéo truquée et largement diffusée lors de l’incident de l’usine Lubrizol à Rouen : https://www.20minutes.fr/faits_divers/2613663-20190926-incendie-usine-lubrizol-rouen-attention-video-montre-incendie-site-seveso  +, Il est temps de faire appel à un spécialiste. Il faut alors regrouper toutes les questions que l’on se pose par écrit et trouver quelqu’un qui pourrait nous aider à y répondre. Une vidéo étonnante d’un aigle qui capture un jeune enfant ? Pourquoi ne pas essayer de contacter un ornithologue (scientifique qui étudie les oiseaux) ou une association d’ornithologie qui aurait des contacts à nous transmettre. Un article stupéfiant sur le Covid-19 ? S’il a quelques minutes à nous accorder, nous pourrions poser nos questions à un médecin, qui se tient au courant des recherches scientifiques dans le domaine.  +,
Tenir verticalement les deux feuilles, face-à-face, à environ 10 centimètres l'une de l'autre. * Souffler entre les feuilles.  +
Ecrasez ces feuilles sur un filtre à café à 2cm au-dessus du bas du filtre. Faire comme une ligne de couleur verte horizontal.  +, Plongez alors la base du filtre à café dans un récipient avec dans le fond de l'alcool à brûler. Dans cette étape, ce liquide est appelé éluant. Il permet de séparer la couleur étudiée.  +, Au bout de quelques minutes qu’observez-vous ?  +
* Découpe le filtre à café ''Le but du découpage est d'avoir une large et haute bande de papier filtre. Nous proposons un exemple ici mais tu peux découper à ta façon.'' <br/> * Coupe en deux parties égales le filtre à café, dans le sens de la hauteur. * Prends une des deux parties, et découpe les parties collées du filtre. * Ouvre ensuite le pliage en deux et coupe au milieu sur le pli * Dessine 3 gros points de couleurs différentes. <br/>   +, Trempe doucement le bout du filtre dans le verre d’eau. '''Attention: l'eau ne doit pas arriver au niveau des points, elle doit juste mouiller le bas du papier filtre.''' Qu'observes-tu ?  +, *3 feutres de couleur différentes (par exemple : bleu, jaune, vert) *1 filtre à café *1 paire de ciseaux *Un verre avec un fond d'eau   +
''Le but est d'avoir les 2 LED qui se suivent : elles sont branchées en série''. *Avec les fils électriques, relie la borne + de la pile à l'anode de la première LED (la patte la plus longue, la borne positive) *Relie la cathode (la petite patte, la borne négative) à l'anode de la seconde LED *Relie la cathode de la seconde LED à la borne - de la pile, comme sur ce schéma. *Observe. *Refais le même branchement avec tous les composants branchés en série dans le même circuit, et observe.  +, ''Le but est d'avoir les 2 LED branchées aux mêmes endroits : elles sont en parallèle''. *Avec les fils électriques, relie la borne + aux 2 anodes : les pattes les plus longues des LED doivent être reliées au même fil. *de même pour les cathodes : elles doivent être reliées par le même fil à la borne - , comme sur ce schéma. *Observe. *Refais le même branchement avec tous les composants branchés en parallèle dans le même circuit, et observer.  +, Mesure les différences de tension électrique selon le montage. Pour cela, relie : *la borne rouge (c'est à dire + ou V) du multimètre/voltmètre à l'endroit du circuit d'où arrive le courant ; *la borne noire (COM) du multimètre/voltmètre à l'endroit où part le courant. Par exemple, pour vérifier une pile, on branche la borne V à la borne + de la pile et COM au -. Pour une LED, on reliera l'anode à la borne V et la cathode à la COM  +,
Prendre une feuille A3, y dessiner un grand rectangle. Quel nom donner à cette boite pour que tous les jouets ou vignettes puissent y entrer ? Réponse: Vivant  +, Est ce que toutes les vignettes se ressemblent ? Normalement le tri se fait facilement entre animal et végétal. Ici, le champignon peut être ignoré. On trace alors deux boites. La première qu'on nomme végétal et l'autre qu'on nomme animal. On y glisse ensuite les vignettes correspondantes. Se pose alors la question du champignon dans quelle boite rentre t-il ? Il rentre dans vivant mais ne peut pas rentrer dans végétal ni dans animal. Ici on a donc deux solutions, soit on trace une troisième boite qu'on nomme champignons soit on laisse la vignette dans la boite vivant. <br/>  +, En suivant la même méthodologie, on peut se focaliser sur la taille de l'organisme. On forme une nouvelle boite "arbres".  +,
Tu dois trouver un moyen d'agencer tes 12 clous pour les faire tenir en équilibre sur ton support, sans outil ni matériel supplémentaire. <br/>  +, Tu peux commencer par manipuler les clous et le support. C'est une façon de "réflechir" avec les mains. Tu peux également essayer de réflechir à des choses que tu connais déjà et qui font tenir plusieurs objets en équilibre. Tu peux aller voir ces vidéos, elles pourraient te donner des idées. http://phymain.unisciel.fr/acrobaties-autour-du-centre-de-gravite/ http://phymain.unisciel.fr/un-manege-avec-une-assiette/ [https://www.wikidebrouillard.org/w/Equilibre_d'une_r%C3%A8gle_et_d'un_marteau Equilibre d'une règle et d'un marteau] [[L'équilibriste]] <br/>  +, Pour voir une solution (il en existe certainement d'autres) tu dois cliquer sur les images dont tu peux voir les icônes sur la gauche.  +,
<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>==Câblage : ==<br />Notez que la broche gain est connectée à la broche tension (Vdd) (câble jaune sur le schéma).<div class="annotatedImageDiv" typeof="Image" data-resource="Fichier:Item-microphone MAX9814.png" data-sourceimage="https://www.wikidebrouillard.org/images/9/9d/Item-microphone_MAX9814.png"><span ><div class="center"><div class="floatnone"><a href="/wiki/Fichier:Item-microphone_MAX9814.png" class="image" title="câblage Microphone MAX9814"><img alt="câblage Microphone MAX9814" src="/images/thumb/9/9d/Item-microphone_MAX9814.png/1094px-Item-microphone_MAX9814.png" width="1094" height="740" srcset="/images/9/9d/Item-microphone_MAX9814.png 1.5x" data-file-width="1104" data-file-height="747" /></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">MAX9814<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">pas de bibliothèque<br /></td><td valign="middle" align="left"><br /></td></tr><tr><br /><td valign="middle" bgcolor="#999999" align="center">Création d'une variable<br /></td><td valign="middle" align="left">int valeurCapteur; // On prépare une variable pour stocker les valeurs du capteur<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">Serial.begin(9600); // on démarre la communication série<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">valeurCapteur = analogRead(A0); // On lit la valuer mesurée par le capteur sur la broche A0<br />Serial.println(valeurCapteur); // On publie sur le moniteur série la valeur récupérée<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="c1">/////////////////</span><br /><span class="lineno"> 2 </span><span class="c1">// Microphone //</span><br /><span class="lineno"> 3 </span><span class="c1">// MAX9814 //</span><br /><span class="lineno"> 4 </span><span class="c1">/////////////////</span><br /><span class="lineno"> 5 </span><br /><span class="lineno"> 6 </span><span class="cm">/*</span><br /><span class="lineno"> 7 </span><span class="cm"> * Un programme pour tester le fonctionnement du microphone MAX9814</span><br /><span class="lineno"> 8 </span><span class="cm"> * Il utilise le traceur série pour visualiser les signaux récupérés</span><br /><span class="lineno"> 9 </span><span class="cm"> * pour utiliser le traceur série : cliquez sur Outils/Traceur série</span><br /><span class="lineno">10 </span><span class="cm"> ___</span><br /><span class="lineno">11 </span><span class="cm"> / ___ \</span><br /><span class="lineno">12 </span><span class="cm">|_| | |</span><br /><span class="lineno">13 </span><span class="cm"> /_/ </span><br /><span class="lineno">14 </span><span class="cm"> _ ___ _ </span><br /><span class="lineno">15 </span><span class="cm"> |_| |___|_| |_</span><br /><span class="lineno">16 </span><span class="cm"> ___|_ _|</span><br /><span class="lineno">17 </span><span class="cm"> |___| |_|</span><br /><span class="lineno">18 </span><span class="cm">Les petits Débrouillards - Novembre 2022 - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/</span><br /><span class="lineno">19 </span><span class="cm">*/</span><br /><span class="lineno">20 </span><br /><span class="lineno">21 </span><span class="kr">int</span> <span class="n">valeurCapteur</span><span class="p">;</span> <span class="c1">// On prépare une variable pour stocker les valeurs du capteur</span><br /><span class="lineno">22 </span><br /><span class="lineno">23 </span><span class="kr">void</span> <span class="nb">setup</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">24 </span> <span class="c1">// on démarre la communication série</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">9600</span><span class="p">);</span><br /><span class="lineno">26 </span><span class="p">}</span><br /><span class="lineno">27 </span><br /><span class="lineno">28 </span><span class="kr">void</span> <span class="nb">loop</span><span class="p">()</span> <span class="p">{</span><br /><span class="lineno">29 </span> <span class="c1">// On lit la valeur mesurée par le capteur sur la broche A0</span><br /><span class="lineno">30 </span> <span class="n">valeurCapteur</span> <span class="o">=</span> <span class="nf">analogRead</span><span class="p">(</span><span class="n">A0</span><span class="p">);</span><br /><span class="lineno">31 </span> <span class="c1">// On publie sur le traceur série la valeur récupérée</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="n">valeurCapteur</span><span class="p">);</span><br /><span class="lineno">33 </span> <span class="p">}</span><br /></pre></div></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.  +