C'est l'hiver ! Hiver.gif

ENIB 2026 : ENINGURU : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(outil et matériel)
(fichiers à joindre)
 
(11 révisions intermédiaires par le même utilisateur non affichées)
Ligne 10 : Ligne 10 :
  
 
Dans le cadre notre l’intersemestre et du hackathon pédagogique POCL, notre groupe a du concevoir un Petit Objet Connecté Ludique et nous avons décidé de le faire autour du thème du surf. L’objectif est de donner une information simple et visuelle sur la taille des vagues et si les surfeurs peuvent aller surfer en temps réel à partir de la position GPS du petit Minou et des données météorologiques.
 
Dans le cadre notre l’intersemestre et du hackathon pédagogique POCL, notre groupe a du concevoir un Petit Objet Connecté Ludique et nous avons décidé de le faire autour du thème du surf. L’objectif est de donner une information simple et visuelle sur la taille des vagues et si les surfeurs peuvent aller surfer en temps réel à partir de la position GPS du petit Minou et des données météorologiques.
 +
[[Fichier:Maquette.jpg|200px]]
  
 
==outil et matériel==
 
==outil et matériel==
Ligne 19 : Ligne 20 :
  
 
==fichiers à joindre==
 
==fichiers à joindre==
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
+
 
===Mettre du code Arduino===
+
<syntaxhighlight lang="Arduino" line>
<syntaxhighlight lang="Arduino" line>  
 
 
#define PIN 9
 
#define PIN 9
 
#include <Arduino_GFX_Library.h>
 
#include <Arduino_GFX_Library.h>
 +
 +
#include <WiFi.h>
 +
#include <HTTPClient.h>
 +
#include <ArduinoJson.h>
 +
#include <ESP32Servo.h>
 +
#include <Adafruit_NeoPixel.h>
 +
 +
const char* ssid = "HoelS22";
 +
const char* password = "Abcdefgh";
 +
 +
 +
const float latitude = 48.33;
 +
const float longitude = -4.62;
 +
 +
const int servoPin = 13;
 +
Servo waveServo;
 +
int servoPos = 90;           
 +
int servoStep = 1;
 +
unsigned long lastServoMove = 0;
 +
int servoSpeedDelay = 50;
 +
 +
#define LED_PIN  14
 +
#define LED_COUNT 12
 +
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 +
 +
unsigned long lastApiTime = 0;
 +
unsigned long apiDelay = 900000;
 +
 +
float currentWaveHeight = 0.0;
  
 
void setup() {
 
void setup() {
   // put your setup code here, to run once:
+
   Serial.begin(115200);
 +
  delay(1000);
 +
  Serial.println("\n--- DEMARRAGE POCL SURF ---");
  
 +
  waveServo.setPeriodHertz(50);
 +
  waveServo.attach(servoPin, 500, 2400);
 +
  waveServo.write(90);
 +
 +
 +
  strip.begin();
 +
  strip.setBrightness(80);
 +
  strip.show();
 +
 +
  Serial.print("Connexion WiFi ");
 +
  WiFi.begin(ssid, password);
 +
  int attempt = 0;
 +
  while (WiFi.status() != WL_CONNECTED && attempt < 20) {
 +
    delay(500);
 +
    Serial.print(".");
 +
    attempt++;
 +
  }
 +
 +
  if (WiFi.status() == WL_CONNECTED) {
 +
    Serial.println("\nWiFi connecté !");
 +
    Serial.println(WiFi.localIP());
 +
  } else {
 +
    Serial.println("\nERREUR WiFi");
 +
  }
 +
 +
  getWavesData();
 
}
 
}
  
 
void loop() {
 
void loop() {
   // put your main code here, to run repeatedly:
+
 +
   if (WiFi.status() == WL_CONNECTED) {
 +
    if (millis() - lastApiTime > apiDelay) {
 +
      getWavesData();
 +
    }
 +
  }
  
 +
  if (millis() - lastServoMove > servoSpeedDelay) {
 +
    lastServoMove = millis();
 +
 +
    int maxOffset = map((int)(constrain(currentWaveHeight, 0.0, 6.0) * 100), 0, 600, 0, 30);
 +
    servoPos = 90 - maxOffset + servoStep;
 +
 +
    if (servoPos <= 90 - maxOffset || servoPos >= 90 + maxOffset) {
 +
      servoStep = -servoStep;
 +
    }
 +
 +
    waveServo.write(servoPos);
 +
  }
 
}
 
}
  
 +
 +
