ENIB 2026 : Cumulonimbus 3000 : Différence entre versions
(→outil et matériel) |
(→description (résumé)) |
||
| (36 révisions intermédiaires par 3 utilisateurs non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
Titre de la fiche expérience : | Titre de la fiche expérience : | ||
==description (résumé)== | ==description (résumé)== | ||
| − | + | Schéma Interface | |
| − | [[Fichier: | + | [[Fichier:Interface.jpg|300px]] |
==Introduction== | ==Introduction== | ||
| + | C'est une machine qui permet de connaître s'il fait jour ou nuit, la température extérieure, la vitesse du vent et la direction du vent. | ||
| − | + | ==outil et matériel== | |
| + | Matériel utilisé: | ||
| + | * 1 carte ESP32 | ||
| + | * 1 servomoteur 180° | ||
| + | * 1 servomoteur 360° | ||
| + | * 1 LED RGB | ||
| + | * 2 LED diode (une bleu, une jaune) | ||
| + | * 1 Breadboard | ||
| + | * des cables | ||
| + | * du carton et/ou bien du bois pour découpe laser | ||
| + | * une batterie 5V (optionnel si branchement prise) | ||
| − | + | Outils necessaires: | |
| − | * | + | * 1 ordinateur |
| − | * | + | * une source Internet via WiFi |
| − | * | + | * une source de courant 5V |
==fichiers à joindre== | ==fichiers à joindre== | ||
| Ligne 18 : | Ligne 29 : | ||
===Mettre du code Arduino=== | ===Mettre du code Arduino=== | ||
<syntaxhighlight lang="Arduino" line> | <syntaxhighlight lang="Arduino" line> | ||
| − | # | + | #include <ArduinoJson.h> |
| − | #include < | + | #include <WiFi.h> |
| + | #include <HTTPClient.h> | ||
| + | #include <ESP32Servo.h> | ||
| + | |||
| + | Servo myServo; | ||
| + | const int servoPin = 25; | ||
| + | const char* ssid = "11pp"; | ||
| + | const char* password = "eliotduplaix"; | ||
| + | String payload = ""; | ||
| + | String payload2 = ""; | ||
| + | int is_day; | ||
| + | const int ledPin = 18; | ||
| + | |||
void setup() { | void setup() { | ||
| − | // | + | myServo.setPeriodHertz(50); //setup du moteur |
| + | myServo.attach(servoPin, 500, 2500); | ||
| + | pinMode(2, OUTPUT);//led jaune | ||
| + | pinMode(13, OUTPUT);//led bleu | ||
| + | |||
| + | Serial.begin(115200); | ||
| + | delay(1000); | ||
| + | |||
| + | WiFi.begin(ssid, password); //connection wifi | ||
| + | |||
| + | while (WiFi.status() != WL_CONNECTED) { | ||
| + | delay(500); | ||
| + | Serial.print("."); | ||
| + | |||
| + | } | ||
| + | |||
| + | Serial.println("\nConnecté au WiFi !"); | ||
| + | Serial.print("Adresse IP : "); | ||
| + | Serial.println(WiFi.localIP()); | ||
| + | |||
| + | /////////////////////////////////////////////////////////////////////////////////// | ||
| + | |||
| + | |||
| + | |||
| + | if (WiFi.status() == WL_CONNECTED) { | ||
| + | HTTPClient http; | ||
| + | |||
| + | http.begin("https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t_weather=true"); // recupération des données sur | ||
| + | int httpCode = http.GET(); | ||
| + | //repertoire d'api | ||
| + | // https://api.meteomatics.com/2026-01-19T15:00:00.000+01:00/t_2m:C/48.4595521,-4.5689169_48.3572972,-4.4278311:0.1,0.1/html_map?model=mix | ||
| + | // https://api.meteomatics.com/2026-01-19T15:00:00.000+01:00/t_2m:C/48.3905283,-4.4860088/html?model=mix | ||
| + | // https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t_weather=true | ||
| + | // https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400 | ||
| + | if (httpCode > 0) { //recupération des données dans payload | ||
| + | payload = http.getString(); | ||
| + | Serial.println("Réponse API :"); | ||
| + | Serial.println(payload); | ||
| + | } else { | ||
| + | Serial.println("Erreur HTTP"); | ||
| + | payload = "None"; | ||
| + | } | ||
| + | |||
| + | http.end(); | ||
| + | } | ||
| + | /////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| + | JsonDocument doc; | ||
| + | const char* json = payload.c_str(); | ||
| + | DeserializationError error = deserializeJson(doc, json); | ||
| + | |||
| + | |||
| + | |||
| + | if (error) { | ||
| + | Serial.print(F("deserializeJson() failed: ")); //verification si erreur | ||
| + | Serial.println(error.f_str()); | ||
| + | return; | ||
| + | } | ||
| + | double latitude = doc["latitude"]; | ||
| + | double longitude = doc["longitude"]; | ||
| + | float temperature = doc["current_weather"]["temperature"]; //recuperation température | ||
| + | float windspeed = doc["current_weather"]["windspeed"]; //recuperation vitesse du vent | ||
| + | int winddirection = doc["current_weather"]["winddirection"]; // recuperation direction du vent | ||
| + | |||
| + | // affichage de toutes les valeurs | ||
| + | Serial.println(latitude,2); | ||
| + | Serial.println(longitude,2); | ||
| + | Serial.println(temperature); | ||
| + | Serial.println(windspeed); | ||
| + | Serial.println(winddirection); | ||
| + | |||
| + | if (WiFi.status() == WL_CONNECTED) { | ||
| + | HTTPClient http; | ||
| + | |||
| + | http.begin("https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t=is_day"); // api pour le jour | ||
| + | int httpCode2 = http.GET(); | ||
| + | |||
| + | if (httpCode2 > 0) { | ||
| + | payload2 = http.getString(); | ||
| + | Serial.println("Réponse API :"); | ||
| + | Serial.println(payload2); | ||
| + | } else { | ||
| + | Serial.println("Erreur HTTP"); | ||
| + | payload2 = "None"; | ||
| + | } | ||
| + | |||
| + | http.end(); | ||
| + | } | ||
| + | JsonDocument doc2; | ||
| + | const char* json2 = payload2.c_str(); | ||
| + | DeserializationError error2 = deserializeJson(doc2, json2); | ||
| + | |||
| + | if (error2) { | ||
| + | Serial.print(F("deserializeJson() failed: ")); | ||
| + | Serial.println(error2.f_str()); | ||
| + | return; | ||
| + | } | ||
| + | is_day = doc2["current"]["is_day"]; //recuperation de si il fait jour ou non (1 il fait jour 0 il fait nuit) | ||
| + | |||
| + | Serial.println(is_day); | ||
} | } | ||
void loop() { | void loop() { | ||
| − | // | + | if (is_day == 1){ |
| + | digitalWrite(4,HIGH); // affichage led jaune pour le jour | ||
| + | digitalWrite(13,LOW); | ||
| + | } | ||
| + | else if (is_day == 0){ | ||
| + | digitalWrite(4,LOW); | ||
| + | digitalWrite(13,HIGH); // affichage led jaune pour la nuit | ||
| + | } | ||
| + | //partie moteur (on fait bouger le moteur) | ||
| + | myServo.write(0); | ||
| + | delay(1000); | ||
| + | |||
| + | myServo.write(90); | ||
| + | delay(1000); | ||
| + | |||
} | } | ||
| Ligne 34 : | Ligne 169 : | ||
==étapes de fabrication== | ==étapes de fabrication== | ||
| − | |||
===étape 1=== | ===étape 1=== | ||
| + | Découper une boite en carton pour représenter la machine. | ||
| + | Il faut laisser de l'espace à l'intérieur pour pouvoir mettre le matériel électronique | ||
| + | |||
===étape 2=== | ===étape 2=== | ||
| − | ===étape ...=== | + | Faire une découpe laser du roue crantée |
| + | |||
| + | [[Fichier:Roue crantée.png|200px]] | ||
| + | |||
| + | ===étape 3=== | ||
| + | Programmer la carte esp32 avec Arduino. | ||
| + | Il faut: | ||
| + | |||
| + | 1) Un programme pour allumer les leds jaunes et bleue en fonction de s'il fait jour ou nuit. | ||
| + | |||
| + | 2) Un programme pour allumer la led RGB en fonction de la vitesse du vent. | ||
| + | |||
| + | 3) Un programme pour faire tourner un servomoteur en 360°. | ||
| + | Il fera tourner une flèche pour indiquer la direction du vent.* | ||
| + | |||
| + | 4) Un programme pour faire tourner un servomoteur en 180°. | ||
| + | Il fera tourner une roue crantée pour faire lever un bout de carton qui représente la température extérieure. | ||
| + | |||
| + | ===étape 4=== | ||
| + | Câbler les différentes parties. | ||
| + | 1) Faire fonctionner les leds bleue et jaune | ||
| + | |||
| + | [[Fichier:Câble pour les leds.jpg|200px]] | ||
| + | |||
| + | 2) Faire fonctionner la led RGB. Elle doit changer de couleur entre le bleue et le jaune en passant par le vert. | ||
| + | La couleur dépend de la vitesse du vent. | ||
| + | |||
===Troubleshouting=== | ===Troubleshouting=== | ||
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ? | Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ? | ||
-installation et mise en marche de l'ESP32 | -installation et mise en marche de l'ESP32 | ||
| + | |||
| + | -problème de téléversement du code. | ||
==Sources et documentation complémentaire== | ==Sources et documentation complémentaire== | ||
Version actuelle datée du 20 janvier 2026 à 16:01
Titre de la fiche expérience :
Sommaire
description (résumé)
Schéma Interface
Introduction
C'est une machine qui permet de connaître s'il fait jour ou nuit, la température extérieure, la vitesse du vent et la direction du vent.
outil et matériel
Matériel utilisé:
- 1 carte ESP32
- 1 servomoteur 180°
- 1 servomoteur 360°
- 1 LED RGB
- 2 LED diode (une bleu, une jaune)
- 1 Breadboard
- des cables
- du carton et/ou bien du bois pour découpe laser
- une batterie 5V (optionnel si branchement prise)
Outils necessaires:
- 1 ordinateur
- une source Internet via WiFi
- une source de courant 5V
fichiers à joindre
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
Mettre du code Arduino
1
2 #include <ArduinoJson.h>
3 #include <WiFi.h>
4 #include <HTTPClient.h>
5 #include <ESP32Servo.h>
6
7 Servo myServo;
8 const int servoPin = 25;
9 const char* ssid = "11pp";
10 const char* password = "eliotduplaix";
11 String payload = "";
12 String payload2 = "";
13 int is_day;
14 const int ledPin = 18;
15
16
17 void setup() {
18 myServo.setPeriodHertz(50); //setup du moteur
19 myServo.attach(servoPin, 500, 2500);
20 pinMode(2, OUTPUT);//led jaune
21 pinMode(13, OUTPUT);//led bleu
22
23 Serial.begin(115200);
24 delay(1000);
25
26 WiFi.begin(ssid, password); //connection wifi
27
28 while (WiFi.status() != WL_CONNECTED) {
29 delay(500);
30 Serial.print(".");
31
32 }
33
34 Serial.println("\nConnecté au WiFi !");
35 Serial.print("Adresse IP : ");
36 Serial.println(WiFi.localIP());
37
38 ///////////////////////////////////////////////////////////////////////////////////
39
40
41
42 if (WiFi.status() == WL_CONNECTED) {
43 HTTPClient http;
44
45 http.begin("https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t_weather=true"); // recupération des données sur
46 int httpCode = http.GET();
47 //repertoire d'api
48 // https://api.meteomatics.com/2026-01-19T15:00:00.000+01:00/t_2m:C/48.4595521,-4.5689169_48.3572972,-4.4278311:0.1,0.1/html_map?model=mix
49 // https://api.meteomatics.com/2026-01-19T15:00:00.000+01:00/t_2m:C/48.3905283,-4.4860088/html?model=mix
50 // https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t_weather=true
51 // https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400
52 if (httpCode > 0) { //recupération des données dans payload
53 payload = http.getString();
54 Serial.println("Réponse API :");
55 Serial.println(payload);
56 } else {
57 Serial.println("Erreur HTTP");
58 payload = "None";
59 }
60
61 http.end();
62 }
63 ///////////////////////////////////////////////////////////////////////////////////////////////////
64 JsonDocument doc;
65 const char* json = payload.c_str();
66 DeserializationError error = deserializeJson(doc, json);
67
68
69
70 if (error) {
71 Serial.print(F("deserializeJson() failed: ")); //verification si erreur
72 Serial.println(error.f_str());
73 return;
74 }
75 double latitude = doc["latitude"];
76 double longitude = doc["longitude"];
77 float temperature = doc["current_weather"]["temperature"]; //recuperation température
78 float windspeed = doc["current_weather"]["windspeed"]; //recuperation vitesse du vent
79 int winddirection = doc["current_weather"]["winddirection"]; // recuperation direction du vent
80
81 // affichage de toutes les valeurs
82 Serial.println(latitude,2);
83 Serial.println(longitude,2);
84 Serial.println(temperature);
85 Serial.println(windspeed);
86 Serial.println(winddirection);
87
88 if (WiFi.status() == WL_CONNECTED) {
89 HTTPClient http;
90
91 http.begin("https://api.open-meteo.com/v1/forecast?latitude=48.85&longitude=2.35¤t=is_day"); // api pour le jour
92 int httpCode2 = http.GET();
93
94 if (httpCode2 > 0) {
95 payload2 = http.getString();
96 Serial.println("Réponse API :");
97 Serial.println(payload2);
98 } else {
99 Serial.println("Erreur HTTP");
100 payload2 = "None";
101 }
102
103 http.end();
104 }
105 JsonDocument doc2;
106 const char* json2 = payload2.c_str();
107 DeserializationError error2 = deserializeJson(doc2, json2);
108
109 if (error2) {
110 Serial.print(F("deserializeJson() failed: "));
111 Serial.println(error2.f_str());
112 return;
113 }
114 is_day = doc2["current"]["is_day"]; //recuperation de si il fait jour ou non (1 il fait jour 0 il fait nuit)
115
116 Serial.println(is_day);
117
118 }
119
120 void loop() {
121 if (is_day == 1){
122 digitalWrite(4,HIGH); // affichage led jaune pour le jour
123 digitalWrite(13,LOW);
124 }
125 else if (is_day == 0){
126 digitalWrite(4,LOW);
127 digitalWrite(13,HIGH); // affichage led jaune pour la nuit
128 }
129 //partie moteur (on fait bouger le moteur)
130 myServo.write(0);
131 delay(1000);
132
133 myServo.write(90);
134 delay(1000);
135
136
137 }
étapes de fabrication
étape 1
Découper une boite en carton pour représenter la machine. Il faut laisser de l'espace à l'intérieur pour pouvoir mettre le matériel électronique
étape 2
Faire une découpe laser du roue crantée
étape 3
Programmer la carte esp32 avec Arduino. Il faut:
1) Un programme pour allumer les leds jaunes et bleue en fonction de s'il fait jour ou nuit.
2) Un programme pour allumer la led RGB en fonction de la vitesse du vent.
3) Un programme pour faire tourner un servomoteur en 360°. Il fera tourner une flèche pour indiquer la direction du vent.*
4) Un programme pour faire tourner un servomoteur en 180°. Il fera tourner une roue crantée pour faire lever un bout de carton qui représente la température extérieure.
étape 4
Câbler les différentes parties. 1) Faire fonctionner les leds bleue et jaune
2) Faire fonctionner la led RGB. Elle doit changer de couleur entre le bleue et le jaune en passant par le vert. La couleur dépend de la vitesse du vent.
Troubleshouting
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
-installation et mise en marche de l'ESP32
-problème de téléversement du code.
Sources et documentation complémentaire
- Rédаctiоn et illustratiоn :
Pоur tоus vоs trаvauх, qu'ils sоient écrits оu visuels, l'utilisatiоn de l'intеlligеnce artificiеllе générativе, que сe sоit pоur le teхte оu les images, n'еst pas conseillé.
- Prоgrammаtiоn :
En сe qui cоncernе la prоgrаmmatiоn, il est еssentiеl de ne pаs faire dе l'IA vоtrе prеmier rеcоurs. Cоncеntrеz-vоus d'abоrd sur vоtre prоpre lоgiquе, votre experience еt lеs ressоurcеs disponibles.
- Transpаrence et dосumеntatiоn :
Si vоus utilisеz l'IA pоur déblоquer оu améliоrеr une pаrtiе de vоtre cоdе, il est cruciаl de l'indiquеr сlairеmеnt dans vоtre dосumentatiоn tеchniquе.
- Traçabilité :
Chаque ехtrait de cоde généré avес l'аidе de l'IA dоit êtrе accоmpagné de la sоurce, ainsi que du prоmpt eхact qui a été utilisé pоur sа créatiоn, afin d'аssurеr une évaluatiоn clаire dе vоtre prоcessus.
Elément de présentation
je met ici le document de présentation de mon projet