C'est l'hiver ! Hiver.gif

ENIB 2026 : L'horloge du monde : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(description (résumé))
(Introduction)
 
(45 révisions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
Titre de la fiche expérience :
 
Titre de la fiche expérience :
 
==description (résumé)==
 
==description (résumé)==
éventuelle photo de l'équipe
 
  
 +
Design Final ! [[Fichier:1000024171.jpg|200px]]
 +
 +
 +
Premier croquis de l'horloge du monde :
 +
 
[[Fichier:1000024161.jpg|200px]]
 
[[Fichier:1000024161.jpg|200px]]
 +
 +
Visuelle de l'horloge du monde avant décoration :
 +
[[Fichier:1000024167.jpg|200px]]
 +
 +
 +
 +
[[Fichier:1000024163.jpg|200px]]
 +
 +
 +
  
 
L'horloge du monde est une petite horloge lowtech qui affiche l'heure des pays que l'on souhaite.
 
L'horloge du monde est une petite horloge lowtech qui affiche l'heure des pays que l'on souhaite.
Ligne 11 : Ligne 25 :
 
==Introduction==
 
==Introduction==
  
éventuelle vidéo
+
Dans le cadre du Hackathon organisé par les petits débrouillards nous avons choisis de faire cette '''Horloge du monde'''.
 +
 
 +
Cette '''Horloge du monde''' est constituée de deux cadrans, une pour les heures et une pour les minutes. En dessous de ces cadrans se trouve une carte du monde accompagnée de plusieurs LEDs à différents endroits de la carte. Pour finir, au dessus de cette petite boîte se trouve un bouton.
 +
 
 +
L'objectif de notre horloge est de pouvoir afficher l'heure de différents lieux par pression du bouton. Lorsque le bouton est pressé, une des LED s'allume sur la map monde et l'heure correspondante s'affiche sur nos cadrans. Après une nouvelle pression du bouton, la LED s'éteint, une nouvelle s'allume ailleurs sur la carte et la nouvelle heure s'affiche.
 +
 
 +
Au démarrage, il faudra appuyer sur le bouton lorsque les aiguilles sont à 0, pour les callibrer.
 +
 
 
==outil et matériel==
 
==outil et matériel==
  
 
'''Les images sont des exemples, vous pouvez en utiliser d'autres mais ils doivent être équivalent.'''  
 
'''Les images sont des exemples, vous pouvez en utiliser d'autres mais ils doivent être équivalent.'''  
  
- Cerveau moteur 360 x2
+
- moteur pas à pas x2 [[Fichier:1000024168.jpg|200px]]
[image]
+
 
  
 
- Bouton poussoir x1
 
- Bouton poussoir x1
[image]
 
  
- Petite led xle nombre de pays dont vous voulez avoir l'heure
+
 
[image]
+
- autant de résistance que de LED
 +
 
 +
- Petites LEDs ,prenez en autant que vous voulez pour afficher les différents pays
 +
 
  
 
- Carte esp32 x1 et un esp23s 38p x1
 
- Carte esp32 x1 et un esp23s 38p x1
[image]
 
  
- Câble male-femelle 2xnombre de led
 
[image]
 
  
-Carton, feuille A4, Ciseaux, Compa, Crayon papier, feutres, scotch, pistolet à colle
+
- Câble femelle-femelle, 2 pour chaque LED et 2 autres pour le bouton poussoir
 +
 
 +
 
 +
-Carton, feuille A4, Ciseaux, Compa, Crayon papier, feutres, scotch, pistolet à colle, Batterie
  
 
==fichiers à joindre==
 
==fichiers à joindre==
 
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
 
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
===Mettre du code Arduino===
+
===Code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#define PIN 9
 
#include <Arduino_GFX_Library.h>
 
  
void setup() {
+
#include <WiFi.h>
  // put your setup code here, to run once:
+
#include <HTTPClient.h>
 +
#include <ArduinoJson.h>
 +
#include <Stepper.h>
 +
 
 +
const int STEP_BY_REVOLUTION = 2038;
 +
 
 +
Stepper MinStepper(STEP_BY_REVOLUTION, 12, 27, 14, 26);
 +
Stepper HourStepper(STEP_BY_REVOLUTION, 15, 0, 2, 4);
 +
 
 +
const char* ssid = "Resaux 1";
 +
const char* password = "19842000";
 +
const String url = "http://worldtimeapi.org/api/timezone/";
 +
int HOUR = 0;
 +
int MINUTE = 0;
 +
float HOUR_ANGLE = 0;
 +
float MINUTE_ANGLE = 0;
 +
int button_state = 0;
 +
const char* cities[] = {"Europe/Paris","Asia/Hong_Kong","Australia/Canberra","America/Buenos_Aires","Africa/Johannesburg","America/Los_Angeles"};
 +
int city_index = 0;
 +
 
  
 +
 +
 +
void setup(){
 +
    Serial.println("-----------STARTING----------");
 +
    Serial.begin(115200); //setup du moniteur série
 +
    delay(1000);
 +
 +
    WiFi.mode(WIFI_STA); // mode station (connection à un Wifi)
 +
    WiFi.begin(ssid, password);  // connexion avec le nom du réseaux et le mot de passe
 +
    Serial.println("\nConnecting"); // afficahge lors de la connection
 +
 +
    while(WiFi.status() != WL_CONNECTED){
 +
        Serial.print(".");  // tant que l'on n'est pas connecté on ne passe pas au reste
 +
        delay(100);
 +
    }
 +
 +
    Serial.println("\nConnected to the WiFi network");  //on met un petit message lorsque l'on est connecté
 +
    Serial.print("Local ESP32 IP: ");
 +
    Serial.println(WiFi.localIP());// affichage de l'adresse IP de la carte
 +
 +
    //pin setp
 +
    //button
 +
    pinMode(25, INPUT);
 +
    //steppers
 +
    MinStepper.setSpeed(15);
 +
    HourStepper.setSpeed(15);
 +
    //LED
 +
    pinMode(19, OUTPUT); // LED d'Hong Kong
 +
    pinMode(18, OUTPUT); // LED de Canberra
 +
    pinMode(5, OUTPUT);  // LED de Paris
 +
    pinMode(17, OUTPUT); // LED de Johannesburg
 +
    pinMode(16, OUTPUT); // LED de Buenos_Aires
 +
    pinMode(21, OUTPUT); // LED de Los Angeles
 +
 +
    while(!digitalRead(25)) {
 +
      MinStepper.step(1);
 +
      delay(10);
 +
    }
 +
    delay(1000);
 +
    while(!digitalRead(25)) {
 +
      HourStepper.step(1);
 +
      delay(10);
 +
    }
 
}
 
}
  
void loop() {
+
void loop(){
   // put your main code here, to run repeatedly:
+
   button_state = digitalRead(25); //read button state
 +
  if (button_state) {
 +
    Serial.println(cities[city_index]);
 +
    get_time_from(cities[city_index]);
 +
    turn_on_LED();
 +
    city_index = (city_index + 1) % 6;
 +
    turn_hour();
 +
    Serial.println(HOUR);
 +
    Serial.println(HOUR_ANGLE);
 +
    turn_minute();
 +
    Serial.println(MINUTE);
 +
    Serial.println(MINUTE_ANGLE); 
 +
  }
 +
}
  
 +
void get_time_from(String place) {
 +
  HTTPClient http;
 +
  http.begin(url + place);
 +
  int httpCode = http.GET();
 +
 +
  while (httpCode != HTTP_CODE_OK) {
 +
    Serial.printf(".");
 +
    httpCode = http.GET();
 +
  }
 +
 +
  String receipt = http.getString();
 +
 +
  http.end();
 +
 +
  JsonDocument doc;
 +
  deserializeJson(doc, receipt);
 +
 +
  String time = doc["datetime"];
 +
  time = time.substring(11,time.length()-6);
 +
  Serial.println(time);
 +
 +
  HOUR = time.toInt();
 +
  MINUTE = time.substring(3,5).toInt();
 
}
 
}
  
</syntaxhighlight>
+
// clear all LEDs
 +
void clear_LED() {
 +
  digitalWrite(19,0);
 +
  digitalWrite(18,0);
 +
  digitalWrite(5,0);
 +
  digitalWrite(17,0);
 +
  digitalWrite(16,0);
 +
  digitalWrite(21,0);
 +
}
 +
 
 +
void turn_minute() {
 +
  float angle = MINUTE * 360 / 60;
 +
  int turn_by = STEP_BY_REVOLUTION*(angle - MINUTE_ANGLE)/360;
 +
  MINUTE_ANGLE = (int)(angle)%360;
 +
  MinStepper.step(-turn_by);
 +
}
 +
 
 +
void turn_hour() {
 +
  float angle = HOUR * 360 / 12;
 +
  int turn_by = STEP_BY_REVOLUTION*(angle - HOUR_ANGLE)/360;
 +
  HOUR_ANGLE = (int)(angle)%360;
 +
  HourStepper.step(-turn_by);
 +
 
 +
 
 +
}
 +
 
 +
void turn_on_LED() {
 +
  clear_LED();
 +
  switch(city_index) {
 +
    case 1 :
 +
      digitalWrite(19,1);
 +
      break;
 +
    case 2 :
 +
      digitalWrite(18,1);
 +
      break;
 +
    case 0 :
 +
      digitalWrite(5,1);
 +
      break;
 +
    case 4 :
 +
      digitalWrite(17,1);
 +
      break;
 +
    case 3 :
 +
      digitalWrite(16,1);
 +
      break;
 +
    case 5 :
 +
      digitalWrite(21,1);
 +
      break;
 +
  }
 +
}
  
 
==étapes de fabrication==
 
==étapes de fabrication==
Ligne 64 : Ligne 231 :
 
Faire un trou pour le bouton sur le carton de 20cmx16cm  
 
Faire un trou pour le bouton sur le carton de 20cmx16cm  
  
Faire des trous au milieu des cadrans ( pour la partie blanche des cerveaux moteur que nous avons utiliser )
+
Faire des trous au milieu des cadrans ( pour la partie qui tourne du moteur ) [[Fichier:1000024164.jpg|200px]]
  
 
===étape 2===
 
===étape 2===
Ligne 70 : Ligne 237 :
 
Récupérer le code et le téléverser sur la carte esp32, pour se faire :
 
Récupérer le code et le téléverser sur la carte esp32, pour se faire :
  
explication
+
- Téléchargez ArduinoIDE en suivant ces instructions :
 +
https://support.arduino.cc/hc/en-us/articles/360019833020-Download-and-install-Arduino-IDE
 +
 
 +
- Ajouter la carte ESP32 à l'IDE en suivant ce tutoriel :
 +
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino#:~:text=Allez%20dans%20outil%20%2D%3E%20type%20de,puis%20cliquez%20sur%20%22installer%22.
 +
 
 +
- Copier collez le code fournit dans le wiki dans l'IDE et téléverser celui-ci dans la carte.
 +
 
 +
===étape 3===
 +
 
 +
Coller la map monde et les cadrans sur la face avant  [[Fichier:1000024167.jpg|200px]]
 +
 
 +
 
 +
puis coller les cotés avec le haut et la base. [[Fichier:1000024162.jpg|200px]]
 +
 
 +
 
 +
Pour mettre les LEDs il suffit de faire un trou avec la pointe d'un compa et de forcer délicatement.
 +
 
 +
 
 +
Câbler tout le circuit [[Fichier:1000024170.jpg|200px]] à l'aide de ce schéma : [[Fichier:Cablage horloge du monde.png|200px]]
 +
 
 +
ATTENTION ! Sur le schéma les moteurs ne sont pas les bons ainsi la carte arduino, les ports de la carte ne sont donc pas les bons, voici les ports que nous avons utlisés:
 +
 
 +
19-> Pekin, 18-> Camberra, 5-> Paris, 17-> Le cap, 16-> Brazilia, 21-> Los Angeles.
 +
 
 +
ATTENTION ! les LEDs ont un sens, la broche la plus longue est + et l'autre -. [[Fichier:1000024169.jpg|200px]]
  
===étape ...===
 
 
===Troubleshouting===
 
===Troubleshouting===
 
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
 
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
 +
 +
 +
Difficultés avec la carte esp32 pour installer les librairies et ...
 +
 +
 +
Difficultés avec les servomoteur car on n'arrivait pas à avoir un angle précis donc on les a remplacé par des moteurs pas à pas beaucoup plus adpater dans notre cas.
  
 
==Sources et documentation complémentaire==
 
==Sources et documentation complémentaire==

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

Titre de la fiche expérience :

description (résumé)

Design Final ! 1000024171.jpg


Premier croquis de l'horloge du monde :

1000024161.jpg

Visuelle de l'horloge du monde avant décoration : 1000024167.jpg


1000024163.jpg



L'horloge du monde est une petite horloge lowtech qui affiche l'heure des pays que l'on souhaite. Elle affiche l'heure sur un cadran et les minutes sur l'autre. Une led s'allume sur le pays ou l'heure est affiché et l'on appuie sur le bouton pour changer de pays.

Introduction

Dans le cadre du Hackathon organisé par les petits débrouillards nous avons choisis de faire cette Horloge du monde.

Cette Horloge du monde est constituée de deux cadrans, une pour les heures et une pour les minutes. En dessous de ces cadrans se trouve une carte du monde accompagnée de plusieurs LEDs à différents endroits de la carte. Pour finir, au dessus de cette petite boîte se trouve un bouton.

L'objectif de notre horloge est de pouvoir afficher l'heure de différents lieux par pression du bouton. Lorsque le bouton est pressé, une des LED s'allume sur la map monde et l'heure correspondante s'affiche sur nos cadrans. Après une nouvelle pression du bouton, la LED s'éteint, une nouvelle s'allume ailleurs sur la carte et la nouvelle heure s'affiche.

Au démarrage, il faudra appuyer sur le bouton lorsque les aiguilles sont à 0, pour les callibrer.

outil et matériel

Les images sont des exemples, vous pouvez en utiliser d'autres mais ils doivent être équivalent.

- moteur pas à pas x2 1000024168.jpg


- Bouton poussoir x1


- autant de résistance que de LED

- Petites LEDs ,prenez en autant que vous voulez pour afficher les différents pays


- Carte esp32 x1 et un esp23s 38p x1


- Câble femelle-femelle, 2 pour chaque LED et 2 autres pour le bouton poussoir


-Carton, feuille A4, Ciseaux, Compa, Crayon papier, feutres, scotch, pistolet à colle, Batterie

fichiers à joindre

code, ficher d'impression 3D, de découpe laser ou vinyle, ...

Code Arduino

<syntaxhighlight lang="Arduino" line>

  1. include <WiFi.h>
  2. include <HTTPClient.h>
  3. include <ArduinoJson.h>
  4. include <Stepper.h>

const int STEP_BY_REVOLUTION = 2038;

Stepper MinStepper(STEP_BY_REVOLUTION, 12, 27, 14, 26); Stepper HourStepper(STEP_BY_REVOLUTION, 15, 0, 2, 4);

const char* ssid = "Resaux 1"; const char* password = "19842000"; const String url = "http://worldtimeapi.org/api/timezone/"; int HOUR = 0; int MINUTE = 0; float HOUR_ANGLE = 0; float MINUTE_ANGLE = 0; int button_state = 0; const char* cities[] = {"Europe/Paris","Asia/Hong_Kong","Australia/Canberra","America/Buenos_Aires","Africa/Johannesburg","America/Los_Angeles"}; int city_index = 0;



void setup(){

   Serial.println("-----------STARTING----------");
   Serial.begin(115200); //setup du moniteur série
   delay(1000);
   WiFi.mode(WIFI_STA); // mode station (connection à un Wifi)
   WiFi.begin(ssid, password);  // connexion avec le nom du réseaux et le mot de passe
   Serial.println("\nConnecting"); // afficahge lors de la connection 
   while(WiFi.status() != WL_CONNECTED){ 
       Serial.print(".");  // tant que l'on n'est pas connecté on ne passe pas au reste 
       delay(100);
   }
   Serial.println("\nConnected to the WiFi network");  //on met un petit message lorsque l'on est connecté
   Serial.print("Local ESP32 IP: "); 
   Serial.println(WiFi.localIP());// affichage de l'adresse IP de la carte
   //pin setp
   //button
   pinMode(25, INPUT);
   //steppers
   MinStepper.setSpeed(15);
   HourStepper.setSpeed(15);
   //LED
   pinMode(19, OUTPUT); // LED d'Hong Kong
   pinMode(18, OUTPUT); // LED de Canberra
   pinMode(5, OUTPUT);  // LED de Paris
   pinMode(17, OUTPUT); // LED de Johannesburg
   pinMode(16, OUTPUT); // LED de Buenos_Aires
   pinMode(21, OUTPUT); // LED de Los Angeles
   while(!digitalRead(25)) {
     MinStepper.step(1);
     delay(10);
   }
   delay(1000);
   while(!digitalRead(25)) {
     HourStepper.step(1);
     delay(10);
   }

}

void loop(){

 button_state = digitalRead(25); //read button state
 if (button_state) {
   Serial.println(cities[city_index]);
   get_time_from(cities[city_index]);
   turn_on_LED();
   city_index = (city_index + 1) % 6;
   turn_hour();
   Serial.println(HOUR);
   Serial.println(HOUR_ANGLE);
   turn_minute();
   Serial.println(MINUTE);
   Serial.println(MINUTE_ANGLE);  
 }

}

void get_time_from(String place) {

 HTTPClient http;
 http.begin(url + place);
 int httpCode = http.GET();
 while (httpCode != HTTP_CODE_OK) {
   Serial.printf(".");
   httpCode = http.GET();
 }
 String receipt = http.getString();
 http.end();
 JsonDocument doc;
 deserializeJson(doc, receipt);
 String time = doc["datetime"];
 time = time.substring(11,time.length()-6);
 Serial.println(time);
 HOUR = time.toInt();
 MINUTE = time.substring(3,5).toInt();

}

// clear all LEDs void clear_LED() {

 digitalWrite(19,0);
 digitalWrite(18,0);
 digitalWrite(5,0);
 digitalWrite(17,0);
 digitalWrite(16,0);
 digitalWrite(21,0);

}

