ENIB 2026 : Devin'Temp : Différence entre versions
(→Troubleshouting) |
(→Mettre du code Arduino) |
||
| (4 révisions intermédiaires par 2 utilisateurs non affichées) | |||
| Ligne 30 : | Ligne 30 : | ||
==Fichiers à joindre== | ==Fichiers à joindre== | ||
[[Fichier:Devin’Temp Présentation PowerPoint.pdf]] | [[Fichier:Devin’Temp Présentation PowerPoint.pdf]] | ||
| + | |||
| + | [[Fichier:Devin temp_présentation_projet.pdf]] | ||
===Mettre du code Arduino=== | ===Mettre du code Arduino=== | ||
<syntaxhighlight lang="Arduino" line> | <syntaxhighlight lang="Arduino" line> | ||
| Ligne 35 : | Ligne 37 : | ||
#include <Arduino_GFX_Library.h> | #include <Arduino_GFX_Library.h> | ||
| + | #include <WiFi.h> | ||
| + | #include <HTTPClient.h> | ||
| + | #include <AccelStepper.h> | ||
| + | #define FULLSTEP 4 | ||
| + | #define STEP_PER_REVOLUTION 2048 // this value is from datasheet | ||
| + | |||
| + | // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence | ||
| + | AccelStepper stepper(FULLSTEP, 25, 19, 21, 18); | ||
| + | |||
| + | // WiFi | ||
| + | const char* ssid = "iPhone"; | ||
| + | const char* password = "Louis1342"; | ||
| + | |||
| + | // API météo | ||
| + | int debut =0; | ||
| + | String apiKey = "f888dbc5f27c4338aae48889a8ca6e96"; | ||
| + | String city = "Guilers"; | ||
| + | int valeur_bouton, valeur_bouton_2, valeur_bouton_3, valeur_bouton_4, temp = 1, bouton_choisi = 1; | ||
| + | int temperature; | ||
void setup() { | void setup() { | ||
| − | // | + | stepper.setMaxSpeed(1000.0); // set the maximum speed |
| + | stepper.setAcceleration(50.0); // set acceleration | ||
| + | stepper.setSpeed(200); // set initial speed | ||
| + | stepper.setCurrentPosition(0); // set position | ||
| + | stepper.moveTo(STEP_PER_REVOLUTION); // set target position: 64 steps <=> one revolution | ||
| + | Serial.begin(115200); | ||
| + | pinMode(26, INPUT); | ||
| + | pinMode(13, INPUT); | ||
| + | pinMode(14, INPUT); | ||
| + | pinMode(35, INPUT); | ||
| + | pinMode(34, INPUT); | ||
| + | pinMode(33, OUTPUT); | ||
| + | pinMode(4, OUTPUT); | ||
| + | pinMode(18, OUTPUT); | ||
| + | pinMode(19, OUTPUT); | ||
| + | pinMode(21, OUTPUT); | ||
| + | pinMode(23, INPUT); | ||
| + | WiFi.begin(ssid, password); | ||
| + | Serial.print("Connexion WiFi"); | ||
| + | |||
| + | while (WiFi.status() != WL_CONNECTED) { | ||
| + | delay(500); | ||
| + | Serial.print("."); | ||
| + | } | ||
| + | Serial.println("\nWiFi connecté !"); | ||
} | } | ||
void loop() { | void loop() { | ||
| − | // | + | if (temp) { |
| + | if (WiFi.status() == WL_CONNECTED) { | ||
| + | HTTPClient http; | ||
| + | |||
| + | String url = "https://api.openweathermap.org/data/2.5/weather?q=" | ||
| + | + city + | ||
| + | "&units=metric&appid=" + apiKey; | ||
| + | |||
| + | http.begin(url); | ||
| + | int httpCode = http.GET(); | ||
| + | |||
| + | if (httpCode > 0) { | ||
| + | String payload = http.getString(); | ||
| + | |||
| + | // --- Extraction MANUELLE de la température --- | ||
| + | int indexTemp = payload.indexOf("\"temp\":"); | ||
| + | if (indexTemp != -1) { | ||
| + | int start = indexTemp + 7; // après "temp": | ||
| + | int end = payload.indexOf(",", start); | ||
| + | String tempStr = payload.substring(start, end); | ||
| + | temperature = tempStr.toFloat()*100; | ||
| + | Serial.println(temperature); | ||
| + | } else { | ||
| + | Serial.println("Température non trouvée"); | ||
| + | } | ||
| + | } else { | ||
| + | Serial.println("Erreur HTTP"); | ||
| + | } | ||
| + | |||
| + | http.end(); | ||
| + | } | ||
| + | temp = 0; | ||
| + | |||
| + | } | ||
| + | valeur_bouton = digitalRead(13); | ||
| + | |||
| + | valeur_bouton_2 = digitalRead(26); | ||
| + | valeur_bouton_3 = digitalRead(14); | ||
| + | valeur_bouton_4 = digitalRead(35); | ||
| + | if (digitalRead(13) == 1) { | ||
| + | bouton_choisi = 1; | ||
| + | } | ||
| + | else if (digitalRead(26) == 1) { | ||
| + | bouton_choisi = 2; | ||
| + | } | ||
| + | else if (digitalRead(14) == 1) { | ||
| + | bouton_choisi = 3; | ||
| + | } | ||
| + | else if (digitalRead(35) == 1) { | ||
| + | bouton_choisi = 4; | ||
| + | } | ||
| + | if (temperature < 500 && bouton_choisi == 1){ | ||
| + | digitalWrite(4, HIGH); | ||
| + | digitalWrite(33, LOW); | ||
| + | } | ||
| + | else if (500 <= temperature && temperature <1000 && bouton_choisi == 2){ | ||
| + | digitalWrite(4, HIGH); | ||
| + | digitalWrite(33, LOW); | ||
| + | } | ||
| + | else if (1000 <= temperature && temperature < 1500 && bouton_choisi == 3){ | ||
| + | digitalWrite(4, HIGH); | ||
| + | digitalWrite(33, LOW); | ||
| + | } | ||
| + | else if (1500 <= temperature && bouton_choisi == 4){ | ||
| + | digitalWrite(4, HIGH); | ||
| + | digitalWrite(33, LOW); | ||
| + | } | ||
| + | else{ | ||
| + | digitalWrite(4, LOW); | ||
| + | digitalWrite(33, HIGH); | ||
| + | } | ||
} | } | ||
| Ligne 114 : | Ligne 229 : | ||
===Troubleshouting=== | ===Troubleshouting=== | ||
| − | Quelles sont difficultés, les problèmes, | + | Quelles sont les difficultés rencontrées, les problèmes, les solutions, ainsi que les trucs et astuces pour que cela fonctionne ? |
| − | Premièrement, nous avons rencontré des difficultés pour réaliser les conditions | + | <br /><br /> |
| + | Premièrement, nous avons rencontré des difficultés pour réaliser les conditions permettant d’allumer la bonne LED en fonction de la température sélectionnée. Ce problème venait du fait qu’en langage Arduino, il n’est pas possible d’encadrer directement une variable par des conditions comme nous l’avions initialement prévu. Nous avons donc modifié la logique du test en séparant les deux conditions. Notre code est ainsi redevenu fonctionnel. | ||
| + | <br /><br /> | ||
| + | Deuxièmement, nous avons rencontré un problème lors de l’utilisation du servomoteur. En effet, celui-ci ne possède pas de position de départ relative. Nous avons donc fait le choix d’utiliser un moteur à incrémentation. | ||
| + | <br /> | ||
| + | Au départ, nous avons testé l’ajout d’un contacteur afin de détecter lorsqu’un tour complet était effectué, ce qui nous aurait permis de gérer la direction de l’aiguille vers la bonne météo. | ||
| + | <br /> | ||
| + | Cependant, cette solution ne fonctionnait pas correctement car le contact était trop court. | ||
| + | <br /> | ||
| + | Nous avons alors opté pour une nouvelle idée : ajouter un morceau de cuivre (matériau conducteur) afin d’obtenir une surface de contact plus grande lorsque les deux fils se croisent. | ||
| + | <br /> | ||
| + | Cette solution nous a permis de résoudre le problème. Désormais, lorsque le programme se lance, le servomoteur tourne jusqu’à ce que les deux contacteurs se touchent. | ||
<br /> | <br /> | ||
| − | + | Nous avons ainsi déterminé une position 0. | |
| − | + | <br /><br /> | |
| − | + | Troisièmement, nous avons rencontré un problème de manque de temps, car deux camarades sur les trois initiaux ne pouvaient pas être présents l’après-midi du 22/01/2026. | |
| − | |||
| − | |||
| − | |||
<br /> | <br /> | ||
| − | + | Nous n’avons malheureusement pas pu aller jusqu’au bout du projet. | |
| − | Nous | ||
==Sources et documentation complémentaire== | ==Sources et documentation complémentaire== | ||
| Ligne 143 : | Ligne 265 : | ||
Première présentation 21/01/2026 : [[Fichier:Devin’Temp Présentation PowerPoint.pdf]] | Première présentation 21/01/2026 : [[Fichier:Devin’Temp Présentation PowerPoint.pdf]] | ||
<br /> | <br /> | ||
| − | Seconde présentation 22/01/2026 : | + | Seconde présentation 22/01/2026 : [[Fichier:Devin temp_présentation_projet.pdf]] |
==Ne pas modifier sous cette ligne== | ==Ne pas modifier sous cette ligne== | ||
[[Catégorie:Enib2026]] | [[Catégorie:Enib2026]] | ||
Version actuelle datée du 22 janvier 2026 à 16:55
Titre de la fiche expérience :
Sommaire
Description (résumé)
Dans cette page dédiée à notre projet Devin'Temp, vous trouverez les ressources que nous avons utilisées pour le concevoir.
Vous trouverez également un guide retraçant les différentes étapes que nous avons effectuées.
Ce projet s’est déroulé sur deux journées entières.
Introduction
Dans le cadre du projet du Hackathon avec l'ENIB, nous devons réaliser un projet concret en deux jours pour faire de la médiation scientifique.
Pour se faire, nous avons deux jours pour réaliser les différentes étapes allant de la conception de l'idée à son élaboration.
Notre projet Devin'Temp consiste à réaliser un petit jeu permettant de deviner la température extérieur à Brest : si la bonne température est trouvée, l'aiguille du cerveau moteur pointera vers la météo actuelle.
![]()
Photo de l'Equipe Devin'Temp
Outil et matériel
Lors de ce projet, nous allons utiliser :
-Une plaque labdec
-Une carte ESP32
-Trois bouton poussoir
-Une led rouge
-Une led jaune
-Un moteur 28BYJ-48
-Des câbles éléctriques
-Un morceau de carton
-Une feuille de papier
-Plusieurs feutres
Fichiers à joindre
Fichier:Devin’Temp Présentation PowerPoint.pdf
Fichier:Devin temp présentation projet.pdf
Mettre du code Arduino
1
2 #define PIN 9
3 #include <Arduino_GFX_Library.h>
4
5 #include <WiFi.h>
6 #include <HTTPClient.h>
7 #include <AccelStepper.h>
8 #define FULLSTEP 4
9 #define STEP_PER_REVOLUTION 2048 // this value is from datasheet
10
11 // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
12 AccelStepper stepper(FULLSTEP, 25, 19, 21, 18);
13
14 // WiFi
15 const char* ssid = "iPhone";
16 const char* password = "Louis1342";
17
18 // API météo
19 int debut =0;
20 String apiKey = "f888dbc5f27c4338aae48889a8ca6e96";
21 String city = "Guilers";
22 int valeur_bouton, valeur_bouton_2, valeur_bouton_3, valeur_bouton_4, temp = 1, bouton_choisi = 1;
23 int temperature;
24 void setup() {
25 stepper.setMaxSpeed(1000.0); // set the maximum speed
26 stepper.setAcceleration(50.0); // set acceleration
27 stepper.setSpeed(200); // set initial speed
28 stepper.setCurrentPosition(0); // set position
29 stepper.moveTo(STEP_PER_REVOLUTION); // set target position: 64 steps <=> one revolution
30 Serial.begin(115200);
31 pinMode(26, INPUT);
32 pinMode(13, INPUT);
33 pinMode(14, INPUT);
34 pinMode(35, INPUT);
35 pinMode(34, INPUT);
36 pinMode(33, OUTPUT);
37 pinMode(4, OUTPUT);
38 pinMode(18, OUTPUT);
39 pinMode(19, OUTPUT);
40 pinMode(21, OUTPUT);
41 pinMode(23, INPUT);
42 WiFi.begin(ssid, password);
43 Serial.print("Connexion WiFi");
44
45 while (WiFi.status() != WL_CONNECTED) {
46 delay(500);
47 Serial.print(".");
48 }
49
50 Serial.println("\nWiFi connecté !");
51 }
52
53 void loop() {
54 if (temp) {
55 if (WiFi.status() == WL_CONNECTED) {
56 HTTPClient http;
57
58 String url = "https://api.openweathermap.org/data/2.5/weather?q="
59 + city +
60 "&units=metric&appid=" + apiKey;
61
62 http.begin(url);
63 int httpCode = http.GET();
64
65 if (httpCode > 0) {
66 String payload = http.getString();
67
68 // --- Extraction MANUELLE de la température ---
69 int indexTemp = payload.indexOf("\"temp\":");
70 if (indexTemp != -1) {
71 int start = indexTemp + 7; // après "temp":
72 int end = payload.indexOf(",", start);
73 String tempStr = payload.substring(start, end);
74 temperature = tempStr.toFloat()*100;
75 Serial.println(temperature);
76 } else {
77 Serial.println("Température non trouvée");
78 }
79 } else {
80 Serial.println("Erreur HTTP");
81 }
82
83 http.end();
84 }
85 temp = 0;
86
87 }
88 valeur_bouton = digitalRead(13);
89
90 valeur_bouton_2 = digitalRead(26);
91 valeur_bouton_3 = digitalRead(14);
92 valeur_bouton_4 = digitalRead(35);
93 if (digitalRead(13) == 1) {
94 bouton_choisi = 1;
95 }
96 else if (digitalRead(26) == 1) {
97 bouton_choisi = 2;
98 }
99 else if (digitalRead(14) == 1) {
100 bouton_choisi = 3;
101 }
102 else if (digitalRead(35) == 1) {
103 bouton_choisi = 4;
104 }
105
106 if (temperature < 500 && bouton_choisi == 1){
107 digitalWrite(4, HIGH);
108 digitalWrite(33, LOW);
109 }
110 else if (500 <= temperature && temperature <1000 && bouton_choisi == 2){
111 digitalWrite(4, HIGH);
112 digitalWrite(33, LOW);
113 }
114 else if (1000 <= temperature && temperature < 1500 && bouton_choisi == 3){
115 digitalWrite(4, HIGH);
116 digitalWrite(33, LOW);
117 }
118 else if (1500 <= temperature && bouton_choisi == 4){
119 digitalWrite(4, HIGH);
120 digitalWrite(33, LOW);
121 }
122 else{
123 digitalWrite(4, LOW);
124 digitalWrite(33, HIGH);
125 }
126 }
Etapes de fabrication
Etape 1 : La Recherche d'idée
Premièrement, nous avons commencé par lister nos premières idées. A l'aide d'un brainstorming nous avons mis l'ensemble des éléments qui nous venaient en tête en rapport avec le sujet.
Puis nous avons rédigé une première description du fonctionnement de notre projet.
![]()
Puis, aprés un échange avec Nadia, une intervenante nous avons modifier notre fonctionnement final qui est le suivant :
Le système récupère automatiquement, via une clé API météo, la température actuelle de la ville de Brest.
Les participants doivent deviner dans quelle zone de température se situe la température réelle, puis appuyer sur le bouton correspondant.
Les trois boutons poussoirs représentent chacun une plage de température indiqué:
Bouton 1 : température inférieure ou égale à 5 °C
Bouton 2 : température comprise entre 5 °C et 10 °C
Bouton 3 : température comprise entre 10 °C et 15 °C
Bouton 4 : température supérieure ou égale à 15 °C
Fonctionnement du système :
Si le participant appuie sur un mauvais bouton :
La LED rouge s’allume.
Aucune autre action ne se produit : cela indique que la température sélectionnée est incorrecte.
Si le participant appuie sur le bon bouton :
La LED verte s’allume et le servomoteur s’active. Le servomoteur possède un aiguille qui pointera en direction de la méteo actuelle.
Etape 2
Pour cette seconde étape, nous avons commencé à regarder la documentation technique afin de s'approprier le fonctionnement de la connectivité entre la carte ESP32 et notre ordinateur.
Puis, nous avons commencé le câblage de notre circuit, en commençant par câbler les LED et les boutons poussoirs.
Etape 3
Ensuite, nous avons commencé à connecter l'API à notre programme afin de recevoir la température en temps réel de la ville de Brest.
Puis, nous avons réussi à connecter les 4 boutons poussoirs et faire fonctionner notre idée : si le bon bouton poussoir correspondant à la bonne température est appuyée la LED verte s'allume.
Dans le cas contraire, la LED rouge s'allume.
Etape 4
Lors de cette 4ème étape, nous avons réalisé le support contenant l'ensemble des états de météo existant.
Pour ce faire, nous avons utilisé un morceau de carton et imprimé des images de météo.
![]()
![]()
Etape 5
Nous avons continué par coder le moteur. Nous avons ajouté un contacteur afin de gérer la position du moteur en temps réel. Cela permet que l'aiguille s'arrête devant le bon état de météo.
En parallèle, nous avons continué à cabler le montage en ajoutant le système d'aiguille avec le support.
Troubleshouting
Quelles sont les difficultés rencontrées, les problèmes, les solutions, ainsi que les trucs et astuces pour que cela fonctionne ?
Premièrement, nous avons rencontré des difficultés pour réaliser les conditions permettant d’allumer la bonne LED en fonction de la température sélectionnée. Ce problème venait du fait qu’en langage Arduino, il n’est pas possible d’encadrer directement une variable par des conditions comme nous l’avions initialement prévu. Nous avons donc modifié la logique du test en séparant les deux conditions. Notre code est ainsi redevenu fonctionnel.
Deuxièmement, nous avons rencontré un problème lors de l’utilisation du servomoteur. En effet, celui-ci ne possède pas de position de départ relative. Nous avons donc fait le choix d’utiliser un moteur à incrémentation.
Au départ, nous avons testé l’ajout d’un contacteur afin de détecter lorsqu’un tour complet était effectué, ce qui nous aurait permis de gérer la direction de l’aiguille vers la bonne météo.
Cependant, cette solution ne fonctionnait pas correctement car le contact était trop court.
Nous avons alors opté pour une nouvelle idée : ajouter un morceau de cuivre (matériau conducteur) afin d’obtenir une surface de contact plus grande lorsque les deux fils se croisent.
Cette solution nous a permis de résoudre le problème. Désormais, lorsque le programme se lance, le servomoteur tourne jusqu’à ce que les deux contacteurs se touchent.
Nous avons ainsi déterminé une position 0.
Troisièmement, nous avons rencontré un problème de manque de temps, car deux camarades sur les trois initiaux ne pouvaient pas être présents l’après-midi du 22/01/2026.
Nous n’avons malheureusement pas pu aller jusqu’au bout du projet.
Sources et documentation complémentaire
- Rédаctiоn et illustratiоn :
La rédaction, ainsi que les photos ont été réalisé par notre secrétaire Pierre MERLET. Elles sont donc libre de droit.
- Prоgrammаtiоn :
En сe qui cоncernе la prоgrаmmatiоn, nous avons utilisé de la documentation pour comprendre comment l'API fonctionne sur Arduino :
ESP32 HTTP GET and HTTP POST with Arduino IDE (JSON, URL Encoded, Text) - https://randomnerdtutorials.com/esp32-http-get-post-arduino
Rest API: HTTP GET Request - https://forum.arduino.cc/t/rest-api-http-get-request
- Transpаrence et dосumеntatiоn :
Nous n'avons pas utilisé l'IA pour réaliser le programme.
Elément de présentation
Première présentation 21/01/2026 : Fichier:Devin’Temp Présentation PowerPoint.pdf
Seconde présentation 22/01/2026 : Fichier:Devin temp présentation projet.pdf