C'est l'hiver ! Hiver.gif

ENIB 2026 : Not a Clock : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(fichiers à joindre)
(Sources et documentation complémentaire)
 
(2 révisions intermédiaires par le même utilisateur non affichées)
Ligne 312 : Ligne 312 :
  
 
==Sources et documentation complémentaire==
 
==Sources et documentation complémentaire==
 +
'''Pour construire le Globe en papier :'''
  
* Rédаctiоn et illustratiоn : <br>
+
[[Media:Le-paper-globe-A4-fr.pdf|Télécharger Globe en papier]]
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 : <br>
+
'''Prompt Chatgpt pour relier le code qui fais tourner le moteur et celui qui allume les leds :'''
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 : <br>
+
Relie ce code afin que lorsqu'on presse un bouton poussoir le moteur tourne de X degrés
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é : <br>
 
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==
 
==Elément de présentation==

Version actuelle datée du 22 janvier 2026 à 15:41

Titre de la fiche expérience :

description

Nous sommes quatre étudiants de l’ENIB travaillant ensemble sur un projet commun. Nous avons conçu un objet interactif mêlant électronique, mécanique et programmation. Le projet repose sur un travail d’équipe et une répartition claire des tâches. Il nous permet de mettre en pratique nos compétences techniques acquises en formation.

Ekip1.png Titouan Le Bot, Mathis Laurent, Malou Le Goff, Mathis Mouellic

Introduction

Notre projet consiste à concevoir une boîte interactive permettant de découvrir l’état du jour et de la nuit dans différentes villes du monde de manière ludique et visuelle.

Le dispositif propose le choix entre cinq villes prédéfinies. À l’aide d’un bouton de sélection, l’utilisateur choisit une ville. Une fois la sélection effectuée, un globe terrestre en papier se met en rotation afin de pointer visuellement la ville correspondante sur le globe, renforçant ainsi la dimension pédagogique et géographique du projet.

En parallèle, un système de LED informe l’utilisateur sur la situation temporelle de la ville choisie :

une LED s’allume pour indiquer s’il fait jour,

une autre signale s’il fait nuit.

outil et matériel

-7 LEDs
-Cartons
-Feuilles bris
tols -Scotch
-Cutter
-Compas
-Ordinateur
-Stylo
-Règle
-Bouton
-résistance
-Jumper
-Cable
-Moteur pas à pas

