<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Les+5+perdu</id>
		<title>Les Fabriques du Ponant - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Les+5+perdu"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Les_5_perdu"/>
		<updated>2026-05-16T02:27:33Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30293</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30293"/>
				<updated>2025-01-23T15:24:16Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content:center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30292</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30292"/>
				<updated>2025-01-23T15:23:54Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content:center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30290</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30290"/>
				<updated>2025-01-23T15:23:40Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content:center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30289</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30289"/>
				<updated>2025-01-23T15:23:19Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content:center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30288</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30288"/>
				<updated>2025-01-23T15:23:05Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content:center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30283</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30283"/>
				<updated>2025-01-23T15:22:20Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: center;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30282</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30282"/>
				<updated>2025-01-23T15:21:39Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30280</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30280"/>
				<updated>2025-01-23T15:20:58Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30274</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30274"/>
				<updated>2025-01-23T15:17:55Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30272</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30272"/>
				<updated>2025-01-23T15:17:02Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
* [api gemini google cloud https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
* [open WeatherMap https://ai.google.dev/gemini-api/docs/api-key?hl=fr]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
* [lien github du code complet https://github.com/FoxtrotFR/TortueGPT]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30270</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30270"/>
				<updated>2025-01-23T15:15:28Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30268</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30268"/>
				<updated>2025-01-23T15:14:55Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30266</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30266"/>
				<updated>2025-01-23T15:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30264</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30264"/>
				<updated>2025-01-23T15:14:07Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30259</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30259"/>
				<updated>2025-01-23T15:13:01Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30257</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30257"/>
				<updated>2025-01-23T15:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le cerveau moteur -carte&amp;lt;br&amp;gt;&lt;br /&gt;
controle-5V&amp;lt;br&amp;gt;&lt;br /&gt;
masse-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-5&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&amp;lt;br&amp;gt;&lt;br /&gt;
GND-G&amp;lt;br&amp;gt;&lt;br /&gt;
VCC-3.3&amp;lt;br&amp;gt;&lt;br /&gt;
SCL-D1&amp;lt;br&amp;gt;&lt;br /&gt;
SDA-D2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour la led - carte&amp;lt;br&amp;gt;&lt;br /&gt;
borne + - D1 (LED1)&amp;lt;br&amp;gt;&lt;br /&gt;
borne+ - D2 (LED2)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30254</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30254"/>
				<updated>2025-01-23T15:11:57Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur -carte&lt;br /&gt;
controle-5V&lt;br /&gt;
masse-G&lt;br /&gt;
VCC-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'écran-carte&lt;br /&gt;
GND-G&lt;br /&gt;
VCC-3.3&lt;br /&gt;
SCL-D1&lt;br /&gt;
SDA-D2&lt;br /&gt;
&lt;br /&gt;
Pour la led - carte&lt;br /&gt;
borne + - D1 (LED1)&lt;br /&gt;
borne+ - D2 (LED2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30250</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30250"/>
				<updated>2025-01-23T15:06:52Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur &lt;br /&gt;
hdhdhdh&lt;br /&gt;
&lt;br /&gt;
Pour l'écran &lt;br /&gt;
jdhdj&lt;br /&gt;
&lt;br /&gt;
Pour les LED&lt;br /&gt;
hdh&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''branchement de la carte ''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement de l'ecran'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30249</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30249"/>
				<updated>2025-01-23T15:06:32Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur &lt;br /&gt;
hdhdhdh&lt;br /&gt;
&lt;br /&gt;
Pour l'écran &lt;br /&gt;
jdhdj&lt;br /&gt;
&lt;br /&gt;
Pour les LED&lt;br /&gt;
hdh&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 11===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30248</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30248"/>
				<updated>2025-01-23T15:05:11Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur &lt;br /&gt;
hdhdhdh&lt;br /&gt;
&lt;br /&gt;
Pour l'écran &lt;br /&gt;
jdhdj&lt;br /&gt;
&lt;br /&gt;
Pour les LED&lt;br /&gt;
hdh&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
[[Fichier:La Tortue GPT.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30247</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30247"/>
				<updated>2025-01-23T15:04:49Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur &lt;br /&gt;
hdhdhdh&lt;br /&gt;
&lt;br /&gt;
Pour l'écran &lt;br /&gt;
jdhdj&lt;br /&gt;
&lt;br /&gt;
Pour les LED&lt;br /&gt;
hdh&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''branchement ecran (dos)'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''branchement de la carte et cerveau moteur'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:La_Tortue_GPT.jpg&amp;diff=30245</id>
		<title>Fichier:La Tortue GPT.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:La_Tortue_GPT.jpg&amp;diff=30245"/>
				<updated>2025-01-23T15:03:04Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Galleriebranchemetn3.jpg&amp;diff=30244</id>
		<title>Fichier:Galleriebranchemetn3.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Galleriebranchemetn3.jpg&amp;diff=30244"/>
				<updated>2025-01-23T15:02:48Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Galleriebranchemetn3.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Galleriebranchemetn3.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30240</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30240"/>
				<updated>2025-01-23T15:02:14Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Voilà quelques photo pour vous aider à faire les branchements &lt;br /&gt;
&lt;br /&gt;
Pour le cerveau moteur &lt;br /&gt;
hdhdhdh&lt;br /&gt;
&lt;br /&gt;
Pour l'écran &lt;br /&gt;
jdhdj&lt;br /&gt;
&lt;br /&gt;
Pour les LED&lt;br /&gt;
hdh&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Gallaeriebranchemetn1.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Galleriebranchement2.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
File:Galleriebranchemetn3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30234</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30234"/>
				<updated>2025-01-23T15:00:04Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Galleriebranchement2.jpg&amp;diff=30232</id>
		<title>Fichier:Galleriebranchement2.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Galleriebranchement2.jpg&amp;diff=30232"/>
				<updated>2025-01-23T14:59:50Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Galleriebranchement2.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Galleriebranchement2.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30229</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30229"/>
				<updated>2025-01-23T14:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* fichiers à joindre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Gallaeriebranchemetn1.jpg&amp;diff=30227</id>
		<title>Fichier:Gallaeriebranchemetn1.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Gallaeriebranchemetn1.jpg&amp;diff=30227"/>
				<updated>2025-01-23T14:59:24Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Gallaeriebranchemetn1.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gallaeriebranchemetn1.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30223</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30223"/>
				<updated>2025-01-23T14:58:21Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30222</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30222"/>
				<updated>2025-01-23T14:58:07Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30221</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30221"/>
				<updated>2025-01-23T14:57:34Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 10===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start; height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify; justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    Comme nous avons besoin de la masse sur plusieurs branchements, nous devons la &amp;quot;multiplier&amp;quot;. Donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque Labtec (voir photo).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    Ainsi, on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tous les câbles noirs).&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right; display: block;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot; heights=200 widths=200 style=&amp;quot;margin-left: auto;&amp;quot;&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''Câblage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''Schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30217</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30217"/>
				<updated>2025-01-23T14:55:52Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30214</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30214"/>
				<updated>2025-01-23T14:54:40Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 40%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30211</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30211"/>
				<updated>2025-01-23T14:54:26Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200 right&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30210</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30210"/>
				<updated>2025-01-23T14:53:34Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;justify-content: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Comme nous avons besoin de la masse sur plusieurs branchements nous devons la &amp;quot;multiplier&amp;quot; donc on branche un câble venant de la pin G de la carte sur une ligne de notre plaque labtec (voir photo). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ainsi on obtient la &amp;quot;masse&amp;quot; sur toute la ligne (tout les câbles noir).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px; text-align: right;&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:Multipliergnd2.jpg|200px|''cablage de la masse''&lt;br /&gt;
      File:Multipliergnd3.jpg|200px|''schéma de la masse'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30207</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30207"/>
				<updated>2025-01-23T14:52:39Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFiClientSecure.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ArduinoJson.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ESP8266WebServer.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SCREEN_WIDTH 128 // OLED display width, in pixels&lt;br /&gt;
#define SCREEN_HEIGHT 32 // OLED display height, in pixels&lt;br /&gt;
#define OLED_ADDR 0x3C&lt;br /&gt;
#define PIN_SERVO_2 D5&lt;br /&gt;
&lt;br /&gt;
Servo myservo_2;&lt;br /&gt;
&lt;br /&gt;
// Informations Wi-Fi&lt;br /&gt;
const char* ssid = &amp;quot;Fablab 2.4&amp;quot;;&lt;br /&gt;
const char* password = &amp;quot;MonPetitPonant&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Serveur Gemini&lt;br /&gt;
const char* host = &amp;quot;generativelanguage.googleapis.com&amp;quot;;&lt;br /&gt;
const char* whost = &amp;quot;api.openweathermap.org&amp;quot;;&lt;br /&gt;
const int httpsPort = 443;&lt;br /&gt;
int i = 0;&lt;br /&gt;
&lt;br /&gt;
// Clé API Gemini&lt;br /&gt;
const char* apiKey = &amp;quot;AIzaSyAoicxEwA1SBs5j0TOFz6k1Je9tjHcCDv8&amp;quot;;&lt;br /&gt;
const char* wapiKey = &amp;quot;9596a6bc06ebb5c5671dd0d0cf21a71e&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Coordonnées de Brest, France&lt;br /&gt;
const float latitude = 48.3904;&lt;br /&gt;
const float longitude = -4.4861;&lt;br /&gt;
&lt;br /&gt;
// Variable pour suivre la dernière mise à jour&lt;br /&gt;
unsigned long lastWeatherUpdate = 0; &lt;br /&gt;
const unsigned long weatherUpdateInterval = 30 * 60 * 1000; // 30 minutes en millisecondes&lt;br /&gt;
&lt;br /&gt;
// URL pour accéder à la météo&lt;br /&gt;
String url = &amp;quot;/data/2.5/weather?lat=&amp;quot; + String(latitude, 4) + &amp;quot;&amp;amp;lon=&amp;quot; + String(longitude, 4) + &amp;quot;&amp;amp;appid=&amp;quot; + wapiKey + &amp;quot;&amp;amp;units=metric&amp;amp;lang=fr&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Serveur Web Inclus&lt;br /&gt;
ESP8266WebServer server(80); // Serveur web sur le port 80&lt;br /&gt;
&lt;br /&gt;
// Information Ecran&lt;br /&gt;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.begin(9600);&lt;br /&gt;
 delay(10000);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // Connexion au Wi-Fi&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au Wi-Fi&amp;quot;);&lt;br /&gt;
 WiFi.begin(ssid, password);&lt;br /&gt;
 while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
 delay(500);&lt;br /&gt;
 Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;\nWi-Fi connecte.&amp;quot;);&lt;br /&gt;
 Serial.print(&amp;quot;IP du Device : &amp;quot;);&lt;br /&gt;
 Serial.println(WiFi.localIP()); // Afficher l'adresse IP locale&lt;br /&gt;
&lt;br /&gt;
 // Page HTML avec un champ de texte pour l'entrée utilisateur&lt;br /&gt;
 server.on(&amp;quot;/&amp;quot;, HTTP_GET, []() {&lt;br /&gt;
 String html = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;h1&amp;gt;Entrée pour l'API Gemini&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;form action='/submit' method='POST'&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='text' name='message' placeholder='Entrez votre message' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;input type='submit' value='Envoyer' /&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/form&amp;gt;&amp;quot;;&lt;br /&gt;
 html += &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, html);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Lorsque le formulaire est soumis, traiter la requête&lt;br /&gt;
 server.on(&amp;quot;/submit&amp;quot;, HTTP_POST, []() {&lt;br /&gt;
 if (server.hasArg(&amp;quot;message&amp;quot;)) {&lt;br /&gt;
 String userMessage = server.arg(&amp;quot;message&amp;quot;); // Récupérer le message&lt;br /&gt;
 Serial.println(&amp;quot;Message reçu: &amp;quot; + userMessage);&lt;br /&gt;
 &lt;br /&gt;
 // Appeler votre fonction pour envoyer la requête à l'API&lt;br /&gt;
 sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 // Afficher une page de confirmation&lt;br /&gt;
 server.send(200, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Message envoyé!&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 } else {&lt;br /&gt;
 server.send(400, &amp;quot;text/html&amp;quot;, &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Erreur: Aucune donnée reçue&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
 // Démarrer le serveur web&lt;br /&gt;
 server.begin();&lt;br /&gt;
&lt;br /&gt;
 // Initialiser l'écran&lt;br /&gt;
 if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {&lt;br /&gt;
 Serial.println(F(&amp;quot;Échec de l'initialisation de l'écran SSD1306!&amp;quot;));&lt;br /&gt;
 for (;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'adresse IP locale pendant 10 secondes sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setTextSize(1); // Taille de texte 1&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.print(&amp;quot;IP locale: &amp;quot;);&lt;br /&gt;
 display.print(WiFi.localIP()); // Afficher l'adresse IP&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 // Effacer l'écran&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 delay(10000); // Attendre 10 secondes&lt;br /&gt;
&lt;br /&gt;
 // Configurer la taille du texte et la couleur&lt;br /&gt;
 display.setTextSize(1); // Taille du texte (1 = normal, 2 = double, etc.)&lt;br /&gt;
 display.setTextColor(SSD1306_WHITE); // Couleur du texte&lt;br /&gt;
 // Test liaison Meteo&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Meteo.&amp;quot;);&lt;br /&gt;
 // Test Liaison Gemini&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Gemini...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Gemini.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur Gemini.&amp;quot;);&lt;br /&gt;
 pinMode(D4, OUTPUT);&lt;br /&gt;
 pinMode(D3, OUTPUT);&lt;br /&gt;
 myservo_2.attach(PIN_SERVO_2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 server.handleClient(); // Traiter les requêtes entrantes&lt;br /&gt;
 // Vérifie si 30 minutes se sont écoulées depuis la dernière mise à jour&lt;br /&gt;
 while (i == 0) {&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 i++;&lt;br /&gt;
 }&lt;br /&gt;
 if (millis() - lastWeatherUpdate &amp;gt;= weatherUpdateInterval) {&lt;br /&gt;
 // Mettre à jour la météo&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
 // Met à jour le timestamp de la dernière mise à jour&lt;br /&gt;
 lastWeatherUpdate = millis();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Entrer Gemini Manuel en direct via le Moniteur de serie&lt;br /&gt;
 // Demande à l'utilisateur d'entrer un message&lt;br /&gt;
 //Serial.println(&amp;quot;Entrez votre message pour l'API Gemini :&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Attente de l'entrée utilisateur&lt;br /&gt;
 //while (Serial.available() == 0) {&lt;br /&gt;
 // Attente active&lt;br /&gt;
 //}&lt;br /&gt;
&lt;br /&gt;
 // Lecture du message saisi&lt;br /&gt;
 //String userMessage = Serial.readStringUntil('\n');&lt;br /&gt;
 // Appel de la fonction pour envoyer la requête&lt;br /&gt;
 //sendRequestToGemini(userMessage);&lt;br /&gt;
&lt;br /&gt;
 //delay(10000); // Attendre 10 secondes avant d'envoyer une nouvelle requête&lt;br /&gt;
}&lt;br /&gt;
String replaceAccents(String str) {&lt;br /&gt;
 str.replace(&amp;quot;é&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;è&amp;quot;, &amp;quot;e&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;à&amp;quot;, &amp;quot;a&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;ù&amp;quot;, &amp;quot;u&amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;°&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 str.replace(&amp;quot;*&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
 // Ajoutez d'autres remplacements nécessaires&lt;br /&gt;
 return str;&lt;br /&gt;
}&lt;br /&gt;
const char* json(String input) {&lt;br /&gt;
 DynamicJsonDocument doc(512);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, input);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return 0;&lt;br /&gt;
 }&lt;br /&gt;
 JsonObject candidates_0 = doc[&amp;quot;candidates&amp;quot;][0];&lt;br /&gt;
 const char* candidates_0_content_parts_0_text = candidates_0[&amp;quot;content&amp;quot;][&amp;quot;parts&amp;quot;][0][&amp;quot;text&amp;quot;]; // &amp;quot;Bonjour ...&lt;br /&gt;
 return candidates_0_content_parts_0_text;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void sendRequestToGemini(const String&amp;amp; message) {&lt;br /&gt;
 Serial.println(&amp;quot;Gemini Mode&amp;quot;);&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur...&amp;quot;);&lt;br /&gt;
 if (!client.connect(host, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 Serial.println(&amp;quot;Connecté au serveur.&amp;quot;);&lt;br /&gt;
 String instruction = &amp;quot; pour ta reponse : pas d'emoticone, pas de symbole, uniquement des lettres, chiffres... et la ponctuation&amp;quot;;&lt;br /&gt;
 String finalmessage = message + finalmessage;&lt;br /&gt;
 // Construire le payload JSON&lt;br /&gt;
 String payload = String(&amp;quot;{&amp;quot;) +&lt;br /&gt;
 &amp;quot;\&amp;quot;contents\&amp;quot;: [{&amp;quot; +&lt;br /&gt;
 &amp;quot;\&amp;quot;parts\&amp;quot;: [{\&amp;quot;text\&amp;quot;: \&amp;quot;&amp;quot; + finalmessage + &amp;quot;\&amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}]&amp;quot; +&lt;br /&gt;
 &amp;quot;}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // En-têtes HTTP&lt;br /&gt;
 String headers = String(&amp;quot;POST /v1beta/models/gemini-1.5-flash:generateContent?key=&amp;quot;) + apiKey + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + String(host) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Type: application/json\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Content-Length: &amp;quot; + String(payload.length()) + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 // Envoi de la requête&lt;br /&gt;
 client.print(headers + payload);&lt;br /&gt;
 Serial.println(&amp;quot;Requête envoyée.&amp;quot;);&lt;br /&gt;
 BougerRobot();&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Lire le corps de la réponse&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 client.stop();&lt;br /&gt;
&lt;br /&gt;
 // Afficher la réponse brute&lt;br /&gt;
 //Serial.println(&amp;quot;Réponse brute de l'API :&amp;quot;);&lt;br /&gt;
 String modified = response.substring(5, response.length() - 8);&lt;br /&gt;
 //Serial.println(modified);&lt;br /&gt;
 String messagestr = json(modified);&lt;br /&gt;
 String realmessage = replaceAccents(messagestr);&lt;br /&gt;
 Serial.println(realmessage);&lt;br /&gt;
&lt;br /&gt;
 // Calculer la hauteur totale du texte&lt;br /&gt;
 int lineHeight = 8; // Hauteur d'une ligne de texte&lt;br /&gt;
 int numLines = (realmessage.length() / (SCREEN_WIDTH / 6)) + 1;&lt;br /&gt;
 int textHeight = numLines * lineHeight;&lt;br /&gt;
&lt;br /&gt;
 if (textHeight &amp;lt;= SCREEN_HEIGHT) {&lt;br /&gt;
 // Le texte tient dans l'écran, affichage direct&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0); // Positionner le curseur en haut à gauche&lt;br /&gt;
 display.println(realmessage); // Afficher la variable&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
 } else {&lt;br /&gt;
 // Le texte dépasse, activer le défilement&lt;br /&gt;
 int scrollOffset = 0;&lt;br /&gt;
&lt;br /&gt;
 while (scrollOffset &amp;lt;= textHeight) {&lt;br /&gt;
 display.clearDisplay(); // Effacer l'écran&lt;br /&gt;
 display.setCursor(0, -scrollOffset); // Ajuster le décalage vertical&lt;br /&gt;
 display.println(realmessage); // Dessiner le texte&lt;br /&gt;
 display.display(); // Mettre à jour l'écran&lt;br /&gt;
&lt;br /&gt;
 scrollOffset += 1; // Incrémenter le décalage&lt;br /&gt;
 delay(100); // Ajuster la vitesse du défilement&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // Réinitialiser l'écran après défilement&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.println(&amp;quot;Defilement termine.&amp;quot;); // Affiche un message de fin, si nécessaire&lt;br /&gt;
 display.display();&lt;br /&gt;
 }&lt;br /&gt;
 delay(2000);&lt;br /&gt;
 fetchWeather(url, whost);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fetchWeather(String url, const char* whost) {&lt;br /&gt;
 WiFiClientSecure client;&lt;br /&gt;
 client.setInsecure(); // Désactive la vérification du certificat SSL&lt;br /&gt;
 Serial.print(&amp;quot;Connexion au serveur Meteo...&amp;quot;);&lt;br /&gt;
 if (!client.connect(whost, httpsPort)) {&lt;br /&gt;
 Serial.println(&amp;quot;Échec de la connexion au serveur Meteo.&amp;quot;);&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Envoi de la requête HTTP GET&lt;br /&gt;
 client.print(String(&amp;quot;GET &amp;quot;) + url + &amp;quot; HTTP/1.1\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Host: &amp;quot; + whost + &amp;quot;\r\n&amp;quot; +&lt;br /&gt;
 &amp;quot;Connection: close\r\n\r\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Lecture de la réponse&lt;br /&gt;
 String response = &amp;quot;&amp;quot;;&lt;br /&gt;
 while (client.connected() || client.available()) {&lt;br /&gt;
 String line = client.readStringUntil('\n');&lt;br /&gt;
 if (line == &amp;quot;\r&amp;quot;) break; // Fin des en-têtes&lt;br /&gt;
 }&lt;br /&gt;
 while (client.available()) {&lt;br /&gt;
 response += client.readString();&lt;br /&gt;
 }&lt;br /&gt;
 client.stop();&lt;br /&gt;
 // Analyse de la réponse JSON&lt;br /&gt;
 DynamicJsonDocument doc(1024);&lt;br /&gt;
 DeserializationError error = deserializeJson(doc, response);&lt;br /&gt;
 if (error) {&lt;br /&gt;
 Serial.print(F(&amp;quot;deserializeJson() failed: &amp;quot;));&lt;br /&gt;
 Serial.println(error.f_str());&lt;br /&gt;
 return;&lt;br /&gt;
 }&lt;br /&gt;
 // Extraction des données&lt;br /&gt;
 const char* weatherDescription = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;description&amp;quot;];&lt;br /&gt;
 float temperature = doc[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];&lt;br /&gt;
 const char* icon = doc[&amp;quot;weather&amp;quot;][0][&amp;quot;icon&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
 // Affichage des données sur l'écran OLED&lt;br /&gt;
 display.clearDisplay();&lt;br /&gt;
 display.setCursor(0, 0);&lt;br /&gt;
 display.print(&amp;quot;Meteo a Brest:&amp;quot;);&lt;br /&gt;
 display.setCursor(0, 10);&lt;br /&gt;
 display.print(weatherDescription);&lt;br /&gt;
 display.setCursor(0, 20);&lt;br /&gt;
 display.print(temperature);&lt;br /&gt;
 display.print(&amp;quot; C&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // Affichage de l'icône correspondante&lt;br /&gt;
 display.setCursor(100, 0);&lt;br /&gt;
 if (strstr(weatherDescription, &amp;quot;ensoleille&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;clair&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillCircle(110, 10, 5, SSD1306_WHITE);&lt;br /&gt;
 } else if (strstr(weatherDescription, &amp;quot;nuage&amp;quot;) != nullptr || strstr(weatherDescription, &amp;quot;couvert&amp;quot;) != nullptr) {&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 } else {&lt;br /&gt;
 // Afficher une icône par défaut&lt;br /&gt;
 display.fillRect(105, 5, 15, 10, SSD1306_WHITE);&lt;br /&gt;
 }&lt;br /&gt;
 display.display();&lt;br /&gt;
}&lt;br /&gt;
void BougerRobot() {&lt;br /&gt;
 int compteur = 0;&lt;br /&gt;
 while (compteur &amp;lt; 3) {&lt;br /&gt;
 digitalWrite(D4, HIGH);&lt;br /&gt;
 digitalWrite(D3, HIGH);&lt;br /&gt;
 myservo_2.write(0);&lt;br /&gt;
 delay(1000*1);&lt;br /&gt;
 digitalWrite(D4, LOW);&lt;br /&gt;
 digitalWrite(D3, LOW);&lt;br /&gt;
 myservo_2.write(180);&lt;br /&gt;
 delay(2000*1);&lt;br /&gt;
 compteur++;&lt;br /&gt;
 }&lt;br /&gt;
 compteur = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30199</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30199"/>
				<updated>2025-01-23T14:51:02Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Multipliergnd3.jpg&amp;diff=30195</id>
		<title>Fichier:Multipliergnd3.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Multipliergnd3.jpg&amp;diff=30195"/>
				<updated>2025-01-23T14:50:20Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Multipliergnd3.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Multipliergnd3.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30191</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30191"/>
				<updated>2025-01-23T14:48:47Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30190</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30190"/>
				<updated>2025-01-23T14:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
 &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Multipliergnd2.jpg&amp;diff=30188</id>
		<title>Fichier:Multipliergnd2.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Multipliergnd2.jpg&amp;diff=30188"/>
				<updated>2025-01-23T14:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Multipliergnd2.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Multipliergnd2.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30186</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30186"/>
				<updated>2025-01-23T14:47:54Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30177</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30177"/>
				<updated>2025-01-23T14:46:00Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:Branchementled1.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: center; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Voila comment vous pouvez brancher les LED (on expliquera plus bas pour comment faire avec la masse (G sur la photo)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30176</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30176"/>
				<updated>2025-01-23T14:44:50Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Branchementled1.jpg&amp;diff=30175</id>
		<title>Fichier:Branchementled1.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Branchementled1.jpg&amp;diff=30175"/>
				<updated>2025-01-23T14:43:37Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : Branchementled1.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Branchementled1.jpg&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30174</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30174"/>
				<updated>2025-01-23T14:43:36Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30173</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30173"/>
				<updated>2025-01-23T14:42:38Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30171</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30171"/>
				<updated>2025-01-23T14:42:05Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30163</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30163"/>
				<updated>2025-01-23T14:38:43Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30161</id>
		<title>ENIB 2025 : Les 5 perdu</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2025_:_Les_5_perdu&amp;diff=30161"/>
				<updated>2025-01-23T14:37:51Z</updated>
		
		<summary type="html">&lt;p&gt;Les 5 perdu : /* étape 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #CBF8FF; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center; font-size: 48px; font-weight: bold; background-color: #CBF8FF; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);&amp;quot;&amp;gt;&lt;br /&gt;
La Tortue GPT&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
Nous sommes une équipe de 5 étudiants en école d'ingénieur (ENIB) : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:photo_de_groupe_les_5_perdu.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; margin-top: 15px; padding: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Maxime LE GAC (pull noir)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Tudual DUPUY (pull blanc)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Loan ANDRO (pull gris)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Clément BERTONCINI (pull bordeaux)&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Alexandre LE POULICHET (pull bleu)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Notre objectif durant ces deux jours est de concevoir une tortue capable de répondre à nos questions par oui ou par non à l'aide d'une intelligence artificielle. &lt;br /&gt;
&lt;br /&gt;
==Outil et matériel==&lt;br /&gt;
 &amp;lt;div style=&amp;quot;background-color: #74D0F1; border: 1px solid #000; padding: 10px; margin-top: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 carte D1 mini avec wifi&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; 2 led &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;2 résistances de 220 Ω&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;1 plaque labtec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;fils de connexion &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;carton&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Etapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
===étape 1===&lt;br /&gt;
&lt;br /&gt;
Lors de cette étape, nous réalisons les patrons pour confectionner et assembler la tortue (cliquez sur la photo 1 pour agrandir le modèle de base). Ensuite, nous découpons les patrons en carton pour les pattes et le ventre de la tortue, puis nous pouvons les assembler (photos 2 et 3).&lt;br /&gt;
&lt;br /&gt;
Une fois les pattes et le ventre terminés, vous pouvez découper le patron de la tête de la tortue et faire un trou d'environ 5mm de diamètre pour laisser passer le bout de plastique (comme illustré sur la photo 4).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez découper le ventre de la tortue et coller la plaque Labtec ainsi que le cerveau moteur, comme montré sur la photo 5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=200 heights=200&amp;gt;&lt;br /&gt;
Fichier:10a72ded-b231-45fc-b0a8-ecf688245353.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 1&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:patron_carton_patte.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 2&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:corps_pattes_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 3&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_patron_tete_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 4&amp;lt;/div&amp;gt;&lt;br /&gt;
Fichier:Photo_carapace_tortue.jpg|&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;Photo 5&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 2===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant, vous pouvez réaliser le circuit comme indiqué ci-contre sur le schéma de la plaque Labtec. Nous utilisons des résistances de 220 ohms pour éviter de court-circuiter les LED &lt;br /&gt;
(c'est une sécurité). N'oubliez pas de faire des trous pour laisser passer les câbles qui alimenteront les LED. Vous devez aussi faire un trou comme sur la photo 1 pour mettre l'écran (vous &lt;br /&gt;
pouvez choisir l'emplacement).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:trou_carapace.jpg|200px|''carapace vu intérieur'' (Photo 1)&lt;br /&gt;
      File:carapace_ouverte_circuit fermé.jpg|200px|''Photo2'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 3===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  [[Fichier:tete_tortue_finis.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avant de refermer la tête de la tortue, vous pouvez faire un trou d'environ 3mm de diamètre dans le carton pour les LED et coller les câbles Male-Female aux LED à l'aide de colle chaude, comme indiqué sur le circuit. (Attention, la tige la plus grande est le + donc à ne pas relier à la masse, le fil noir.) &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Bonus : vous pouvez colorier des morceaux de papier en vert et les coller sur la tête.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 4===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:tete_carapace.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini toutes les étapes précédentes, vous pouvez relier la tête et le corps de la tortue à l'aide d'une attache ou d'une charnière pour que cette dernière puisse tourner la tête. (N'oubliez pas de faire un trou dans la tête pour laisser passer les câbles qui allument les LED.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 5===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:ventre_tortue_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Vous pouvez coller le ventre de la tortue à la carapace à l'aide d'un pistolet à colle chaude basse température (voir photo résultat). Veillez à bien aligner les deux parties avant de coller pour un résultat esthétique. (Notez que le ventre est important, car il empêche la tête de toucher le sol.)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 6===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden; display: flex; align-items: flex-start;height: 270px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
Maintenant, tu peux réaliser le patron et, une fois découpé, tu peux le décorer. Pour cela, découpe des morceaux de papier et colle-les sur le carton à l'aide d'un bâton de colle. Tu vas devoir adapter les dimensions des patrons précédents et les colorier comme tu le souhaites !&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;width: 50%; margin-left: 10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gallery mode=&amp;quot;packed-hover&amp;quot;  heights=200 widths=200&amp;gt;&lt;br /&gt;
      File:coloriage_1.jpg|200px|''décoration des pattes''&lt;br /&gt;
      File:coloriage_2.jpg|200px|''décoration carapace'' &lt;br /&gt;
    &amp;lt;/gallery&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===étape 7===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 8===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 9===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow: hidden;height: 200px; &amp;quot;&amp;gt;&lt;br /&gt;
  [[File:photo_pattes_coller.jpg|right|200px|Légende de l'image]]&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: flex; flex-direction: column; justify-content: space-between; height: 100%;&amp;quot;&amp;gt;&lt;br /&gt;
Une fois que vous avez fini de décorer les pattes, vous pouvez les coller avec un pistolet à colle sur le ventre de la tortue en respectant la symétrie. (Maintenant votre tortue est presque prête !!!)&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
===étape 18===&lt;br /&gt;
C'est parti pour la programmation ! Première étape : installez Arduino IDE puis les bibliothèques requises (vous les trouverez facilement dans la section &amp;quot;Sources&amp;quot;). Assurez vous bien d'avoir toutes les bibliothèques qui se trouvent au début du code ce sont les #include. Le code source est prêt à l'emploi, avec toutes les bibliothèques incluses. Vérifiez bien que votre installation correspond au code. N'hésitez pas à explorer le code et à vous appuyer sur la documentation de l'ESP8266 pour approfondir et toutes les sources disponibles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Troubleshouting===&lt;br /&gt;
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
Nous avons rencontré de nombreux problèmes, notamment au niveau du code :&lt;br /&gt;
&amp;lt;li&amp;gt;	1.	Gestion des librairies Arduino :&lt;br /&gt;
	•	Difficultés à intégrer correctement toutes les bibliothèques nécessaires dans le code.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    2.	Connexion au réseau Wi-Fi :&lt;br /&gt;
	•	Configuration de l’identifiant et des paramètres du Wi-Fi pour assurer une connexion stable à l’API.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    3.	Lecture des requêtes JSON :&lt;br /&gt;
	•	Problèmes rencontrés lors de l’analyse et du traitement des données JSON issues des requêtes.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;    4.	Filtrage des réponses :&lt;br /&gt;
	•	Challenge lié à l’affichage de la réponse souhaitée.&lt;br /&gt;
	•	Nous recevions beaucoup d’informations inutiles sur le moniteur série, car l’intégralité de la requête JSON s’affichait, rendant l’extraction des données pertinentes plus complexe.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* [Documentation technique de l'ESP8266 — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation https://arduino-esp8266.readthedocs.io/en/latest/]&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ArduinoJson sur GitHub https://github.com/bblanchon/ArduinoJson]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Bibliothèque ESP8266HTTPClient sur GitHub https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [Installer l'ESP8266 sur Arduino https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino]&lt;br /&gt;
&lt;br /&gt;
* [Installer Arduino https://www.arduino.cc/en/software]&lt;br /&gt;
&lt;br /&gt;
* [Toutes les bibliothèques disponibles de Arduino https://www.arduinolibraries.info/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Elément de présentation==&lt;br /&gt;
je met ici le document de présentation de mon projet&lt;br /&gt;
&lt;br /&gt;
==fichiers à joindre==&lt;br /&gt;
code, ficher d'impression 3D, de découpe laser ou vinyle, ...&lt;br /&gt;
===Mettre du code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; &amp;gt; &lt;br /&gt;
#define PIN 9&lt;br /&gt;
#include &amp;lt;Arduino_GFX_Library.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // put your main code here, to run repeatedly:&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ne pas modifier sous cette ligne==&lt;br /&gt;
[[Catégorie:Enib2024]]&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2025]]&lt;/div&gt;</summary>
		<author><name>Les 5 perdu</name></author>	</entry>

	</feed>