<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mama</id>
		<title>Les Fabriques du Ponant - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mama"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Mama"/>
		<updated>2026-04-27T18:55:07Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36781</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36781"/>
				<updated>2026-01-20T15:28:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Élément de présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED&lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
Deuxième présentation : https://wiki.lesfabriquesduponant.net/images/1/1d/POCL_ENIBEL.pdf&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:POCL_ENIBEL.pdf&amp;diff=36780</id>
		<title>Fichier:POCL ENIBEL.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:POCL_ENIBEL.pdf&amp;diff=36780"/>
				<updated>2026-01-20T15:28:08Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36737</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36737"/>
				<updated>2026-01-20T14:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED&lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green; // A modifier pour changer la couleur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36726</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36726"/>
				<updated>2026-01-20T14:52:30Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED&lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36723</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36723"/>
				<updated>2026-01-20T14:51:33Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED&lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  //Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    //Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36712</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36712"/>
				<updated>2026-01-20T14:49:06Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED&lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  //Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    //Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36701</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36701"/>
				<updated>2026-01-20T14:47:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 75; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro -&amp;gt; Ne pas toucher&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
/// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 40;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes -&amp;gt; 30 000 ms&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000; // 1 minute -&amp;gt; 60 000 ms&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011001111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/&lt;br /&gt;
&lt;br /&gt;
/*~~~~~~~~~~Setup~~~~~~~~~~*/&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(10);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  //Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 500 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 500) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    //Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36692</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36692"/>
				<updated>2026-01-20T14:44:16Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : https://wiki.lesfabriquesduponant.net/images/b/b1/Enibel_Piece_STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36687</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36687"/>
				<updated>2026-01-20T14:43:51Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Fichier STL du support test : Fichier:Enibel Piece STL.stl&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Enibel_Piece_STL.stl&amp;diff=36686</id>
		<title>Fichier:Enibel Piece STL.stl</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Enibel_Piece_STL.stl&amp;diff=36686"/>
				<updated>2026-01-20T14:43:15Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36679</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36679"/>
				<updated>2026-01-20T14:40:54Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
