C'est l'hiver ! Hiver.gif

ENIB 2026 : ENIBEACH : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Troubleshouting)
(Troubleshouting)
 
(11 révisions intermédiaires par le même utilisateur non affichées)
Ligne 8 : Ligne 8 :
 
   -Noomane AMINE
 
   -Noomane AMINE
  
[[Fichier:Projet ENIBEACH croc.jpg|300px]]
+
[[Fichier:Finalestruc.jpg|300px]]
  
 
==Introduction==
 
==Introduction==
Ligne 36 : Ligne 36 :
 
* 1 ULN2003AN
 
* 1 ULN2003AN
 
* 1 ESP-32
 
* 1 ESP-32
 +
 +
 +
  
 
==fichiers à joindre==
 
==fichiers à joindre==
  
 
===Mettre du code Arduino===
 
===Mettre du code Arduino===
<syntaxhighlight lang="Arduino" line>  
+
 
#define PIN 9
+
<syntaxhighlight lang="Arduino" line>
#include <Arduino_GFX_Library.h>
+
 
 +
* É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() {
  // put your setup code here, to run once:
 
  
 +
  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() {
   // put your main code here, to run repeatedly:
+
   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);
 +
   
 +
  }
  
 
}
 
}
 
</syntaxhighlight>
 
  
 
==étapes de fabrication==
 
==étapes de fabrication==
Ligne 68 : Ligne 220 :
 
===étape 2===
 
===é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.
 
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]]
 
[[Fichier:Bobine.jpg|150px]]
  
Ligne 87 : Ligne 240 :
 
===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.
 
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 103 : Ligne 258 :
  
 
==Elément de présentation==
 
==Elément de présentation==
je met ici le document de présentation de mon projet
+
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 :

Equipe

Les membres de l'équipes sont:

  -Elwann RUETTE
  -Thomas PROMONET
  -Matthieu LASSURE
  -Augustin MERKLER
  -Noomane AMINE

Finalestruc.jpg

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

  1. include <WiFi.h>
  2. include <HTTPClient.h>
  3. include <ArduinoJson.h>
  4. include <NTPClient.h>
  5. include <WiFiUdp.h>
  6. include <Stepper.h>
  1. include "soc/soc.h"
  2. 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.

STRUCT1.jpg

é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.

Bobine.jpg

é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.

Bouton struct.jpg

é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.

LED Struct (1).jpeg

étape 5

Réaliser le cablage.

Cablage struct.jpeg

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.

Cablage croc.png

ne pas modifier sous cette ligne