C'est l'hiver ! Hiver.gif

ENIB 2026 : Enibel : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(Notre histoire)
(Notre histoire)
Ligne 290 : Ligne 290 :
 
Un problème que nous avons eu durant le premier jour est que deux personnes du groupe ne pouvait pas suivre le tuto de téléchargement pour l'ESP32S. La solution à ce problème était la lenteur de la connexion du local, il fallait une connexion assez rapide et surtout stable.
 
Un problème que nous avons eu durant le premier jour est que deux personnes du groupe ne pouvait pas suivre le tuto de téléchargement pour l'ESP32S. La solution à ce problème était la lenteur de la connexion du local, il fallait une connexion assez rapide et surtout stable.
  
Lorsque nous avons voulu connecter la carte à notre ordinateur, la carte indiquée par le tuto n'était pas la bonne. Dans notre cas, c'était la "ESP32-WROOM-DA Module"
+
Lorsque nous avons voulu connecter la carte à notre ordinateur, la carte indiquée par le tuto n'était pas la bonne. Dans notre cas, c'était la : ESP32-WROOM-DA Module
  
 
Un problème que nous avons rencontré est le branchement du panneau LED qui ne marchait sur aucun des appareils de l'équipe et le téléversement du code sur l'ESP32S avec l'erreur.  
 
Un problème que nous avons rencontré est le branchement du panneau LED qui ne marchait sur aucun des appareils de l'équipe et le téléversement du code sur l'ESP32S avec l'erreur.  

Version du 20 janvier 2026 à 12:03

Introduction

Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par Les Petits Débrouillards et Les Fabriques du Ponant.

L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : un Petit Objet Connecté Ludique.

Notre projet doit également être documenté, c’est pourquoi ce wiki a été créé, afin de retracer la genèse et l’évolution de notre travail.

Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.

Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.

Une fois le système installé, une limite de décibels sera définie dans le code que nous fournirons, afin de déclencher l’allumage des LED selon le niveau de bruit. 3 niveaux :

  • Vert : le niveau sonore est faible
  • Jaune : le niveau sonore est assez élevé
  • Rouge : le niveau sonore est très élevé

Équipe

Voici notre équipe :

Enib.jpg

À gauche : Léïa et Maël

À droite : Arthur et Alexis

Ainsi que Mael, non présent lors de la photo

Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB

Logo-enib.png

Outils et matériel

Pour réaliser ce projet, nous avons besoin :

  • Un ESP32S (ou node MCU_32S)
  • Un ESP32S 38P
  • Un panneau LED 16x16
  • Des câbles Dupont
  • Un micro INMP441

Fichiers à joindre

Code Arduino

  1  //Librairie
  2 #include <Adafruit_NeoPixel.h>
  3 #include <driver/i2s.h>
  4 
  5 //Configuration
  6 
  7 ///Leds
  8 #define W2812_PIN 27 //Broche du Din du panneau led 
  9 #define WS2812_PIXELS_NUM 256 // Nombres de leds
 10 
 11 ///Micro
 12 #define I2S_WS 25 //GPIO 25
 13 #define I2S_SD 32 //GPIO 32
 14 #define I2S_SCK 33 //GPIO 33
 15 
 16 //Matrice
 17 Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); 
 18 // Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27->PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ
 19 
 20 //Variable systèmes
 21 
 22 ///Luminosité
 23 const int luminosite = 10;
 24 
 25 ///Couleurs codées en (red, green, blue)
 26 uint32_t white = ledStrip.Color(255, 255, 255); // Blanc
 27 uint32_t green = ledStrip.Color(0, 255, 0); // Vert
 28 uint32_t red = ledStrip.Color(255, 0, 0); // Rouge
 29 uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune
 30 uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine
 31 
 32 ///Seuils son
 33 const int seuil_orange = 70; //dB -> Jaune
 34 const int seuil_rouge = 90; //dB -> Rouge
 35 const int GAIN_CALIBRATION = 20;
 36 
 37 ///Variable micro
 38 unsigned long lastAudioRead = 0;
 39 float dB_cached = 0;
 40 
 41 ///Dessins
 42 // On utilise uint16_t car il y a 16 bits (pixels) par ligne
 43 const uint16_t faceHappy[16] = {
 44   0b1111111111111111,
 45   0b1111100000011111,
 46   0b1111011111101111,
 47   0b1110111111110111,
 48   0b1101111111111011,
 49   0b1011100111001101, // Yeux
 50   0b1011100111001101, // Yeux
 51   0b1011111111111101,
 52   0b1011111111111101,
 53   0b1011011111101101, // Début sourire
 54   0b1011101111011101,
 55   0b1101110000111011,
 56   0b1110111111110111,
 57   0b1111011111101111,
 58   0b1111100000011111,
 59   0b1111111111111111
 60 };
 61 
 62 const uint16_t faceNeutral[16] = {
 63   0b1111111111111111,
 64   0b1111100000011111,
 65   0b1111011111101111,
 66   0b1110111111110111,
 67   0b1101111111111011,
 68   0b1011100111001101, // Yeux
 69   0b1011100111001101, // Yeux
 70   0b1011111111111101,
 71   0b1011111111111101,
 72   0b1011111111111101,
 73   0b1011000000001101, // Bouche droite
 74   0b1101111111111011,
 75   0b1110111111110111,
 76   0b1111011111101111,
 77   0b1111100000011111,
 78   0b1111111111111111
 79 };
 80 
 81 const uint16_t faceSad[16] = {
 82   0b1111111111111111,
 83   0b1111100000011111,
 84   0b1111011111101111,
 85   0b1110111111110111,
 86   0b1101111111111011,
 87   0b1011100111001101, // Yeux
 88   0b1011100111001101, // Yeux
 89   0b1011111111111101,
 90   0b1011111111111101,
 91   0b1011110000111101, // Bouche triste
 92   0b1011101111011101,
 93   0b1101011111101011,
 94   0b1110111111110111,
 95   0b1111011111101111,
 96   0b1111100000011111,
 97   0b1111111111111111
 98 };
 99 