'''Pour que ce dispositif fonctionne correctement, il doit être alimenté soit via l’ordinateur, soit sur secteur, mais pas sur batterie.'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36670</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36670"/>
				<updated>2026-01-20T14:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Outils et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36666</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36666"/>
				<updated>2026-01-20T14:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki, uniquement nos test dans la section ci-dessous. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36660</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36660"/>
				<updated>2026-01-20T14:33:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étape 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4 (non finie donc facultative)===&lt;br /&gt;
&lt;br /&gt;
Pour cette étape, nous n'avons pas eu le temps de la parfaire.&lt;br /&gt;
&lt;br /&gt;
Téléchargez le fichier stl fournis pour imprimer le support. Une fois l'impression finie, ajoutez&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36639</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36639"/>
				<updated>2026-01-20T14:27:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Équipe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36637</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36637"/>
				<updated>2026-01-20T14:27:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Équipe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Devant : Alexis et Maël&lt;br /&gt;
&lt;br /&gt;
Derriere : Arthur, Léïa et Mael&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36634</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36634"/>
				<updated>2026-01-20T14:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Équipe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Equipe Enibel.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Equipe_Enibel.jpg&amp;diff=36631</id>
		<title>Fichier:Equipe Enibel.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:Equipe_Enibel.jpg&amp;diff=36631"/>
				<updated>2026-01-20T14:24:50Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36607</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36607"/>
				<updated>2026-01-20T14:06:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 5 inserts&lt;br /&gt;
* 5 vis M3 &lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36605</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36605"/>
				<updated>2026-01-20T14:04:31Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
Voici le prompt que nous avons utilisé pour nous guider dans l’implémentation du code et des branchements :&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Pour ce projet, nous utilisons un microphone INMP441 associé à un NodeMCU-32S afin de mesurer la puissance sonore en décibels. Nous souhaitons également connaître les branchements à réaliser ainsi que le code à implémenter dans l’Arduino IDE pour effectuer cette tâche.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36590</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36590"/>
				<updated>2026-01-20T13:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étape 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 4===&lt;br /&gt;
&lt;br /&gt;
'''Impression 3D'''&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36588</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36588"/>
				<updated>2026-01-20T13:52:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille des LED.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36585</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36585"/>
				<updated>2026-01-20T13:49:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Équipe */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36584</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36584"/>
				<updated>2026-01-20T13:48:15Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte. Il faut également faire attention aux broches utilisées, car de nombreuses petites erreurs provenaient de mauvais branchements.&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36582</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36582"/>
				<updated>2026-01-20T13:45:23Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du micro était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte.&lt;br /&gt;
&lt;br /&gt;
X&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36580</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36580"/>
				<updated>2026-01-20T13:44:37Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
Il a réussi à téléverser le code en mettant la carte en mode téléchargement : pour ce faire, il a fallu débrancher puis rebrancher le câble reliant la carte à l’ordinateur. La fonction utilisée pour lire les informations du microphone était bloquante, ce qui arrêtait le processeur. Par conséquent, le programme Watchdog Timer — qui définit le temps maximal pendant lequel le processeur peut rester inactif — forçait automatiquement le redémarrage de la carte.&lt;br /&gt;
&lt;br /&gt;
X&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36573</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36573"/>
				<updated>2026-01-20T13:37:55Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
Documentation technique du micro : https://docs.cirkitdesigner.com/component/ad344a2a-950b-4700-8fb3-8d6f269dcf55/inmp441&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36571</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36571"/>
				<updated>2026-01-20T13:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
Bus I2S pour le micro : https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2s.html&lt;br /&gt;
&lt;br /&gt;
Bibliothèque pour gérer les LED : https://github.com/adafruit/Adafruit_NeoPixel&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36569</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36569"/>
				<updated>2026-01-20T13:34:49Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étape 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
Il est également possible de modifier la durée de la mise en veille.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36564</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36564"/>
				<updated>2026-01-20T13:33:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étape 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36559</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36559"/>
				<updated>2026-01-20T13:32:13Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Outils et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
* Une vis&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36558</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36558"/>
				<updated>2026-01-20T13:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Outils et matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
* Une plaque Labdec&lt;br /&gt;
* Une imprimante 3D&lt;br /&gt;
* 4 inserts&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36555</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36555"/>
				<updated>2026-01-20T13:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki. Nous avons néanmoins mis en place un système de mise en veille : lorsque le niveau sonore reste identique pendant une minute, le dispositif se met en veille et se réactive automatiquement dès que le son ambiant change.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36549</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36549"/>
				<updated>2026-01-20T13:26:07Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt;//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///LED&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau LED &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de LED&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Luminosité dynamique&lt;br /&gt;
uint8_t luminositeActuelle = 5;&lt;br /&gt;
const uint8_t LUMINOSITE_FORTE = 80;&lt;br /&gt;
const uint8_t LUMINOSITE_FAIBLE = 5;&lt;br /&gt;
const unsigned long TEMPS_ATTENUATION = 30000; // 30 secondes&lt;br /&gt;
const unsigned long TEMPS_EXTINCTION = 60000;&lt;br /&gt;
&lt;br /&gt;
unsigned long dernierChangementCouleur = 0;&lt;br /&gt;
uint32_t couleurActuelle = 0;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  uint32_t nouvelleCouleur;&lt;br /&gt;
  const uint16_t* nouveauDessin;&lt;br /&gt;
&lt;br /&gt;
    // --- Lecture audio toutes les 200 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 200) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
  // Choix du dessin et de la couleur&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    nouveauDessin = faceSad;&lt;br /&gt;
    nouvelleCouleur = red;&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    nouveauDessin = faceNeutral;&lt;br /&gt;
    nouvelleCouleur = yellow;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    nouveauDessin = faceHappy;&lt;br /&gt;
    nouvelleCouleur = green;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Détection de changement de couleur&lt;br /&gt;
  if (nouvelleCouleur != couleurActuelle) {&lt;br /&gt;
    couleurActuelle = nouvelleCouleur;&lt;br /&gt;
    luminositeActuelle = LUMINOSITE_FORTE;&lt;br /&gt;
    ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    dernierChangementCouleur = millis();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Atténuation après 30 secondes&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_ATTENUATION) {&lt;br /&gt;
    if (luminositeActuelle != LUMINOSITE_FAIBLE) {&lt;br /&gt;
      luminositeActuelle = LUMINOSITE_FAIBLE;&lt;br /&gt;
      ledStrip.setBrightness(luminositeActuelle);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (millis() - dernierChangementCouleur &amp;gt; TEMPS_EXTINCTION){&lt;br /&gt;
    //Eteindre Après 1 minutes&lt;br /&gt;
    ledStrip.setBrightness(0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Affichage&lt;br /&gt;
  afficherDessin(nouveauDessin, couleurActuelle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  /*if (couleur == green){&lt;br /&gt;
    ledStrip.setBrightness(5);&lt;br /&gt;
  }&lt;br /&gt;
  else if (couleur == red){&lt;br /&gt;
    ledStrip.setBrightness(200);&lt;br /&gt;
  }&lt;br /&gt;
  else{&lt;br /&gt;
    ledStrip.setBrightness(50);&lt;br /&gt;
  }*/&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36518</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36518"/>
				<updated>2026-01-20T11:25:22Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Led&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de led&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36517</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36517"/>
				<updated>2026-01-20T11:24:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
'''XXX'''&lt;br /&gt;
&lt;br /&gt;
Durant le temps restant, nous souhaitions améliorer le dispositif en ajoutant un support ainsi qu’un système de bouton permettant d’éteindre les LED. Nous avons modélisé le support, mais par manque de temps, nous n’avons pas pu l’imprimer ni tester le système de bouton. C’est pour cette raison que ces éléments n’ont pas été partagés sur ce wiki.&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36516</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36516"/>
				<updated>2026-01-20T11:20:27Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Pour créer nos schémas, nous souhaitions initialement utiliser Fritzing, mais celui-ci n’était plus utilisable gratuitement. Nous avons donc choisi d’utiliser LibreOffice Draw comme alternative.&lt;br /&gt;
&lt;br /&gt;
Les branchements représentés sur le schéma fourni ont dû être refaits à plusieurs reprises, car lors des premiers essais, un membre du groupe avait effectué un mauvais branchement sur les pins correspondantes, ce qui nous a grandement retardé.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
Chez lui, Alexis a corrigé plusieurs problèmes liés à la connexion et a développé le code :&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36500</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36500"/>
				<updated>2026-01-20T11:09:24Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Sources et documentation complémentaire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36496</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36496"/>
				<updated>2026-01-20T11:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
Après avoir réfléchi à plusieurs idées, nous avons finalement choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Au départ, nous envisagions d’utiliser des LED polarisées. Cependant, après une demande au magasin des Petits Débrouillards, nous avons obtenu un panneau LED, ce qui s’est avéré plus adapté au rendu final. Notre objectif est notamment de créer un smiley, particulièrement pertinent pour une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
Lors du premier jour, nous avons rencontré un problème : deux membres du groupe ne parvenaient pas à suivre le tutoriel de téléchargement pour l’ESP32S. La cause était la lenteur et l’instabilité de la connexion internet du local, alors qu’une connexion rapide et stable est nécessaire pour cette étape.&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, lors de la connexion de la carte à l’ordinateur, le modèle indiqué dans le tutoriel ne correspondait pas à notre matériel. Dans notre cas, il s’agissait de la ESP32-WROOM-DA Module.&lt;br /&gt;
&lt;br /&gt;
Enfin, nous avons rencontré des difficultés avec le branchement du panneau LED, qui ne fonctionnait sur aucun des appareils de l’équipe, ainsi qu’avec le téléversement du code sur l’ESP32S, qui générait une erreur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36493</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36493"/>
				<updated>2026-01-20T11:03:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36492</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36492"/>
				<updated>2026-01-20T11:03:41Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;ESP32-WROOM-DA Module&amp;quot;&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36489</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36489"/>
				<updated>2026-01-20T10:57:44Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Notre histoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36479</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36479"/>
				<updated>2026-01-20T10:46:18Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36477</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36477"/>
				<updated>2026-01-20T10:41:48Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Élément de présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Presentation.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:ENIBEL_Presentation.jpg&amp;diff=36476</id>
		<title>Fichier:ENIBEL Presentation.jpg</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:ENIBEL_Presentation.jpg&amp;diff=36476"/>
				<updated>2026-01-20T10:41:29Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36473</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36473"/>
				<updated>2026-01-20T10:38:58Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l’application Arduino et copiez-y le code fourni.&lt;br /&gt;
&lt;br /&gt;
Réalisez ensuite le branchement en suivant le schéma fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Il est également possible d’adapter le programme à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De la même manière, l’affichage ainsi que les couleurs déclenchées peuvent être personnalisés selon vos besoins.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36471</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36471"/>
				<updated>2026-01-20T10:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Étapes de fabrication */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est relativement simple et nécessite peu d’étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Pour plus de détails sur l’installation et la configuration, vous pouvez vous référer au lien suivant :&lt;br /&gt;
https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l'application Arduino et copiez le code fourni.&lt;br /&gt;
&lt;br /&gt;
Faites le branchement également fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez modifiez dans le code les différents paramètres mis en valeur par défaut pour changer les niveaux de décibels où les LEDs s'activent.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également changer pour adapter à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De même pour l'affichage ainsi que les couleurs qui s'activeront.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36469</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36469"/>
				<updated>2026-01-20T10:35:39Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est assez simple et nécessite peu d'étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, vérifiez le matériel : que les pins soient en bon état, qu'il n'y ait pas de câble sectionné, pas de LED cassé…&lt;br /&gt;
&lt;br /&gt;
Pour l'Arduino, il faut connecter l'ESP32S à votre ordinateur et également avoir l'application Arduino et leurs pilotes (Adafruit DMA neopixel library par Adafruit). Pour plus de détails, référez vous vers ce lien : https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l'application Arduino et copiez le code fourni.&lt;br /&gt;
&lt;br /&gt;
Faites le branchement également fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez modifiez dans le code les différents paramètres mis en valeur par défaut pour changer les niveaux de décibels où les LEDs s'activent.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également changer pour adapter à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De même pour l'affichage ainsi que les couleurs qui s'activeront.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36468</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36468"/>
				<updated>2026-01-20T10:35:06Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Fichiers à joindre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; //Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est assez simple et nécessite peu d'étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, vérifiez le matériel : que les pins soient en bon état, qu'il n'y ait pas de câble sectionné, pas de LED cassé…&lt;br /&gt;
&lt;br /&gt;
Pour l'Arduino, il faut connecter l'ESP32S à votre ordinateur et également avoir l'application Arduino et leurs pilotes (Adafruit DMA neopixel library par Adafruit). Pour plus de détails, référez vous vers ce lien : https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l'application Arduino et copiez le code fourni.&lt;br /&gt;
&lt;br /&gt;
Faites le branchement également fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez modifiez dans le code les différents paramètres mis en valeur par défaut pour changer les niveaux de décibels où les LEDs s'activent.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également changer pour adapter à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De même pour l'affichage ainsi que les couleurs qui s'activeront.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36467</id>
		<title>ENIB 2026 : Enibel</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2026_:_Enibel&amp;diff=36467"/>
				<updated>2026-01-20T10:35:00Z</updated>
		
		<summary type="html">&lt;p&gt;Mama : /* Code Arduino */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de notre intersemestre, nous participons au hackathon « Hack the POCL », organisé par ''Les Petits Débrouillards'' et ''Les Fabriques du Ponant''.&lt;br /&gt;
&lt;br /&gt;
L’objectif de ce hackathon est de rendre des données tangibles en inventant un POCL : ''un Petit Objet Connecté Ludique''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de concevoir un décibelmètre capable d’allumer différentes LED en fonction du niveau sonore capté par un micro.&lt;br /&gt;
&lt;br /&gt;
Ce dispositif peut avoir plusieurs usages, le plus évident étant une utilisation en salle de classe.&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
* Vert : le niveau sonore est faible&lt;br /&gt;
* Jaune : le niveau sonore est assez élevé&lt;br /&gt;
* Rouge : le niveau sonore est très élevé&lt;br /&gt;
&lt;br /&gt;
==Équipe==&lt;br /&gt;
&lt;br /&gt;
Voici notre équipe :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Enib.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
À gauche : Léïa et Maël&lt;br /&gt;
&lt;br /&gt;
À droite : Arthur et Alexis&lt;br /&gt;
&lt;br /&gt;
Ainsi que Mael, non présent lors de la photo&lt;br /&gt;
&lt;br /&gt;
Nous sommes tous les cinq des étudiant·e·s de 3e année de l'ENIB&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Logo-enib.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Outils et matériel==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous avons besoin : &lt;br /&gt;
&lt;br /&gt;
* Un ESP32S (ou node MCU_32S)&lt;br /&gt;
* Un ESP32S 38P&lt;br /&gt;
* Un panneau LED 16x16&lt;br /&gt;
* Des câbles Dupont&lt;br /&gt;
* Un micro INMP441&lt;br /&gt;
&lt;br /&gt;
==Fichiers à joindre==&lt;br /&gt;
&lt;br /&gt;
===Code Arduino===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Arduino&amp;quot; line&amp;gt; &lt;br /&gt;
//Librairie&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;driver/i2s.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Configuration&lt;br /&gt;
///Leds&lt;br /&gt;
#define W2812_PIN 27 //Broche du Din du panneau led &lt;br /&gt;
#define WS2812_PIXELS_NUM 256 // Nombres de leds&lt;br /&gt;
///Micro&lt;br /&gt;
#define I2S_WS 25 //GPIO 25&lt;br /&gt;
#define I2S_SD 32 //GPIO 32&lt;br /&gt;
#define I2S_SCK 33 //GPIO 33&lt;br /&gt;
&lt;br /&gt;
//Matrice&lt;br /&gt;
Adafruit_NeoPixel ledStrip(WS2812_PIXELS_NUM, W2812_PIN, NEO_GRB + NEO_KHZ800); &lt;br /&gt;
// Crée l'instance ledStrip avec 256 LED/pixels sur la sortie GPIO27-&amp;gt;PIN27 du microcontrôleur. La communication se fera en GRB (Green, Red, Blue) à 800kHZ&lt;br /&gt;
&lt;br /&gt;
//Variable systèmes&lt;br /&gt;
///Luminosité&lt;br /&gt;
const int luminosite = 10;&lt;br /&gt;
///Couleurs codées en (red, green, blue)&lt;br /&gt;
uint32_t white = ledStrip.Color(255, 255, 255); // Blanc&lt;br /&gt;
uint32_t green = ledStrip.Color(0, 255, 0); // Vert&lt;br /&gt;
uint32_t red = ledStrip.Color(255, 0, 0); // Rouge&lt;br /&gt;
uint32_t yellow = ledStrip.Color(255, 255, 0); // Jaune&lt;br /&gt;
uint32_t marine_blue = ledStrip.Color(46, 62, 115); // Bleu marine&lt;br /&gt;
///Seuils son&lt;br /&gt;
const int seuil_orange = 70; //dB -&amp;gt; Jaune&lt;br /&gt;
const int seuil_rouge = 90; //dB -&amp;gt; Rouge&lt;br /&gt;
const int GAIN_CALIBRATION = 20;&lt;br /&gt;
///Variable micro&lt;br /&gt;
unsigned long lastAudioRead = 0;&lt;br /&gt;
float dB_cached = 0;&lt;br /&gt;
///Dessins&lt;br /&gt;
// On utilise uint16_t car il y a 16 bits (pixels) par ligne&lt;br /&gt;
const uint16_t faceHappy[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011011111101101, // Début sourire&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101110000111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceNeutral[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011000000001101, // Bouche droite&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
const uint16_t faceSad[16] = {&lt;br /&gt;
  0b1111111111111111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1101111111111011,&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011100111001101, // Yeux&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011111111111101,&lt;br /&gt;
  0b1011110000111101, // Bouche triste&lt;br /&gt;
  0b1011101111011101,&lt;br /&gt;
  0b1101011111101011,&lt;br /&gt;
  0b1110111111110111,&lt;br /&gt;
  0b1111011111101111,&lt;br /&gt;
  0b1111100000011111,&lt;br /&gt;
  0b1111111111111111&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  ledStrip.begin();&lt;br /&gt;
  ledStrip.setBrightness(luminosite);&lt;br /&gt;
  setupI2S();&lt;br /&gt;
  Serial.println(&amp;quot;BOOT OK&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // --- Lecture audio toutes les 100 ms ---&lt;br /&gt;
  if (millis() - lastAudioRead &amp;gt; 100) {&lt;br /&gt;
    dB_cached = readDecibels();&lt;br /&gt;
    lastAudioRead = millis();&lt;br /&gt;
    Serial.println(dB_cached);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // --- Affichage ---&lt;br /&gt;
  if (dB_cached &amp;gt;= seuil_rouge) {&lt;br /&gt;
    afficherDessin(faceSad, red);&lt;br /&gt;
  }&lt;br /&gt;
  else if (dB_cached &amp;gt;= seuil_orange) {&lt;br /&gt;
    afficherDessin(faceNeutral, yellow);&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    afficherDessin(faceHappy, green);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  delay(10);   // laisse respirer FreeRTOS&lt;br /&gt;
  yield();     // nourrit le watchdog&lt;br /&gt;
  Serial.println(&amp;quot;RUNNING&amp;quot;);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction d'affichage en 16x16&lt;br /&gt;
void afficherDessin(const uint16_t dessin[], uint32_t couleur){&lt;br /&gt;
  ledStrip.clear();&lt;br /&gt;
  for (int y = 0; y&amp;lt;16; y++){&lt;br /&gt;
    for (int x = 0; x&amp;lt;16; x++){&lt;br /&gt;
      //On verif le bit x dans la ligne y ( en partant de la gauche)&lt;br /&gt;
      if ((dessin[y]&amp;gt;&amp;gt;(15-x)) &amp;amp; 0x01){&lt;br /&gt;
        int index;&lt;br /&gt;
        // Logique serpentin pour largueur 16&lt;br /&gt;
        if (y%2 ==0){&lt;br /&gt;
          index = (y * 16) + x;&lt;br /&gt;
        }else{&lt;br /&gt;
          index = (y*16) + (15 - x);&lt;br /&gt;
        }&lt;br /&gt;
        ledStrip.setPixelColor(index, couleur);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Fonction MICRO (I2S)&lt;br /&gt;
void setupI2S() {&lt;br /&gt;
  const i2s_config_t i2s_config = {&lt;br /&gt;
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),&lt;br /&gt;
    .sample_rate = 44100,&lt;br /&gt;
    .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,&lt;br /&gt;
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,&lt;br /&gt;
    .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),&lt;br /&gt;
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,&lt;br /&gt;
    .dma_buf_count = 8,&lt;br /&gt;
    .dma_buf_len = 64&lt;br /&gt;
  };&lt;br /&gt;
  i2s_driver_install(I2S_NUM_0, &amp;amp;i2s_config, 0, NULL);&lt;br /&gt;
  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};&lt;br /&gt;
  i2s_set_pin(I2S_NUM_0, &amp;amp;pins);&lt;br /&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;br /&gt;
  delay(10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float readDecibels() {&lt;br /&gt;
  static int32_t samples[128];&lt;br /&gt;
  size_t bytesRead = 0;&lt;br /&gt;
&lt;br /&gt;
  esp_err_t result = i2s_read(&lt;br /&gt;
    I2S_NUM_0,&lt;br /&gt;
    samples,&lt;br /&gt;
    sizeof(samples),&lt;br /&gt;
    &amp;amp;bytesRead,&lt;br /&gt;
    20 / portTICK_PERIOD_MS&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  if (result != ESP_OK || bytesRead &amp;lt; 16) {&lt;br /&gt;
    return dB_cached;  // garde l’ancienne valeur&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  long long sum = 0;&lt;br /&gt;
  int count = bytesRead / 4;&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; count; i++) {&lt;br /&gt;
    int32_t val = samples[i] &amp;gt;&amp;gt; 14;&lt;br /&gt;
    sum += (int64_t)val * val;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float rms = sqrt((float)sum / count);&lt;br /&gt;
  if (rms &amp;lt;= 0) return dB_cached;&lt;br /&gt;
&lt;br /&gt;
  return 20.0 * log10(rms) + GAIN_CALIBRATION;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Schéma de branchement===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL Schema.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Étapes de fabrication==&lt;br /&gt;
&lt;br /&gt;
Ce projet est assez simple et nécessite peu d'étapes :&lt;br /&gt;
&lt;br /&gt;
===Étape 1===&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, vérifiez le matériel : que les pins soient en bon état, qu'il n'y ait pas de câble sectionné, pas de LED cassé…&lt;br /&gt;
&lt;br /&gt;
Pour l'Arduino, il faut connecter l'ESP32S à votre ordinateur et également avoir l'application Arduino et leurs pilotes (Adafruit DMA neopixel library par Adafruit). Pour plus de détails, référez vous vers ce lien : https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino&lt;br /&gt;
&lt;br /&gt;
===Étape 2===&lt;br /&gt;
&lt;br /&gt;
Ouvrez l'application Arduino et copiez le code fourni.&lt;br /&gt;
&lt;br /&gt;
Faites le branchement également fourni.&lt;br /&gt;
&lt;br /&gt;
===Étape 3===&lt;br /&gt;
&lt;br /&gt;
Vous pouvez modifiez dans le code les différents paramètres mis en valeur par défaut pour changer les niveaux de décibels où les LEDs s'activent.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez également changer pour adapter à un panneau LED plus petit ou plus grand.&lt;br /&gt;
&lt;br /&gt;
De même pour l'affichage ainsi que les couleurs qui s'activeront.&lt;br /&gt;
&lt;br /&gt;
==Notre histoire==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problème&lt;br /&gt;
&lt;br /&gt;
rstx0x8 (TG1WDT_SYS_RESET)&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
&lt;br /&gt;
==Sources et documentation complémentaire==&lt;br /&gt;
&lt;br /&gt;
* Rédаctiоn et illustratiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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é. &lt;br /&gt;
&lt;br /&gt;
* Prоgrammаtiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
* Transpаrence et dосumеntatiоn : &amp;lt;br&amp;gt;&lt;br /&gt;
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е.&lt;br /&gt;
&lt;br /&gt;
* Traçabilité : &amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Élément de présentation==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ENIBEL.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
==Ne pas modifier sous cette ligne==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2026]]&lt;/div&gt;</summary>
		<author><name>Mama</name></author>	</entry>

	</feed>