fichiers à joindre

  1  
  2 #include <WiFi.h>
  3 #include <HTTPClient.h>
  4 #include <ArduinoJson.h>
  5 
  6 const int nbBoutons = 5;
  7 
  8 // ===== WIFI =====
  9 const char* ssid = "MiMi mathis";
 10 const char* password = "12345678";
 11 
 12 // ===== API =====
 13 const char* apiKey = "8bcc1435ae4d44bda0290441262201";
 14 
 15 // ===== BOUTONS =====
 16 int boutons[nbBoutons] = {13, 12, 14, 27, 26};
 17 
 18 // ===== LEDS ROUGES (VILLES) =====
 19 int ledsVille[nbBoutons] = {32, 33, 16, 17, 18};
 20 
 21 // ===== LEDS JOUR / NUIT =====
 22 int ledJour = 19;
 23 int ledNuit = 21;
 24 
 25 // ===== VILLES =====
 26 String villes[nbBoutons] = {"Paris", "Los Angeles", "Tokyo", "Dubai", "Moscow"};
 27 
 28 bool etatBoutonAvant[nbBoutons];
 29 int villeActive = -1;
 30 
 31 // ================= MOTEUR ===================
 32 // Pins moteur
 33 #define IN1  15
 34 #define IN2  2
 35 #define IN3  0
 36 #define IN4  4
 37 
 38 int Steps = 0;
 39 
 40 // Angles pour les villes
 41 int anglesVilles[nbBoutons] = {0, -120, 140, 60, 30}; // Paris, LA, Tokyo, Dubai, Moscow
 42 int pasParTour = 2048; // 28BYJ-48
 43 int pasParDegre = pasParTour / 360;
 44 
 45 // Fonction qui convertit l'index de ville en mouvement moteur
 46 void allerVille(int index) {
 47   int angleCible = anglesVilles[index];
 48   int deltaAngle = angleCible - Steps;  // on réutilise Steps comme position
 49   int nbPas = deltaAngle * pasParDegre;
 50 
 51   stepper(nbPas); // ta fonction stepper existante
 52   Steps = angleCible; // mettre à jour la position
 53 }
 54 
 55 // Fonction stepper existante
 56 void stepper(double nbStep){
 57   int Direction;
 58   if(nbStep>=0){ Direction=1; }
 59   else { Direction=0; nbStep=-nbStep; }
 60 
 61   for (int x=0; x<nbStep*8; x++){
 62     switch(Steps){
 63       case 0: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break;
 64       case 1: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); break;
 65       case 2: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break;
 66       case 3: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break;
 67       case 4: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break;
 68       case 5: digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break;
 69       case 6: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break;
 70       case 7: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break;
 71     }
 72     delayMicroseconds(1000);
 73     if(Direction==1){ Steps++; }
 74     if(Direction==0){ Steps--; }
 75     if(Steps>7){ Steps=0; }
 76     if(Steps<0){ Steps=7; }
 77   }
 78 }
 79 
 80 // ================= SETUP =================
 81 void setup() {
 82   Serial.begin(115200);
 83 
 84   for (int i = 0; i < nbBoutons; i++) {
 85     pinMode(boutons[i], INPUT_PULLUP);
 86     pinMode(ledsVille[i], OUTPUT);
 87     digitalWrite(ledsVille[i], LOW);
 88     etatBoutonAvant[i] = HIGH;
 89   }
 90 
 91   pinMode(ledJour, OUTPUT);
 92   pinMode(ledNuit, OUTPUT);
 93   digitalWrite(ledJour, LOW);
 94   digitalWrite(ledNuit, LOW);
 95 
 96   pinMode(IN1, OUTPUT); 
 97   pinMode(IN2, OUTPUT); 
 98   pinMode(IN3, OUTPUT); 
 99   pinMode(IN4, OUTPUT);
100 
101   WiFi.begin(ssid, password);
102   Serial.print("Connexion WiFi");
103   while (WiFi.status() != WL_CONNECTED) {
104     delay(500);
105     Serial.print(".");
106   }
107   Serial.println("\nWiFi connecté !");
108 }
109 
110 // =============== LEDS ROUGES ===============
111 void allumerVille(int index) {
112   // Éteindre toutes les LEDs rouges
113   for (int i = 0; i < nbBoutons; i++) {
114     digitalWrite(ledsVille[i], LOW);
115   }
116 
117   // Allumer la bonne LED
118   digitalWrite(ledsVille[index], HIGH);
119   villeActive = index;
120   Serial.println("LED ville allumée : " + villes[index]);
121 
122   // → Tourner le globe
123   allerVille(index);
124 }
125 
126 // =============== API JOUR / NUIT ===========
127 bool estJour(String ville) {
128   HTTPClient http;
129   String url = "http://api.weatherapi.com/v1/current.json?key=" +
130                String(apiKey) + "&q=" + ville;
131 
132   http.begin(url);
133   int httpCode = http.GET();
134 
135   if (httpCode == 200) {
136     DynamicJsonDocument doc(2048);
137     deserializeJson(doc, http.getString());
138     http.end();
139     return doc["current"]["is_day"] == 1;
140   }
141 
142   http.end();
143   return false;
144 }
145 
146 void gererJourNuit(int index) {
147   digitalWrite(ledJour, LOW);
148   digitalWrite(ledNuit, LOW);
149 
150   bool jour = estJour(villes[index]);
151 
152   if (jour) {
153     digitalWrite(ledJour, HIGH);
154     Serial.println("→ JOUR");
155   } else {
156     digitalWrite(ledNuit, HIGH);
157     Serial.println("→ NUIT");
158   }
159 }
160 
161 // =============== BOUTONS ===================
162 void gererBoutons() {
163   for (int i = 0; i < nbBoutons; i++) {
164     bool etatBouton = digitalRead(boutons[i]);
165 
166     if (etatBouton == LOW && etatBoutonAvant[i] == HIGH) {
167 
168       // Même bouton → tout éteindre
169       if (villeActive == i) {
170         digitalWrite(ledsVille[i], LOW);
171         digitalWrite(ledJour, LOW);
172         digitalWrite(ledNuit, LOW);
173         villeActive = -1;
174         Serial.println("Extinction");
175       }
176       else {
177         allumerVille(i);
178         gererJourNuit(i);
179       }
180     }
181 
182     etatBoutonAvant[i] = etatBouton;
183   }
184 }
185 
186 // ================= LOOP ====================
187 void loop() {
188   gererBoutons();
189   delay(50);
190 }

