C'est l'hiver ! Hiver.gif

ENIB 2026 : Cumulonimbus 3000 : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(étape 1)
(description (résumé))
 
(16 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
 
Schéma Interface
 
Schéma Interface
  
[[Fichier:Cumulonibus schéma.png|300px]]
+
[[Fichier:Interface.jpg|300px]]
[[Fichier:Cumulonimbus3000_V1.jpg|300px]]
 
  
 
==Introduction==
 
==Introduction==
Ligne 30 : Ligne 29 :
 
===Mettre du code Arduino===
 
===Mettre du code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#define PIN 9
+
#include <ArduinoJson.h>
#include <Arduino_GFX_Library.h>
+
#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() {
   // put your setup code here, to run once:
+
  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&current_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&current_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&current=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() {
   // put your main code here, to run repeatedly:
+
   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 46 : Ligne 169 :
  
 
==étapes de fabrication==
 
==étapes de fabrication==
indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)
 
  
 
===étape 1===
 
===étape 1===
Découper la maquette en carton
+
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===

Version actuelle datée du 20 janvier 2026 à 16:01

Titre de la fiche expérience :

description (résumé)

Schéma Interface

Interface.jpg

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&current_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&current_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&current=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

Roue crantée.png

é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

Câble pour les leds.jpg

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

ne pas modifier sous cette ligne