ENIB 2026 : ENIBEACH : Différence entre versions
(→description (résumé)) |
(→Troubleshouting) |
||
| (32 révisions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
Titre de la fiche expérience : | Titre de la fiche expérience : | ||
| − | == | + | ==Equipe== |
| − | + | Les membres de l'équipes sont: | |
| + | -Elwann RUETTE | ||
| + | -Thomas PROMONET | ||
| + | -Matthieu LASSURE | ||
| + | -Augustin MERKLER | ||
| + | -Noomane AMINE | ||
| − | [[Fichier: | + | [[Fichier:Finalestruc.jpg|300px]] |
==Introduction== | ==Introduction== | ||
| − | + | Dans le cadre de notre inter semestre nous allons réaliser un POCL, un objet connecté et ludique. | |
| + | |||
| + | Notre POCL, est un indicateur du niveau de la marée dans trois villes côtières de France, à savoir Brest, Marseille et Bayonne. | ||
| + | |||
| + | Pour indiquer le niveau de la mer, un morceau de carton bleu représentant la mer va pouvoir être plus ou moins haut grâce à une ficelle reliée à un moteur. | ||
| + | |||
| + | Trois boutons permettrons de choisir la ville dont ont veux le niveau de la marée. Des LED présentes sous les boutons seront les indicateur du dernier bouton activé et par conséquent de quelle ville nous montrons le niveau de la marée. | ||
| + | |||
==outil et matériel== | ==outil et matériel== | ||
| + | * morceau de carton | ||
| + | * 2 feuilles A4 bleu | ||
| + | * 1 feuille A4 jaune | ||
| + | * 3 boutons poussoir | ||
| + | * 1 moteur pas à pas | ||
| + | * 1 ordinateur avec arduino | ||
| + | * 1 breadboard | ||
| + | * des câbles | ||
| + | * 3 LED | ||
| + | * pistolet à colle | ||
| + | * cutter | ||
| + | * une paire de ciseaux | ||
| + | * du fil | ||
| + | * 1 ULN2003AN | ||
| + | * 1 ESP-32 | ||
| + | |||
| + | |||
| + | |||
==fichiers à joindre== | ==fichiers à joindre== | ||
| − | + | ||
===Mettre du code Arduino=== | ===Mettre du code Arduino=== | ||
| − | <syntaxhighlight lang="Arduino" line> | + | |
| − | # | + | <syntaxhighlight lang="Arduino" line> |
| − | #include < | + | |
| + | * Élément de la liste à puces | ||
| + | //Librairie | ||
| + | #include <WiFi.h> | ||
| + | #include <HTTPClient.h> | ||
| + | #include <ArduinoJson.h> | ||
| + | #include <NTPClient.h> | ||
| + | #include <WiFiUdp.h> | ||
| + | #include <Stepper.h> | ||
| + | |||
| + | #include "soc/soc.h" | ||
| + | #include "soc/rtc_cntl_reg.h" | ||
| + | |||
| + | const int PAS_PAR_TOUR = 2048; | ||
| + | const float PAS_PAR_METRE = PAS_PAR_TOUR / 7.0; | ||
| + | const float HAUTEUR_MAX = 7.0; | ||
| + | |||
| + | |||
| + | |||
| + | const char* ssid = "Formation"; | ||
| + | const char* password = "Apdgo29200!"; | ||
| + | |||
| + | |||
| + | Stepper myStepper(PAS_PAR_TOUR, 27, 26, 25, 33); | ||
| + | const int boutonPin_Brest = 14; | ||
| + | const int boutonPin_Bayonne = 5; | ||
| + | const int boutonPin_Marseille = 13; | ||
| + | const int LED_VILLE_BREST = 12; | ||
| + | const int LED_VILLE_BAYONNE = 19; | ||
| + | const int LED_VILLE_MARSEILLE = 21; | ||
| + | |||
| + | |||
| + | |||
| + | String url_base = "https://services.data.shom.fr/maregraphie/observation/json/"; | ||
| + | String Ville_ID = "3"; | ||
| + | WiFiUDP ntpUDP; | ||
| + | NTPClient timeClient(ntpUDP, "pool.ntp.org", 0); | ||
void setup() { | void setup() { | ||
| − | |||
| + | WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); | ||
| + | |||
| + | Serial.begin(115200); | ||
| + | pinMode(boutonPin_Brest, INPUT_PULLUP); | ||
| + | pinMode(boutonPin_Bayonne, INPUT_PULLUP); | ||
| + | pinMode(boutonPin_Marseille, INPUT_PULLUP); | ||
| + | pinMode(LED_VILLE_BREST,OUTPUT); | ||
| + | pinMode(LED_VILLE_BAYONNE,OUTPUT); | ||
| + | pinMode(LED_VILLE_MARSEILLE,OUTPUT); | ||
| + | myStepper.setSpeed(10); | ||
| + | digitalWrite(LED_VILLE_BREST,LOW); | ||
| + | digitalWrite(LED_VILLE_BAYONNE,LOW); | ||
| + | digitalWrite(LED_VILLE_MARSEILLE,LOW); | ||
| + | |||
| + | |||
| + | Serial.print("Connexion au WiFi"); | ||
| + | WiFi.begin(ssid, password); | ||
| + | |||
| + | int timeout = 0; | ||
| + | while (WiFi.status() != WL_CONNECTED && timeout < 20) { | ||
| + | delay(500); | ||
| + | Serial.print("."); | ||
| + | timeout++; | ||
| + | } | ||
| + | |||
| + | if (WiFi.status() == WL_CONNECTED) { | ||
| + | Serial.println("\nWiFi Connecté !"); | ||
| + | } else { | ||
| + | Serial.println("\nEchec WiFi"); | ||
| + | } | ||
| + | |||
| + | timeClient.begin(); | ||
| + | Serial.println("Pret."); | ||
| + | } | ||
| + | |||
| + | void lancerAnimationMaree() { | ||
| + | if (WiFi.status() == WL_CONNECTED) { | ||
| + | unsigned long epoch = timeClient.getEpochTime(); | ||
| + | String url = url_base + Ville_ID + "?sources=1&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60); | ||
| + | |||
| + | HTTPClient http; | ||
| + | http.begin(url); | ||
| + | int code = http.GET(); | ||
| + | |||
| + | if (code == 200) { | ||
| + | String payload = http.getString(); | ||
| + | JsonDocument doc; | ||
| + | deserializeJson(doc, payload); | ||
| + | |||
| + | if (doc["data"].size() > 0) { | ||
| + | int dernierIndex = doc["data"].size() - 1; | ||
| + | float niveau = doc["data"][dernierIndex]["value"]; | ||
| + | Serial.print("Hauteur SHOM : "); Serial.println(niveau); | ||
| + | |||
| + | if (niveau > HAUTEUR_MAX) { | ||
| + | niveau = HAUTEUR_MAX; | ||
| + | } | ||
| + | |||
| + | long pasAfaire = (long)(niveau * PAS_PAR_METRE); | ||
| + | |||
| + | Serial.println("Deplacement vers la hauteur..."); | ||
| + | if (pasAfaire > 0) myStepper.step(-pasAfaire); | ||
| + | |||
| + | |||
| + | Serial.println("Retour a zero..."); | ||
| + | if (pasAfaire > 0) myStepper.step(pasAfaire); | ||
| + | |||
| + | extinctionMoteur(); | ||
| + | } | ||
| + | } | ||
| + | http.end(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void extinctionMoteur() { | ||
| + | digitalWrite(27, LOW); digitalWrite(26, LOW); | ||
| + | digitalWrite(25, LOW); digitalWrite(33, LOW); | ||
| + | } | ||
| + | |||
| + | String getFormattedDate(unsigned long epoch) { | ||
| + | time_t rawtime = epoch; | ||
| + | struct tm * ti; | ||
| + | ti = gmtime (&rawtime); | ||
| + | char buffer[25]; | ||
| + | sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02dZ", | ||
| + | ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday, | ||
| + | ti->tm_hour, ti->tm_min, ti->tm_sec); | ||
| + | return String(buffer); | ||
} | } | ||
void loop() { | void loop() { | ||
| − | + | timeClient.update(); | |
| + | |||
| + | if (digitalRead(boutonPin_Brest) == LOW) { | ||
| + | Serial.println("Bouton Brest detecté !"); | ||
| + | digitalWrite(LED_VILLE_BREST,HIGH); | ||
| + | digitalWrite(LED_VILLE_BAYONNE,LOW); | ||
| + | digitalWrite(LED_VILLE_MARSEILLE,LOW); | ||
| + | lancerAnimationMaree(); | ||
| + | delay(500); | ||
| + | |||
| + | } | ||
| + | if (digitalRead(boutonPin_Bayonne) == LOW) { | ||
| + | Serial.println("Bouton Bayonne detecté !"); | ||
| + | digitalWrite(LED_VILLE_BREST,LOW); | ||
| + | digitalWrite(LED_VILLE_BAYONNE,HIGH); | ||
| + | digitalWrite(LED_VILLE_MARSEILLE,LOW); | ||
| + | lancerAnimationMaree(); | ||
| + | delay(500); | ||
| + | |||
| + | } | ||
| + | if (digitalRead(boutonPin_Marseille) == LOW) { | ||
| + | Serial.println("Bouton Marseille detecté !"); | ||
| + | digitalWrite(LED_VILLE_BREST,LOW); | ||
| + | digitalWrite(LED_VILLE_BAYONNE,LOW); | ||
| + | digitalWrite(LED_VILLE_MARSEILLE,HIGH); | ||
| + | lancerAnimationMaree(); | ||
| + | delay(500); | ||
| + | |||
| + | } | ||
} | } | ||
| − | + | ==étapes de fabrication== | |
| + | |||
| + | |||
| + | ===étape 1=== | ||
| + | Faire le début de la structure en carton en découpant au cutter un planche en carton d'une largeur égale à la longueur d'une feuille A4, et d'une hauteur un peu plus grande. | ||
| + | Puis encadrer avec une autre plaque de carton qui sera au sol pour soutenir et de deux autres plus petites sur le côté pour fermer. | ||
| + | Placer la feuille jaune pour faire la plage, découper une partie d'une feuille bleue pour faire la mer fixer par dessus une feuille bleue collé à un carton préalablement découper à la bonne taille, cette plaque tient grâce à des calles en carton, et servira en fonction de la hauteur à laquelle elle va être par rapport à la feuille jaune représentant la plage, le niveau de la mer. | ||
| − | + | [[Fichier:STRUCT1.jpg|150px]] | |
| − | |||
| − | |||
===étape 2=== | ===étape 2=== | ||
| − | ===étape ...=== | + | Créer la bobine en enroulant un bout de carton sur lui même, en l'encadrant de deux autres disques de carton, et recouvrir la partie sur laquelle va être le fille d'un bout de feuille pour lisser la surface avant d'y coller le fil. Faire un petit trou de la taille de la partie rotative du moteur, et coller cette partie du moteur à la bobine. |
| + | |||
| + | [[Fichier:Bobine.jpg|150px]] | ||
| + | |||
| + | ===étape 3=== | ||
| + | Faire trois trou sur le côté de la structure pour y insérer les boutons. Relier également le file de la bobine à la plaque de carton bleu amovible sur laquelle on peut d'ailleurs mettre de petite vague bleu pour décorer. | ||
| + | |||
| + | [[Fichier:Bouton struct.jpg|150px]] | ||
| + | |||
| + | ===étape 4=== | ||
| + | Placer les LED sous les boutons, elles indiques quelle ville est actuellement en cours d'affichage. Fabriquer des panneaux indiquant le nom des villes en fonction des boutons. | ||
| + | |||
| + | [[Fichier:LED Struct (1).jpeg|150px]] | ||
| + | |||
| + | ===étape 5=== | ||
| + | Réaliser le cablage. | ||
| + | |||
| + | [[Fichier:Cablage struct.jpeg|150px]] | ||
| + | |||
===Troubleshouting=== | ===Troubleshouting=== | ||
| − | + | Nous avons du renoncer à certaine partie de notre projet, du à la difficulté de l'acquisition des données et de la création du code. | |
| + | |||
| + | Le matériel était également défaillant, les câbles et la plaque ne fonctionnait pas à tous les coups. | ||
==Sources et documentation complémentaire== | ==Sources et documentation complémentaire== | ||
| Ligne 53 : | Ligne 258 : | ||
==Elément de présentation== | ==Elément de présentation== | ||
| − | + | Voici une idée du cablage avec les PIN qui ne corresponde pas au code. | |
| + | |||
| + | [[Fichier:Cablage croc.png|500px]] | ||
==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:17
Titre de la fiche expérience :
Sommaire
Equipe
Les membres de l'équipes sont:
-Elwann RUETTE -Thomas PROMONET -Matthieu LASSURE -Augustin MERKLER -Noomane AMINE
Introduction
Dans le cadre de notre inter semestre nous allons réaliser un POCL, un objet connecté et ludique.
Notre POCL, est un indicateur du niveau de la marée dans trois villes côtières de France, à savoir Brest, Marseille et Bayonne.
Pour indiquer le niveau de la mer, un morceau de carton bleu représentant la mer va pouvoir être plus ou moins haut grâce à une ficelle reliée à un moteur.
Trois boutons permettrons de choisir la ville dont ont veux le niveau de la marée. Des LED présentes sous les boutons seront les indicateur du dernier bouton activé et par conséquent de quelle ville nous montrons le niveau de la marée.
outil et matériel
- morceau de carton
- 2 feuilles A4 bleu
- 1 feuille A4 jaune
- 3 boutons poussoir
- 1 moteur pas à pas
- 1 ordinateur avec arduino
- 1 breadboard
- des câbles
- 3 LED
- pistolet à colle
- cutter
- une paire de ciseaux
- du fil
- 1 ULN2003AN
- 1 ESP-32
fichiers à joindre
Mettre du code Arduino
<syntaxhighlight lang="Arduino" line>
- Élément de la liste à puces
//Librairie
- include <WiFi.h>
- include <HTTPClient.h>
- include <ArduinoJson.h>
- include <NTPClient.h>
- include <WiFiUdp.h>
- include <Stepper.h>
- include "soc/soc.h"
- include "soc/rtc_cntl_reg.h"
const int PAS_PAR_TOUR = 2048; const float PAS_PAR_METRE = PAS_PAR_TOUR / 7.0; const float HAUTEUR_MAX = 7.0;
const char* ssid = "Formation"; const char* password = "Apdgo29200!";
Stepper myStepper(PAS_PAR_TOUR, 27, 26, 25, 33);
const int boutonPin_Brest = 14;
const int boutonPin_Bayonne = 5;
const int boutonPin_Marseille = 13;
const int LED_VILLE_BREST = 12;
const int LED_VILLE_BAYONNE = 19;
const int LED_VILLE_MARSEILLE = 21;
String url_base = "https://services.data.shom.fr/maregraphie/observation/json/"; String Ville_ID = "3"; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org", 0);
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
Serial.begin(115200); pinMode(boutonPin_Brest, INPUT_PULLUP); pinMode(boutonPin_Bayonne, INPUT_PULLUP); pinMode(boutonPin_Marseille, INPUT_PULLUP); pinMode(LED_VILLE_BREST,OUTPUT); pinMode(LED_VILLE_BAYONNE,OUTPUT); pinMode(LED_VILLE_MARSEILLE,OUTPUT); myStepper.setSpeed(10); digitalWrite(LED_VILLE_BREST,LOW); digitalWrite(LED_VILLE_BAYONNE,LOW); digitalWrite(LED_VILLE_MARSEILLE,LOW);
Serial.print("Connexion au WiFi");
WiFi.begin(ssid, password);
int timeout = 0;
while (WiFi.status() != WL_CONNECTED && timeout < 20) {
delay(500);
Serial.print(".");
timeout++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Connecté !");
} else {
Serial.println("\nEchec WiFi");
}
timeClient.begin();
Serial.println("Pret.");
}
void lancerAnimationMaree() {
if (WiFi.status() == WL_CONNECTED) {
unsigned long epoch = timeClient.getEpochTime();
String url = url_base + Ville_ID + "?sources=1&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60);
HTTPClient http;
http.begin(url);
int code = http.GET();
if (code == 200) {
String payload = http.getString();
JsonDocument doc;
deserializeJson(doc, payload);
if (doc["data"].size() > 0) {
int dernierIndex = doc["data"].size() - 1;
float niveau = doc["data"][dernierIndex]["value"];
Serial.print("Hauteur SHOM : "); Serial.println(niveau);
if (niveau > HAUTEUR_MAX) {
niveau = HAUTEUR_MAX;
}
long pasAfaire = (long)(niveau * PAS_PAR_METRE);
Serial.println("Deplacement vers la hauteur...");
if (pasAfaire > 0) myStepper.step(-pasAfaire);
Serial.println("Retour a zero...");
if (pasAfaire > 0) myStepper.step(pasAfaire);
extinctionMoteur();
}
}
http.end();
}
}
void extinctionMoteur() {
digitalWrite(27, LOW); digitalWrite(26, LOW); digitalWrite(25, LOW); digitalWrite(33, LOW);
}
String getFormattedDate(unsigned long epoch) {
time_t rawtime = epoch;
struct tm * ti;
ti = gmtime (&rawtime);
char buffer[25];
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02dZ",
ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday,
ti->tm_hour, ti->tm_min, ti->tm_sec);
return String(buffer);
}
void loop() {
timeClient.update();
if (digitalRead(boutonPin_Brest) == LOW) {
Serial.println("Bouton Brest detecté !");
digitalWrite(LED_VILLE_BREST,HIGH);
digitalWrite(LED_VILLE_BAYONNE,LOW);
digitalWrite(LED_VILLE_MARSEILLE,LOW);
lancerAnimationMaree();
delay(500);
}
if (digitalRead(boutonPin_Bayonne) == LOW) {
Serial.println("Bouton Bayonne detecté !");
digitalWrite(LED_VILLE_BREST,LOW);
digitalWrite(LED_VILLE_BAYONNE,HIGH);
digitalWrite(LED_VILLE_MARSEILLE,LOW);
lancerAnimationMaree();
delay(500);
}
if (digitalRead(boutonPin_Marseille) == LOW) {
Serial.println("Bouton Marseille detecté !");
digitalWrite(LED_VILLE_BREST,LOW);
digitalWrite(LED_VILLE_BAYONNE,LOW);
digitalWrite(LED_VILLE_MARSEILLE,HIGH);
lancerAnimationMaree();
delay(500);
}
}
étapes de fabrication
étape 1
Faire le début de la structure en carton en découpant au cutter un planche en carton d'une largeur égale à la longueur d'une feuille A4, et d'une hauteur un peu plus grande. Puis encadrer avec une autre plaque de carton qui sera au sol pour soutenir et de deux autres plus petites sur le côté pour fermer. Placer la feuille jaune pour faire la plage, découper une partie d'une feuille bleue pour faire la mer fixer par dessus une feuille bleue collé à un carton préalablement découper à la bonne taille, cette plaque tient grâce à des calles en carton, et servira en fonction de la hauteur à laquelle elle va être par rapport à la feuille jaune représentant la plage, le niveau de la mer.
étape 2
Créer la bobine en enroulant un bout de carton sur lui même, en l'encadrant de deux autres disques de carton, et recouvrir la partie sur laquelle va être le fille d'un bout de feuille pour lisser la surface avant d'y coller le fil. Faire un petit trou de la taille de la partie rotative du moteur, et coller cette partie du moteur à la bobine.
étape 3
Faire trois trou sur le côté de la structure pour y insérer les boutons. Relier également le file de la bobine à la plaque de carton bleu amovible sur laquelle on peut d'ailleurs mettre de petite vague bleu pour décorer.
étape 4
Placer les LED sous les boutons, elles indiques quelle ville est actuellement en cours d'affichage. Fabriquer des panneaux indiquant le nom des villes en fonction des boutons.
étape 5
Réaliser le cablage.
Troubleshouting
Nous avons du renoncer à certaine partie de notre projet, du à la difficulté de l'acquisition des données et de la création du code.
Le matériel était également défaillant, les câbles et la plaque ne fonctionnait pas à tous les coups.
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
Voici une idée du cablage avec les PIN qui ne corresponde pas au code.