void getWavesData() {
 +
  HTTPClient http;
 +
  String url = "https://marine-api.open-meteo.com/v1/marine?latitude=" +
 +
              String(latitude) +
 +
              "&longitude=" +
 +
              String(longitude) +
 +
              "&current=wave_height&timezone=Europe%2FParis";
 +
 +
  Serial.println("\n--- MISE A JOUR VAGUES ---");
 +
  http.begin(url);
 +
  int httpCode = http.GET();
 +
 +
  if (httpCode > 0) {
 +
    String payload = http.getString();
 +
    StaticJsonDocument<1024> doc;
 +
 +
    if (deserializeJson(doc, payload)) {
 +
      Serial.println("Erreur JSON");
 +
      return;
 +
    }
 +
 +
    float h = -1.0;
 +
    if (doc["current"]["wave_height"].is<float>()) {
 +
      h = doc["current"]["wave_height"];
 +
    }
 +
 +
    Serial.print("Hauteur vagues : ");
 +
    Serial.print(h);
 +
    Serial.println(" m");
 +
 +
    currentWaveHeight = h;
 +
    updateNeoPixels(h);
 +
 +
  } else {
 +
    Serial.println("Erreur API");
 +
  }
 +
 +
  http.end();
 +
  lastApiTime = millis();
 +
}
 +
 +
 +