void turn_minute() {

 float angle = MINUTE * 360 / 60;
 int turn_by = STEP_BY_REVOLUTION*(angle - MINUTE_ANGLE)/360;
 MINUTE_ANGLE = (int)(angle)%360;
 MinStepper.step(-turn_by);

}

void turn_hour() {

 float angle = HOUR * 360 / 12;
 int turn_by = STEP_BY_REVOLUTION*(angle - HOUR_ANGLE)/360; 
 HOUR_ANGLE = (int)(angle)%360;
 HourStepper.step(-turn_by);
 
 

}

void turn_on_LED() {

 clear_LED();
 switch(city_index) {
   case 1 :
     digitalWrite(19,1);
     break;
   case 2 :
     digitalWrite(18,1);
     break;
   case 0 :
     digitalWrite(5,1);
     break;
   case 4 :
     digitalWrite(17,1);
     break;
   case 3 :
     digitalWrite(16,1);
     break;
   case 5 :
     digitalWrite(21,1);
     break;
 }

}

étapes de fabrication

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

étape 1

Découper le carton en 3 rectangles de 40cmx16cm, 20cmx16cm, et un dernier pour la base d'au moins 20cmx16cm.

Sur une feuille A4, imprimer ou dessiner ou décalquer une map monde de 20cmx11cm. Même chose pour les deux cadrans de 2cm de rayon.