100 int i;
101 
102 void setup() {
103   // put your setup code here, to run once:
104   Serial.begin(115200);
105   ledStrip.begin();
106   ledStrip.setBrightness(luminosite);
107   setupI2S();
108   Serial.println("BOOT OK");
109 }
110 
111 void loop() {
112 
113   // --- Lecture audio toutes les 100 ms ---
114   if (millis() - lastAudioRead > 100) {
115     dB_cached = readDecibels();
116     lastAudioRead = millis();
117     Serial.println(dB_cached);
118   }
119 
120   // --- Affichage ---
121   if (dB_cached >= seuil_rouge) {
122     afficherDessin(faceSad, red);
123   }
124   else if (dB_cached >= seuil_orange) {
125     afficherDessin(faceNeutral, yellow);
126   }
127   else {
128     afficherDessin(faceHappy, green);
129   }
130 
131   delay(10);   // laisse respirer FreeRTOS
132   yield();     // nourrit le watchdog
133   Serial.println("RUNNING");
134   delay(1000);
135 }
136 
137 //Fonction d'affichage en 16x16
138 void afficherDessin(const uint16_t dessin[], uint32_t couleur){
139   ledStrip.clear();
140   for (int y = 0; y<16; y++){
141     for (int x = 0; x<16; x++){
142       //On verif le bit x dans la ligne y ( en partant de la gauche)
143       if ((dessin[y]>>(15-x)) & 0x01){
144         int index;
145         // Logique serpentin pour largueur 16
146         if (y%2 ==0){
147           index = (y * 16) + x;
148         }else{
149           index = (y*16) + (15 - x);
150         }
151         ledStrip.setPixelColor(index, couleur);
152       }
153     }
154   }
155   ledStrip.show();
156 }
157 
158 //Fonction MICRO (I2S)
159 void setupI2S() {
160   const i2s_config_t i2s_config = {
161     .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
162     .sample_rate = 44100,
163     .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
164     .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
165     .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
166     .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
167     .dma_buf_count = 8,
168     .dma_buf_len = 64
169   };
170   i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
171   const i2s_pin_config_t pins = {.bck_io_num = I2S_SCK, .ws_io_num = I2S_WS, .data_out_num = -1, .data_in_num = I2S_SD};
172   i2s_set_pin(I2S_NUM_0, &pins);
173   i2s_zero_dma_buffer(I2S_NUM_0);
174   delay(10);
175 }
176 
177 float readDecibels() {
178   static int32_t samples[128];
179   size_t bytesRead = 0;
180 
181   esp_err_t result = i2s_read(
182     I2S_NUM_0,
183     samples,
184     sizeof(samples),
185     &bytesRead,
186     20 / portTICK_PERIOD_MS
187   );
188 
189   if (result != ESP_OK || bytesRead < 16) {
190     return dB_cached;  // garde l’ancienne valeur
191   }
192 
193   long long sum = 0;
194   int count = bytesRead / 4;
195 
196   for (int i = 0; i < count; i++) {
197     int32_t val = samples[i] >> 14;
198     sum += (int64_t)val * val;
199   }
200 
201   float rms = sqrt((float)sum / count);
202   if (rms <= 0) return dB_cached;
203 
204   return 20.0 * log10(rms) + GAIN_CALIBRATION;
205 }

Schéma de branchement

ENIBEL Schema.jpg

Étapes de fabrication

Ce projet est relativement simple et nécessite peu d’étapes :

Étape 1

Tout d’abord, vérifiez l’état du matériel : assurez-vous que les pins sont en bon état, qu’aucun câble n’est sectionné et qu’aucune LED n’est endommagée.

Concernant l’Arduino, il est nécessaire de connecter l’ESP32S à votre ordinateur et de disposer de l’application Arduino ainsi que des pilotes requis, notamment la bibliothèque Adafruit DMA Neopixel développée par Adafruit. Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant : https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino

Étape 2

Ouvrez l’application Arduino et copiez-y le code fourni.

Réalisez ensuite le branchement en suivant le schéma fourni.

Étape 3

Vous pouvez modifier dans le code les différents paramètres définis par défaut afin d’ajuster les niveaux de décibels auxquels les LED s’activent.

Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.

De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.

Notre histoire

Après avoir réfléchis a plusieurs idées, nous sommes partis sur un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.

Pour cela, nous étions parti sur des LEDs polarisées mais après une demande au magasin des petits débrouillards, nous avons eu un panneau LED ce qui nous arrange pour le résultat final. Nous voulons faire un smiley pour le cas d'une salle de classe.

Un problème que nous avons eu durant le premier jour est que deux personnes du groupe ne pouvait pas suivre le tuto de téléchargement pour l'ESP32S. La solution à ce problème était la lenteur de la connexion du local, il fallait une connexion assez rapide et surtout stable.

Lorsque nous avons voulu connecter la carte à notre ordinateur, la carte indiquée par le tuto n'était pas la bonne. Dans notre cas, c'était la : ESP32-WROOM-DA Module

Un problème que nous avons rencontré est le branchement du panneau LED qui ne marchait sur aucun des appareils de l'équipe et le téléversement du code sur l'ESP32S avec l'erreur.

Problème

rstx0x8 (TG1WDT_SYS_RESET)

Solution

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.

Élément de présentation

ENIBEL Presentation.jpg

Ne pas modifier sous cette ligne