ENIB 2026 : sabliLED : Différence entre versions
(→description (résumé)) |
|||
| (43 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 : | ||
| − | == | + | ==présentation temporaire== |
| − | + | [[Image:Présentation nezouz.png|250px|left|thumb|<center>Diapo</center>]] | |
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==Introduction (résumé)== | ||
| + | Voilà c'est enfin le début du projet Hackaton. TROP BIEN !!! ;) | ||
| + | Pour ce projet nous avons décidé de créer le SabliLED pour vous permettre de cuire | ||
| + | des pattes de manière stylé. Avec son design parfait pour décorer | ||
| + | l'intérieur de votre cuisine, vous ne serez jamais en manque de chronomètre. | ||
| + | |||
| + | [[Image:L'équipe SabliLED.jpeg|250px|left|thumb|<center>l'équipe SabliLED</center>]] | ||
| + | |||
| + | ==Descrition== | ||
| + | Dans ce projet nous avons décidé de réaliser un sablier avec des LED. Pour cela il nous a fallut créer le cicuit électronique avec les bon composants bien cablés. Par la suite, | ||
| + | nous avons créé un code pour faire en sorte que l'allumage des LED s'accumule en fonction du temps passé. Afin de pouvoir régler le temps du minuteur, nous avons décidé de rajouter un potentiomètre tout en adaptant le code Arduino. Pour notre API nous avons décider de réaliser une télécommande d'allumage a distance qui fonctionne en wifi. Après avoir finis l'aspect technique et pour finir le projet, nous avons réalisé l'esthétique du SabliLED qui est épuré et design. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| − | |||
| − | |||
| − | |||
| − | |||
==outil et matériel== | ==outil et matériel== | ||
| + | * des cables | ||
| + | * une plaque labdec | ||
| + | * 2 cartes Arduino ESP 32 | ||
| + | * un Bandeau de LED | ||
| + | * un bouton poussoir | ||
| + | * votre ordinateur | ||
| + | * un cable USB | ||
| + | * logiciel Arduino | ||
| + | |||
| + | |||
| + | ==Code Arduino== | ||
| + | ===Serveur=== | ||
| + | |||
| + | <syntaxhighlight lang="Arduino" line> | ||
| + | |||
| + | #include <WiFi.h> | ||
| + | #include <WiFiUdp.h> | ||
| + | |||
| + | const char* ssid = "sabliLED"; | ||
| + | const char* password = "12345678"; | ||
| + | |||
| + | int bp = 34; | ||
| + | |||
| + | WiFiUDP udp; | ||
| + | const int udpPort = 12345; | ||
| + | IPAddress broadcastIP(192, 168, 4, 255); // broadcast AP ESP32 | ||
| + | |||
| + | bool lastState = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | pinMode(bp, INPUT); | ||
| + | |||
| + | WiFi.mode(WIFI_AP); | ||
| + | WiFi.softAP(ssid, password); | ||
| + | |||
| + | udp.begin(udpPort); | ||
| + | |||
| + | Serial.println("AP lancé"); | ||
| + | Serial.print("IP AP : "); | ||
| + | Serial.println(WiFi.softAPIP()); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | bool currentState = digitalRead(bp) == HIGH; | ||
| + | |||
| + | // Envoie uniquement si changement d’état | ||
| + | if (currentState != lastState) { | ||
| + | udp.beginPacket(broadcastIP, udpPort); | ||
| + | udp.write(currentState ? '1' : '0'); | ||
| + | udp.endPacket(); | ||
| + | |||
| + | Serial.print("BP envoyé : "); | ||
| + | Serial.println(currentState ? "HAUT" : "BAS"); | ||
| + | |||
| + | lastState = currentState; | ||
| + | } | ||
| + | |||
| + | delay(50); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | ===Client=== | ||
| − | |||
| − | |||
| − | |||
<syntaxhighlight lang="Arduino" line> | <syntaxhighlight lang="Arduino" line> | ||
| − | #define | + | |
| − | #include < | + | #define FASTLED_ALLOW_INTERRUPTS 0 // Empêche le Wi-Fi de casser le signal LED |
| + | #include <FastLED.h> | ||
| + | #include <WiFi.h> | ||
| + | #include <WiFiClient.h> | ||
| + | #include <WiFiUdp.h> | ||
| + | |||
| + | |||
| + | #define NUM_LEDS 30 | ||
| + | #define DATA_PIN 25 | ||
| + | |||
| + | WiFiUDP udp; | ||
| + | const int udpPort = 12345; | ||
| + | |||
| + | int BP_Pin = 34; | ||
| + | int POT_Pin = 35; | ||
| + | bool bpDistant = false; | ||
| + | |||
| + | CRGB leds[NUM_LEDS]; | ||
void setup() { | void setup() { | ||
| − | + | Serial.begin(115200); | |
| + | delay(500); | ||
| + | FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); | ||
| + | |||
| + | pinMode(BP_Pin,INPUT); | ||
| + | //partie WIFI | ||
| + | |||
| + | WiFi.begin("sabliLED", "12345678"); | ||
| + | |||
| + | Serial.print("Connection en cours"); | ||
| + | while (WiFi.status() != WL_CONNECTED) // tant que l'esp n'est pas connecté au réseau on attends | ||
| + | { | ||
| + | delay(500); | ||
| + | Serial.print("."); | ||
| + | } | ||
| + | Serial.println(); | ||
| + | Serial.print("Connecté, adresse IP : "); | ||
| + | Serial.println(WiFi.localIP()); | ||
| + | udp.begin(udpPort); | ||
| + | |||
| + | for (int i = 0; i < NUM_LEDS; i++) { | ||
| + | leds[i] = CRGB::Black; | ||
| + | } | ||
| + | FastLED.show(); | ||
| + | |||
} | } | ||
| + | void resetSablier(){ | ||
| + | FastLED.clear(); | ||
| + | FastLED.show(); | ||
| + | } | ||
| + | bool boutonAppuyer(){ | ||
| + | if (digitalRead(BP_Pin)==HIGH){ | ||
| + | delay(30); | ||
| + | return digitalRead(BP_Pin)==HIGH; | ||
| + | } | ||
| + | return false; | ||
| + | } | ||
| + | int lireVitesse(){ | ||
| + | int valeur = analogRead(POT_Pin); | ||
| + | int vitesseMin=3000/NUM_LEDS; // à modifier pour changer le temps min | ||
| + | int vitesseMax=20000/NUM_LEDS; // à modifier pour changer le temps max | ||
| + | return map(valeur,0,4095,vitesseMin,vitesseMax); | ||
| + | } | ||
void loop() { | void loop() { | ||
| − | + | int packetSize = udp.parsePacket(); | |
| + | if (packetSize) { | ||
| + | char c = udp.read(); | ||
| + | bpDistant = (c == '1'); | ||
| + | Serial.print("BP reçu : "); | ||
| + | Serial.println(bpDistant ? "HAUT" : "BAS"); | ||
| + | } | ||
| + | |||
| + | if (bpDistant) { | ||
| + | for(int y=0; y<=30;y++) { | ||
| + | for (int i=NUM_LEDS; i>y; i--){ | ||
| + | uint8_t hue = map(i,0,NUM_LEDS-1,0,96); | ||
| + | leds[i]=CHSV(hue,255,255); | ||
| + | FastLED.show(); | ||
| + | delay(lireVitesse()); | ||
| + | leds[i]=CRGB::Black; | ||
| + | FastLED.show(); | ||
| + | } | ||
| + | uint8_t hueBottom = map(y,0,NUM_LEDS-1,0,96); | ||
| + | leds[y]=CHSV(hueBottom,255,255); | ||
| + | FastLED.show(); | ||
| + | } | ||
| + | } | ||
} | } | ||
| Ligne 31 : | Ligne 197 : | ||
==étapes de fabrication== | ==étapes de fabrication== | ||
| − | + | Présentation détaillé du projet avec tout les aspects technique | |
===étape 1=== | ===étape 1=== | ||
| + | La première étape a été d'imaginer le projet et de bien définir son aspect ludique. Nous avons dans un premier temps voulus imaginer une horloge pour jouer aux échec mais cela n'était pas en accord avec les objectifs du projet. Nous avons décider de repenser le projet de base pour fabriquer un sablier électronique. | ||
| + | |||
===étape 2=== | ===étape 2=== | ||
| − | ===étape | + | Avant de commencer le projet il nous fallait définir son intêret ludique. Nous avons trouvez un intéret pour les classes de maternelle et primaire notamment, pour que lors d'un exercice ou d'une évalution chronometré, tous les élèves puissent suivre l'avancée du chrono grâce au bandeau de LED accroché dans la classe. L'enseignant pourra également lancer le minuteur à distance. |
| − | === | + | |
| − | + | ===étape 3=== | |
| + | Pour passer à la conception du produit, il fallu se renseigner sur le fonctionnement de la carte ESP 32, que ce soit pour la connecter au logiciel Arduino ou pour la cabler correctement. Il a fallu aussi cabler corretement le bandeau de LED, tout cela à l'aide de la plaque labdec. | ||
| + | |||
| + | ===étape 4=== | ||
| + | Nous sommes ensuite passé au codage du bandeau de LED. Au départ, juste parvenir à afficher toutes les leds puis à les afficher en cascade pour symboliser le temps qui s'écoule. Après ça, il fallait ajouter l'accumluation de LED symbolisant le temps deja écoulé. La difficulté était d'avoir cette fonctionnalité tout en gradant l'écoulement du temps avec les LED. Pour finir cette étape il ne restait plus qu'à faire un dégradé de couleur du vert au rouge pour avoir un rendu plus esthétique. | ||
| + | |||
| + | ===étape 5=== | ||
| + | Il fallait ensuite ajouter des fonctions suplémentaires : L'activation du minuteur grâce à un bouton poussoir (en local d'abord). Le changement de valeur du minuteur à l'aide d'un potentiométre. | ||
| + | |||
| + | ===étape 6=== | ||
| + | Nous avons du concevoir un support en carton en forme de sablier pour y mettre le bandeau LED dedans. Ensuite nous avons rajouter une feuille de papier blanc sur le bandeau pour avoir une lumière plus dispersée et donc un tout uniforme plutot que 30 LED indépendantes. | ||
| + | |||
| + | |||
| + | [[Image:Patron.jpeg|150px]][[Image:Patronroman.jpeg|150px]] | ||
| + | |||
| + | longueur : 55,5 cm | largeur max : 19,5 cm | ||
| + | |||
| + | ===étape 7=== | ||
| + | Connexon du bouton à distance grâce a l'API | ||
| + | |||
| − | |||
| − | + | ===Troubleshouting=== | |
| − | + | (Quelles sont les difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?) | |
| − | + | Nous avons rencontré des difficultés pour connecter la carte avec nos logiciels Arduino car il fallait bien interpréter certaines indications du wiki. De plus la carte était bien connectée mais il fallait appuyer sur le bouton "BOOT" de la ESP32 pour lancer notre code à chaque fois (difficile d'avancer sans se rendre compte de cela). | |
| − | |||
| − | + | Pour le support, il fallait trouver un moyen de bien fixer le bandeau tout en prenant en compte que les cables de ce dernier sont relativement courts. | |
| − | |||
| − | + | Nous avons également rencontré des difficultés pour connecter les 2 cartes éléctroniques entre elles. | |
| − | |||
==Elément de présentation== | ==Elément de présentation== | ||
| − | |||
==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:36
Titre de la fiche expérience :
Sommaire
présentation temporaire
Introduction (résumé)
Voilà c'est enfin le début du projet Hackaton. TROP BIEN !!! ;) Pour ce projet nous avons décidé de créer le SabliLED pour vous permettre de cuire des pattes de manière stylé. Avec son design parfait pour décorer l'intérieur de votre cuisine, vous ne serez jamais en manque de chronomètre.
Descrition
Dans ce projet nous avons décidé de réaliser un sablier avec des LED. Pour cela il nous a fallut créer le cicuit électronique avec les bon composants bien cablés. Par la suite, nous avons créé un code pour faire en sorte que l'allumage des LED s'accumule en fonction du temps passé. Afin de pouvoir régler le temps du minuteur, nous avons décidé de rajouter un potentiomètre tout en adaptant le code Arduino. Pour notre API nous avons décider de réaliser une télécommande d'allumage a distance qui fonctionne en wifi. Après avoir finis l'aspect technique et pour finir le projet, nous avons réalisé l'esthétique du SabliLED qui est épuré et design.
outil et matériel
- des cables
- une plaque labdec
- 2 cartes Arduino ESP 32
- un Bandeau de LED
- un bouton poussoir
- votre ordinateur
- un cable USB
- logiciel Arduino
Code Arduino
Serveur
1
2
3 #include <WiFi.h>
4 #include <WiFiUdp.h>
5
6 const char* ssid = "sabliLED";
7 const char* password = "12345678";
8
9 int bp = 34;
10
11 WiFiUDP udp;
12 const int udpPort = 12345;
13 IPAddress broadcastIP(192, 168, 4, 255); // broadcast AP ESP32
14
15 bool lastState = false;
16
17 void setup() {
18 Serial.begin(115200);
19 pinMode(bp, INPUT);
20
21 WiFi.mode(WIFI_AP);
22 WiFi.softAP(ssid, password);
23
24 udp.begin(udpPort);
25
26 Serial.println("AP lancé");
27 Serial.print("IP AP : ");
28 Serial.println(WiFi.softAPIP());
29 }
30
31 void loop() {
32 bool currentState = digitalRead(bp) == HIGH;
33
34 // Envoie uniquement si changement d’état
35 if (currentState != lastState) {
36 udp.beginPacket(broadcastIP, udpPort);
37 udp.write(currentState ? '1' : '0');
38 udp.endPacket();
39
40 Serial.print("BP envoyé : ");
41 Serial.println(currentState ? "HAUT" : "BAS");
42
43 lastState = currentState;
44 }
45
46 delay(50);
47 }
Client
1
2
3 #define FASTLED_ALLOW_INTERRUPTS 0 // Empêche le Wi-Fi de casser le signal LED
4 #include <FastLED.h>
5 #include <WiFi.h>
6 #include <WiFiClient.h>
7 #include <WiFiUdp.h>
8
9
10 #define NUM_LEDS 30
11 #define DATA_PIN 25
12
13 WiFiUDP udp;
14 const int udpPort = 12345;
15
16 int BP_Pin = 34;
17 int POT_Pin = 35;
18 bool bpDistant = false;
19
20 CRGB leds[NUM_LEDS];
21
22 void setup() {
23 Serial.begin(115200);
24 delay(500);
25 FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
26
27 pinMode(BP_Pin,INPUT);
28
29 //partie WIFI
30
31 WiFi.begin("sabliLED", "12345678");
32
33 Serial.print("Connection en cours");
34 while (WiFi.status() != WL_CONNECTED) // tant que l'esp n'est pas connecté au réseau on attends
35 {
36 delay(500);
37 Serial.print(".");
38 }
39 Serial.println();
40 Serial.print("Connecté, adresse IP : ");
41 Serial.println(WiFi.localIP());
42 udp.begin(udpPort);
43
44 for (int i = 0; i < NUM_LEDS; i++) {
45 leds[i] = CRGB::Black;
46 }
47 FastLED.show();
48
49 }
50 void resetSablier(){
51 FastLED.clear();
52 FastLED.show();
53 }
54 bool boutonAppuyer(){
55 if (digitalRead(BP_Pin)==HIGH){
56 delay(30);
57 return digitalRead(BP_Pin)==HIGH;
58 }
59 return false;
60 }
61 int lireVitesse(){
62 int valeur = analogRead(POT_Pin);
63 int vitesseMin=3000/NUM_LEDS; // à modifier pour changer le temps min
64 int vitesseMax=20000/NUM_LEDS; // à modifier pour changer le temps max
65
66 return map(valeur,0,4095,vitesseMin,vitesseMax);
67 }
68 void loop() {
69 int packetSize = udp.parsePacket();
70 if (packetSize) {
71 char c = udp.read();
72 bpDistant = (c == '1');
73
74 Serial.print("BP reçu : ");
75 Serial.println(bpDistant ? "HAUT" : "BAS");
76 }
77
78 if (bpDistant) {
79 for(int y=0; y<=30;y++) {
80 for (int i=NUM_LEDS; i>y; i--){
81 uint8_t hue = map(i,0,NUM_LEDS-1,0,96);
82 leds[i]=CHSV(hue,255,255);
83 FastLED.show();
84 delay(lireVitesse());
85 leds[i]=CRGB::Black;
86 FastLED.show();
87 }
88 uint8_t hueBottom = map(y,0,NUM_LEDS-1,0,96);
89 leds[y]=CHSV(hueBottom,255,255);
90 FastLED.show();
91 }
92 }
93 }
étapes de fabrication
Présentation détaillé du projet avec tout les aspects technique
étape 1
La première étape a été d'imaginer le projet et de bien définir son aspect ludique. Nous avons dans un premier temps voulus imaginer une horloge pour jouer aux échec mais cela n'était pas en accord avec les objectifs du projet. Nous avons décider de repenser le projet de base pour fabriquer un sablier électronique.
étape 2
Avant de commencer le projet il nous fallait définir son intêret ludique. Nous avons trouvez un intéret pour les classes de maternelle et primaire notamment, pour que lors d'un exercice ou d'une évalution chronometré, tous les élèves puissent suivre l'avancée du chrono grâce au bandeau de LED accroché dans la classe. L'enseignant pourra également lancer le minuteur à distance.
étape 3
Pour passer à la conception du produit, il fallu se renseigner sur le fonctionnement de la carte ESP 32, que ce soit pour la connecter au logiciel Arduino ou pour la cabler correctement. Il a fallu aussi cabler corretement le bandeau de LED, tout cela à l'aide de la plaque labdec.
étape 4
Nous sommes ensuite passé au codage du bandeau de LED. Au départ, juste parvenir à afficher toutes les leds puis à les afficher en cascade pour symboliser le temps qui s'écoule. Après ça, il fallait ajouter l'accumluation de LED symbolisant le temps deja écoulé. La difficulté était d'avoir cette fonctionnalité tout en gradant l'écoulement du temps avec les LED. Pour finir cette étape il ne restait plus qu'à faire un dégradé de couleur du vert au rouge pour avoir un rendu plus esthétique.
étape 5
Il fallait ensuite ajouter des fonctions suplémentaires : L'activation du minuteur grâce à un bouton poussoir (en local d'abord). Le changement de valeur du minuteur à l'aide d'un potentiométre.
étape 6
Nous avons du concevoir un support en carton en forme de sablier pour y mettre le bandeau LED dedans. Ensuite nous avons rajouter une feuille de papier blanc sur le bandeau pour avoir une lumière plus dispersée et donc un tout uniforme plutot que 30 LED indépendantes.
longueur : 55,5 cm | largeur max : 19,5 cm
étape 7
Connexon du bouton à distance grâce a l'API
Troubleshouting
(Quelles sont les difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?)
Nous avons rencontré des difficultés pour connecter la carte avec nos logiciels Arduino car il fallait bien interpréter certaines indications du wiki. De plus la carte était bien connectée mais il fallait appuyer sur le bouton "BOOT" de la ESP32 pour lancer notre code à chaque fois (difficile d'avancer sans se rendre compte de cela).
Pour le support, il fallait trouver un moyen de bien fixer le bandeau tout en prenant en compte que les cables de ce dernier sont relativement courts.
Nous avons également rencontré des difficultés pour connecter les 2 cartes éléctroniques entre elles.