Faire un trou pour le bouton sur le carton de 20cmx16cm

Faire des trous au milieu des cadrans ( pour la partie qui tourne du moteur ) 1000024164.jpg

étape 2

Récupérer le code et le téléverser sur la carte esp32, pour se faire :

- Téléchargez ArduinoIDE en suivant ces instructions : https://support.arduino.cc/hc/en-us/articles/360019833020-Download-and-install-Arduino-IDE

- Ajouter la carte ESP32 à l'IDE en suivant ce tutoriel : https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino#:~:text=Allez%20dans%20outil%20%2D%3E%20type%20de,puis%20cliquez%20sur%20%22installer%22.

- Copier collez le code fournit dans le wiki dans l'IDE et téléverser celui-ci dans la carte.

étape 3

Coller la map monde et les cadrans sur la face avant 1000024167.jpg


puis coller les cotés avec le haut et la base. 1000024162.jpg


Pour mettre les LEDs il suffit de faire un trou avec la pointe d'un compa et de forcer délicatement.


Câbler tout le circuit 1000024170.jpg à l'aide de ce schéma : Cablage horloge du monde.png

ATTENTION ! Sur le schéma les moteurs ne sont pas les bons ainsi la carte arduino, les ports de la carte ne sont donc pas les bons, voici les ports que nous avons utlisés:

19-> Pekin, 18-> Camberra, 5-> Paris, 17-> Le cap, 16-> Brazilia, 21-> Los Angeles.

ATTENTION ! les LEDs ont un sens, la broche la plus longue est + et l'autre -. 1000024169.jpg

Troubleshouting

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


Difficultés avec la carte esp32 pour installer les librairies et ...


Difficultés avec les servomoteur car on n'arrivait pas à avoir un angle précis donc on les a remplacé par des moteurs pas à pas beaucoup plus adpater dans notre cas.

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