étapes de fabrication

étape 1 : Définition du concept

Choix de l’idée du projet, des fonctionnalités principales et des contraintes (nombre de villes, interaction utilisateur).

étape 2 : Répartition des rôles

Attribution des tâches au sein du groupe : électronique, programmation, mécanique, conception globale.

étape 3 : Conception du système

Réalisation des schémas fonctionnels : bouton de sélection, moteur du globe, LED jour/nuit.

étape 4 : Choix des composants

Sélection des composants électroniques (microcontrôleur, LED, moteur, alimentation).

étape 5 : Fabrication de la structure

Conception et assemblage de la boîte et du globe en papier.

étape 6 : Programmation

Développement du code permettant la sélection des villes, la rotation du globe et l’indication jour/nuit.

étape 7 : Intégration et câblage

Montage des composants dans la boîte et raccordement de l’ensemble.

étape 8 : Tests et ajustements

Vérification du bon fonctionnement, correction des erreurs et optimisation du système.

Troubleshouting

1. Le système ne réagit pas à l’appui sur le bouton

Problème : aucune action visible (globe, LED).

Causes possibles : bouton mal câblé, anti-rebond absent, erreur logique dans le code.

Solutions : vérifier le câblage et l’état lu par le microcontrôleur.

Astuce : afficher en debug la ville sélectionnée après chaque appui.

2. Le globe ne tourne pas ou mal

Problème : rotation bloquée, imprécise ou saccadée.

Causes possibles : moteur sous-dimensionné, frottements mécaniques, alimentation insuffisante.

Solutions : alléger le globe, améliorer l’axe, adapter la vitesse moteur.

Astuce : tester la rotation sans charge avant montage final.

3. Retard entre l’action et la réponse du système

Problème : temps d’attente après appui sur le bouton.

Causes possibles : latence de l’API ou traitement bloquant dans le code.

Solutions : structurer le programme en étapes (attente, requête, affichage).

Astuce : conserver la dernière donnée valide si l’API met trop de temps à répondre.

4. Erreurs aléatoires ou comportement incohérent

Problème : résultats différents pour la même ville.

Causes possibles : données API non gérées en cas d’erreur ou réponse incomplète.

Solutions : sécuriser le traitement des données reçues.

Astuce : toujours prévoir un cas « erreur API ».

5. Problèmes à l’intégration finale

Problème : tout fonctionne séparément mais pas ensemble.

Causes possibles : interférences, manque de place, câbles mal positionnés.

Solutions : revoir l’organisation interne de la boîte.

Astuce : intégrer progressivement et tester après chaque étape.

Sources et documentation complémentaire

Pour construire le Globe en papier :

Télécharger Globe en papier

Prompt Chatgpt pour relier le code qui fais tourner le moteur et celui qui allume les leds :

Relie ce code afin que lorsqu'on presse un bouton poussoir le moteur tourne de X degrés

Elément de présentation

Vue de face Vuedeface.jpg Vue de face papier Vuedefacepapier.jpg Vue de haut Vuedehaut.jpg Vue de haut papier Vuedehautpapier.jpg
Premier Brouillon Premierbrouillon.jpg

ne pas modifier sous cette ligne