void updateNeoPixels(float h) {
 +
  if (h < 0) {
 +
    strip.clear();
 +
    strip.setPixelColor(0, strip.Color(255, 0, 0));
 +
    strip.show();
 +
    return;
 +
  }
 +
 +
  float hLimited = constrain(h, 0.0, 6.0);
 +
  int ledsToLight = (int)(hLimited * 2 + 0.5);
 +
  ledsToLight = constrain(ledsToLight, 0, LED_COUNT);
 +
 +
  uint32_t color;
 +
  if (h < 1.0)      color = strip.Color(0, 255, 0); 
 +
  else if (h < 3.0)  color = strip.Color(0, 0, 255); 
 +
  else              color = strip.Color(255, 0, 0); 
 +
  strip.clear();
 +
  for (int i = 0; i < ledsToLight; i++) {
 +
    strip.setPixelColor(i, color);
 +
  }
 +
  strip.show();
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Ligne 43 : Ligne 182 :
 
Placer l'ESP32 sur la carte de développement puis câbler les LED et le SERVO-moteur tels qu'indiqués dans le schéma de câblage.
 
Placer l'ESP32 sur la carte de développement puis câbler les LED et le SERVO-moteur tels qu'indiqués dans le schéma de câblage.
 
.
 
.
 +
[[Fichier:Schemacablage.jpg|200px]]
  
 
===étape 2===
 
===étape 2===
Ligne 56 : Ligne 196 :
  
 
===étape 4===
 
===étape 4===
 
===étape 5===
 
 
===étape 6===
 
 
accrocher le cure dent de la planche dans le moteur. et coller les leds(11 leds) sur le coté de la boite.
 
accrocher le cure dent de la planche dans le moteur. et coller les leds(11 leds) sur le coté de la boite.
 
[[Fichier:Cure dent.jpg|200px]]
 
[[Fichier:Cure dent.jpg|200px]]
 
[[Fichier:Supportboite.jpg|200px]]
 
[[Fichier:Supportboite.jpg|200px]]
 +
[[Fichier:Led.jpg|200px]]
  
===étape 7===
+
===étape 5===
 
tester le bon fonctionnement de la maquette.
 
tester le bon fonctionnement de la maquette.
 
+
[[Fichier:Maquette.jpg|200px]]
  
 
===Troubleshouting===
 
===Troubleshouting===
Ligne 89 : Ligne 226 :
  
 
==Elément de présentation==
 
==Elément de présentation==
je met ici le document de présentation de mon projet
+
[[Fichier:Blue and White Modern Bold Nature Watercolor Illustrative The Ocean Life Beneath the Surface Presentation.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 à 15:39

description (résumé)

Notre POCL à pour but de donner l’information de la taille des vagues en direct.
Le surfeur renseigne la position GPS du spot de surf et en fonction des données météorologiques que l’on récupère sur le site open-meteo.com

Pour savoir la taille des vagues en direct, notre POCL est doté d’une led qui va changer de couleur en fonction de la taille des vagues. Quand les vagues seront petites, la led va etre de couleur verte, puis elle va tendre vers le rouge et le violet si les vagues sont très grosses.

En plus de cette led, un petit surfeur se trouve sur le haut de la boite. Quand les conditions de surf ne sont pas bonnes, le petit surfeur est immobile. Par contre, quand les conditions sont intéressantes, le petit surfeur commence à bouger.

Introduction

Dans le cadre notre l’intersemestre et du hackathon pédagogique POCL, notre groupe a du concevoir un Petit Objet Connecté Ludique et nous avons décidé de le faire autour du thème du surf. L’objectif est de donner une information simple et visuelle sur la taille des vagues et si les surfeurs peuvent aller surfer en temps réel à partir de la position GPS du petit Minou et des données météorologiques. Maquette.jpg

outil et matériel

  • carton
  • Papier bleu
  • leds
  • Moteur
  • Cure dents

fichiers à joindre

  1   
  2 #define PIN 9
  3 #include <Arduino_GFX_Library.h>
  4 
  5 #include <WiFi.h>
  6 #include <HTTPClient.h>
  7 #include <ArduinoJson.h>
  8 #include <ESP32Servo.h>
  9 #include <Adafruit_NeoPixel.h>
 10 
 11 const char* ssid = "HoelS22";
 12 const char* password = "Abcdefgh";
 13 
 14 
 15 const float latitude = 48.33;
 16 const float longitude = -4.62;
 17 
 18 const int servoPin = 13;
 19 Servo waveServo;
 20 int servoPos = 90;            
 21 int servoStep = 1;
 22 unsigned long lastServoMove = 0;
 23 int servoSpeedDelay = 50;
 24 
 25 #define LED_PIN   14
 26 #define LED_COUNT 12
 27 Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 28 
 29 unsigned long lastApiTime = 0;
 30 unsigned long apiDelay = 900000; 
 31 
 32 float currentWaveHeight = 0.0;
 33 
 34 void setup() {
 35   Serial.begin(115200);
 36   delay(1000);
 37   Serial.println("\n--- DEMARRAGE POCL SURF ---");
 38 
 39   waveServo.setPeriodHertz(50);
 40   waveServo.attach(servoPin, 500, 2400);
 41   waveServo.write(90); 
 42 
 43 
 44   strip.begin();
 45   strip.setBrightness(80);
 46   strip.show();
 47 
 48   Serial.print("Connexion WiFi ");
 49   WiFi.begin(ssid, password);
 50   int attempt = 0;
 51   while (WiFi.status() != WL_CONNECTED && attempt < 20) {
 52     delay(500);
 53     Serial.print(".");
 54     attempt++;
 55   }
 56 
 57   if (WiFi.status() == WL_CONNECTED) {
 58     Serial.println("\nWiFi connecté !");
 59     Serial.println(WiFi.localIP());
 60   } else {
 61     Serial.println("\nERREUR WiFi");
 62   }
 63 
 64   getWavesData();
 65 }
 66 
 67 void loop() {
 68  
 69   if (WiFi.status() == WL_CONNECTED) {
 70     if (millis() - lastApiTime > apiDelay) {
 71       getWavesData();
 72     }
 73   }
 74 
 75   if (millis() - lastServoMove > servoSpeedDelay) {
 76     lastServoMove = millis();
 77 
 78     int maxOffset = map((int)(constrain(currentWaveHeight, 0.0, 6.0) * 100), 0, 600, 0, 30);
 79     servoPos = 90 - maxOffset + servoStep;
 80 
 81     if (servoPos <= 90 - maxOffset || servoPos >= 90 + maxOffset) {
 82       servoStep = -servoStep;
 83     }
 84 
 85     waveServo.write(servoPos);
 86   }
 87 }
 88 
 89 
 90 void getWavesData() {
 91   HTTPClient http;
 92   String url = "https://marine-api.open-meteo.com/v1/marine?latitude=" +
 93                String(latitude) +
 94                "&longitude=" +
 95                String(longitude) +
 96                "&current=wave_height&timezone=Europe%2FParis";
 97 
 98   Serial.println("\n--- MISE A JOUR VAGUES ---");
 99   http.begin(url);
100   int httpCode = http.GET();
101 
102   if (httpCode > 0) {
103     String payload = http.getString();
104     StaticJsonDocument<1024> doc;
105 
106     if (deserializeJson(doc, payload)) {
107       Serial.println("Erreur JSON");
108       return;
109     }
110 
111     float h = -1.0;
112     if (doc["current"]["wave_height"].is<float>()) {
113       h = doc["current"]["wave_height"];
114     }
115 
116     Serial.print("Hauteur vagues : ");
117     Serial.print(h);
118     Serial.println(" m");
119 
120     currentWaveHeight = h;
121     updateNeoPixels(h);
122 
123   } else {
124     Serial.println("Erreur API");
125   }
126 
127   http.end();
128   lastApiTime = millis();
129 }
130 
131 
132 void updateNeoPixels(float h) {
133   if (h < 0) {
134     strip.clear();
135     strip.setPixelColor(0, strip.Color(255, 0, 0));
136     strip.show();
137     return;
138   }
139 
140   float hLimited = constrain(h, 0.0, 6.0);
141   int ledsToLight = (int)(hLimited * 2 + 0.5); 
142   ledsToLight = constrain(ledsToLight, 0, LED_COUNT);
143 
144   uint32_t color;
145   if (h < 1.0)       color = strip.Color(0, 255, 0);   
146   else if (h < 3.0)  color = strip.Color(0, 0, 255);  
147   else               color = strip.Color(255, 0, 0);   
148   strip.clear();
149   for (int i = 0; i < ledsToLight; i++) {
150     strip.setPixelColor(i, color);
151   }
152   strip.show();
153 }

étapes de fabrication

indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)

étape 1

Placer l'ESP32 sur la carte de développement puis câbler les LED et le SERVO-moteur tels qu'indiqués dans le schéma de câblage. . Schemacablage.jpg

étape 2

En suivant le schéma de notre maquette construction d'une petite boîte en carton et d'un personnage. Découper de quoi faire une boite, une planche de surf et un personnage dans du carton, Construire la boite et y faire un trou en haut pour pouvoir faire tourner la surfeuse. Coller avec de la colle chaude la planche et la surfeuse puis planter un cure dent dans la planche

Surfeur eninguru.jpeg Boite sans deco.jpg Schemableu.jpg

étape 3

Décorer la boite et la surfeuse selon les envies. Boite deco.jpg

étape 4

accrocher le cure dent de la planche dans le moteur. et coller les leds(11 leds) sur le coté de la boite. Cure dent.jpg Supportboite.jpg Led.jpg

étape 5

tester le bon fonctionnement de la maquette. Maquette.jpg

Troubleshouting

Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?

  • faire attention au sens des led, elles ne fonctionnent que d'un coté
  • Attention la conversion des données entre JSON et C++ (Arduino)

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

Fichier:Blue and White Modern Bold Nature Watercolor Illustrative The Ocean Life Beneath the Surface Presentation.pdf

ne pas modifier sous cette ligne