ENIB 2026 : L'horloge du monde : Différence entre versions
(Annulation des modifications 36669 de Gauthier (discussion)) |
(→Code Arduino) |
||
| Ligne 58 : | Ligne 58 : | ||
===Code Arduino=== | ===Code Arduino=== | ||
<syntaxhighlight lang="Arduino" line> | <syntaxhighlight lang="Arduino" line> | ||
| − | # | + | #include <WiFi.h> |
| − | #include < | + | #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); | ||
| + | pinMode(18, OUTPUT); | ||
| + | pinMode(5, OUTPUT); | ||
| + | pinMode(17, OUTPUT); | ||
| + | pinMode(16, OUTPUT); | ||
| + | pinMode(21, OUTPUT); | ||
} | } | ||
| − | void loop() { | + | 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== | ==étapes de fabrication== | ||
Version du 20 janvier 2026 à 15:42
Titre de la fiche expérience :
Sommaire
description (résumé)
Premier croquis de l'horloge du monde :
Visuelle de l'horloge du monde avant décoration :
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.
outil et matériel
Les images sont des exemples, vous pouvez en utiliser d'autres mais ils doivent être équivalent.
- 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>
- include <WiFi.h>
- 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); pinMode(18, OUTPUT); pinMode(5, OUTPUT); pinMode(17, OUTPUT); pinMode(16, OUTPUT); pinMode(21, OUTPUT);
}
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 )
étape 2
Récupérer le code et le téléverser sur la carte esp32, pour se faire :
explication
étape 3
Coller la map monde et les cadrans sur la face avant
puis coller les cotés avec le haut et la base.
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
à l'aide de ce schéma : [image]
Attention ! les LEDs ont un sens, la broche la plus longue est + et l'autre -.
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