A connected wall panel for sound awareness, precision timing, and calm workspaces.
Built on ESP32-S3 with a 7" touchscreen for real-time dB monitoring, a large NTP clock, web administration, MQTT, OTA, and Home Assistant integration.
Animated preview of the on-device dashboards: principal view, clock, LIVE mode, sound meter, PIN screen, calibration, and settings.
Measured in real environments: lab, studio, and day-to-day workspace.
FR : Photos · Web UI · Démarrage · Dashboard · Notifications · Home Assistant · Calibration
EN : Visual Tour · Web UI · Quick Start · Dashboard · Alerting · Home Assistant · Calibration
- Vision
- Aperçu visuel
- Points forts
- Cas d'usage
- Fonctionnalités
- Matériel cible
- Achat de l'ESP
- Démarrage rapide
- Configuration par défaut
- Interface web
- Affichage du dashboard
- Sécurité web et PIN
- Wi-Fi multi-AP
- Gestion de configuration
- Horloge NTP
- MQTT
- Notifications sortantes
- Home Assistant
- OTA
- Calibration
- Architecture
- Arborescence
- État du projet
- Contribution
SoundPanel 7 est un panneau mural connecté qui rend plusieurs informations visibles en un coup d'œil :
- le niveau sonore ambiant
- l'heure réseau synchronisée à la seconde
- l'état local du panneau, du Wi-Fi et des services
L'idée de départ était simple : créer un outil de pédagogie douce pour rendre le bruit visible sans agressivité.
Le projet a ensuite évolué vers un panneau autonome, lisible de loin, utile en open space, en studio, en régie, en podcast, en atelier ou sur un plateau.
SoundPanel 7 n'est donc pas seulement un sonomètre. C'est un panneau local de supervision pour le son, le temps, le réseau et les intégrations connectées.
Avant les détails techniques, voici le projet dans ses contextes réels : en labo, en studio, et en usage quotidien.
- Grand affichage tactile 7" pour le bruit, l'heure et l'état du panneau
- Mesure sonore en temps réel avec dB instantané, Leq et Peak
- Grande horloge NTP avec secondes visibles, utile en studio comme en diffusion
- Double interface : écran local LVGL + interface web sécurisée
- Intégrations connectées : MQTT, MQTT Discovery, Home Assistant, OTA
- Réglages persistants avec export, import, backup et restore
- Open space trop bruyant : rendre le niveau sonore visible sans agressivité
- Studio d'enregistrement : garder les niveaux et l'heure sous les yeux
- Régie ou diffusion : afficher une heure réseau fiable avec secondes
- Podcast ou voix off : suivre un top horaire ou un timing de prise
- Soirée à la maison : garder un œil sur le volume quand les fêtards aiment le monter un peu trop fort
- Atelier ou lieu public : afficher un indicateur simple, compréhensible par tous dans le genre des panneaux LIVE devant les studios d'enregistrement
- Domotique personnelle : remonter les niveaux sonores pour traitement / exécution d'actions
- mesure continue du niveau sonore
- choix de la source audio :
Demo,Analog Mic,PDM MEMS,INMP441 - calcul du Leq
- calcul du Peak
- seuils visuels configurables
- historique glissant configurable
- mode de réponse Fast ou Slow
- maintien du peak configurable
- calibration micro en 3 ou 5 points
- durée de capture de calibration configurable
- horloge grand format affichée en permanence
- affichage des secondes pour les usages de diffusion, prise et synchro
- synchronisation automatique via NTP
- configuration du serveur NTP, de la timezone et de l'intervalle de synchro
- statut de synchronisation visible dans l'UI et dans l'API
- pilotage tactile sur écran 7"
- lecture immédiate des niveaux et de l'heure
- consultation d'informations système
- extinction de l'écran et shutdown depuis l'interface
- protection par PIN local des pages sensibles (Calibration et Paramètres)
- usage autonome sans navigateur
- supervision temps réel et administration
- configuration UI, audio, Wi-Fi, NTP, OTA, MQTT et réseau
- calibration depuis le navigateur et pilotage du mode LIVE
- vérification et installation des releases firmware GitHub directement depuis l'interface web
- authentification web avec bootstrap du premier compte, gestion d'utilisateurs et sessions
- notifications sortantes via webhooks / API : Slack incoming webhook, Telegram Bot API, WhatsApp Cloud API, avec envoi de test
- flux live SSE sur le port
81 - export / import / backup / restore de configuration
- reset partiel par section :
ui,time,audio,calibration,ota,mqtt - actions système : reboot, shutdown, reset usine
- Wi-Fi via portail de configuration
- mDNS / Zeroconf :
_soundpanel7._tcp.local. - MQTT
- MQTT Discovery pour Home Assistant
- contrôle du mode LIVE via Web UI, API et MQTT
- intégration Home Assistant native via Zeroconf/mDNS
- OTA via
espota
- uptime
- température MCU
- version firmware
- environnement de build
- état OTA / MQTT
- charge LVGL, timings UI, heap interne / PSRAM
- nombre d'objets LVGL
- timestamp du dernier backup
- Waveshare ESP32-S3-Touch-LCD-7
- Waveshare ESP32-S3-Touch-LCD-7B
- écran tactile 7"
- ESP32-S3
- Wi-Fi
- Bluetooth
- rétroéclairage pilotable (On/Off)
- ...
Pour la documentation constructeur de la carte, voir aussi :
La carte ESP32-S3-Touch-LCD-7B utilise une géométrie d'affichage différente de la 7 (1024x600 au lieu de 800x480), donc elle nécessite des environnements PlatformIO dédiés (soundpanel7b_usb, soundpanel7b_ota) pour éviter les problèmes d'affichage.
Le firmware gère maintenant trois profils matériels distincts via PlatformIO :
soundpanel7_usb/soundpanel7_ota: profil Waveshare 7" avec écran tactile, UI locale LVGL, PIN local, contrôle d'affichage et admin web complètesoundpanel7b_usb/soundpanel7b_ota: profil Waveshare 7B 1024x600 avec écran tactile, UI locale LVGL, PIN local, contrôle d'affichage et admin web complètesoundpanel7_headless_usb/soundpanel7_headless_ota: profil ESP32-S3 standard sans écran, pour un sonomètre web only
En mode headless :
- il n'y a pas d'interface tactile locale
- les réglages liés à l'écran, au tactile et au PIN local disparaissent de l'admin web
- le mode TARDIS peut piloter la LED RGB intégrée de certaines cartes ESP32-S3 standard pour simuler l'éclairage de cabine
- le reste reste identique : mesure audio, interface web, Wi-Fi, NTP, MQTT, OTA, Home Assistant, export/import de config
Exemple de build headless : sonomètre web-only intégré dans une maquette TARDIS.
J'ai publié un article complet sur ce matériel, avec mon retour d'expérience, des photos et une note sur le blog :
Cet article contient aussi le lien d'affiliation utilisé pour l'achat de l'ESP32-S3 Touch LCD présenté dans ce projet.
Le firmware permet maintenant de choisir la source audio directement dans l'admin web :
Demo: valeurs simulées pour le développement et les démosAnalog Mic: micro analogique typeMAX4466PDM MEMS: micro numérique PDMINMP441: micro numérique I2S
Exemples compatibles :
MAX4466ou équivalent analogique à gain fixe- micro PDM MEMS 3.3 V
INMP441
Modèle à ne surtout pas utiliser :
MAX9814: son gain automatique fausse la mesure pour ce projet
Important :
- les pins audio ne se règlent pas dans l'interface web
- le mapping des GPIO est sélectionné automatiquement selon l'environnement
PlatformIO - profil
Waveshare= pins Waveshare - profil
headless= pins ESP32-S3 standard
Les tableaux ci-dessous documentent le câblage par défaut utilisé par le firmware actuel.
| Type de micro | Signal module | GPIO firmware | Marquage visible sur la carte |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO6 |
Sensor AD |
| PDM MEMS | CLK |
GPIO12 |
SCK |
| PDM MEMS | DATA |
GPIO13 |
MISO |
| INMP441 | SCK / BCLK |
GPIO12 |
SCK |
| INMP441 | WS / LRCL |
GPIO11 |
MOSI |
| INMP441 | SD |
GPIO13 |
MISO |
Notes utiles :
- sur la Waveshare,
GPIO11,GPIO12etGPIO13correspondent aussi au busTFexposé commeMOSI,SCK,MISO - si tu branches un micro numérique sur ces pins, évite d'utiliser la carte TF en même temps
- pour
INMP441, relierL/RàGNDpour lire le canal gauche
Le profil soundpanel7b_* réutilise le même câblage audio par défaut que la Waveshare ESP32-S3-Touch-LCD-7.
| Type de micro | Signal module | GPIO firmware | Marquage visible sur la carte |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO6 |
Sensor AD |
| PDM MEMS | CLK |
GPIO12 |
SCK |
| PDM MEMS | DATA |
GPIO13 |
MISO |
| INMP441 | SCK / BCLK |
GPIO12 |
SCK |
| INMP441 | WS / LRCL |
GPIO11 |
MOSI |
| INMP441 | SD |
GPIO13 |
MISO |
Le profil headless cible un ESP32-S3 DevKitC-1 ou équivalent, sans écran.
| Type de micro | Signal module | GPIO firmware | Sérigraphie habituelle sur la carte |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO4 |
4 / IO4 |
| PDM MEMS | CLK |
GPIO12 |
12 / IO12 |
| PDM MEMS | DATA |
GPIO13 |
13 / IO13 |
| INMP441 | SCK / BCLK |
GPIO12 |
12 / IO12 |
| INMP441 | WS / LRCL |
GPIO11 |
11 / IO11 |
| INMP441 | SD |
GPIO13 |
13 / IO13 |
Notes utiles :
- sur un
ESP32-S3standard, ces libellés sont généralement sérigraphiés directement commeIO4,IO11,IO12,IO13ou simplement4,11,12,13 - pour
INMP441, relierL/RàGNDpour rester sur le canal gauche - toutes les masses doivent être communes entre le micro et la carte
- certaines cartes
ESP32-S3 N16R8intègrent aussi une LED RGB adressable sur le PCB, exploitable par le mode TARDIS
Par défaut, le projet compile avec un mode audio mock pour faciliter le développement.
Dans platformio.ini, le flag suivant est actif par défaut :
-DSOUNDPANEL7_MOCK_AUDIO=1Si tu branches une vraie entrée analogique, vérifie ce point avant d'évaluer le comportement du panneau.
git clone https://github.com/jjtronics/SoundPanel7.git
cd SoundPanel7Le plus simple :
- VS Code
- extension PlatformIO
Tu peux aussi utiliser pio en ligne de commande si PlatformIO Core est déjà installé.
pio runBuild explicite par profil :
pio run -e soundpanel7_usb
pio run -e soundpanel7b_usb
pio run -e soundpanel7_headless_usbL'environnement par défaut reste soundpanel7_usb. Pour une Waveshare ESP32-S3-Touch-LCD-7B, sélectionne explicitement soundpanel7b_usb.
L'environnement par défaut est soundpanel7_usb.
pio run -e soundpanel7_usb -t uploadPour une Waveshare ESP32-S3-Touch-LCD-7B :
pio run -e soundpanel7b_usb -t uploadPour un ESP32-S3 standard sans écran :
pio run -e soundpanel7_headless_usb -t uploadpio device monitor -b 115200Quand l'OTA est configurée sur l'appareil :
pio run -e soundpanel7_ota -t uploadVersion 7B :
pio run -e soundpanel7b_ota -t uploadVersion headless :
pio run -e soundpanel7_headless_ota -t uploadLes réglages locaux de machine et de réseau ne doivent pas être commités dans platformio.ini.
Utilise plutôt un fichier local platformio.override.ini ignoré par Git, par exemple à partir de platformio.override.example.ini.
Exemple :
[env:soundpanel7_usb]
upload_port = /dev/cu.usbmodemXXXX
monitor_port = /dev/cu.usbmodemXXXX
[env:soundpanel7_ota]
upload_port = 192.168.1.137Alternative ponctuelle :
pio run -e soundpanel7_ota -t upload --upload-port 192.168.1.137Vérifie aussi que le poste qui lance espota est sur le même réseau Wi-Fi que l'appareil.
Les valeurs locales typiques à surcharger sont :
upload_port(son IP)monitor_port- le mot de passe OTA si utilisé
Au boot, le firmware initialise successivement :
- le stockage des réglages
- l'affichage et le tactile, si le build inclut un écran
- le réseau
- l'OTA
- le MQTT
- l'interface web
- le moteur audio
Valeurs actuelles du firmware :
- hostname :
soundpanel7 - serveur NTP :
fr.pool.ntp.org - timezone POSIX :
CET-1CEST,M3.5.0/2,M10.5.0/3 - intervalle NTP :
180 min - OTA activée :
oui - port OTA :
3232 - MQTT activé :
non - topic MQTT de base :
soundpanel7 - sources audio disponibles :
Demo,Analog Mic,PDM MEMS,INMP441 - pin analogique par défaut profil Waveshare :
GPIO6 - pin analogique par défaut profil headless :
GPIO4 - pins numériques par défaut :
GPIO11,GPIO12,GPIO13 - source audio par défaut :
Analog Mic - fenêtre RMS analogique :
256 samples - réponse audio par défaut :
Fast - peak hold :
5000 ms - calibration par défaut :
3 points, capture3 s
Ces réglages sont définis dans src/SettingsStore.h.
Une fois l'appareil connecté au Wi-Fi :
http://IP_DU_SOUNDPANEL/http://soundpanel7.local/si le mDNS est disponible- flux live :
http://IP_DU_SOUNDPANEL:81/api/events
L'interface permet notamment de régler :
- luminosité
- seuils de couleur
- source micro :
Demo,Analog Mic,PDM MEMS,INMP441 - durée d'historique
- mode de réponse audio
- durée des alertes orange / rouge
- mode LIVE et page d'ouverture par défaut
- contrôle de l'affichage du dashboard local : page affichée, tactile actif/inactif, mode plein écran sans menu du haut
- paramètres Wi-Fi
- NTP, timezone, intervalle de synchro et hostname
- paramètres OTA
- paramètres MQTT
- notifications sortantes : Slack incoming webhook, Telegram Bot API, WhatsApp Cloud API
- calibration micro
- PIN local d'accès
- comptes utilisateurs web
- backup / restore / import / export des réglages
En build headless, les blocs liés à l'écran local, au tactile et au code PIN sont masqués automatiquement.
En build headless, un bloc Mode TARDIS permet aussi de piloter l'éclairage cabine :
Alerte sonore: la LED intérieure suit l'état du sonomètreCouleur fixe: choix manuel via palette de couleurDécollage TARDIS: animation bleue non bloquante inspirée de la lueur de la TARDIS
Sur les cartes compatibles, la LED RGB intégrée est utilisée pour l'intérieur, tandis que la LED extérieure reste pilotée par la sortie GPIO dédiée.
Le mode TARDIS peut réutiliser la LED RGB intégrée pour animer l'éclairage cabine en bleu.
Animation complète des réglages :
Endpoints principaux exposés par le firmware :
GET /api/auth/status
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/bootstrap
GET /api/users
POST /api/users/create
POST /api/users/password
POST /api/users/delete
GET /api/homeassistant
POST /api/homeassistant
GET /api/ha/status
GET /api/status
POST /api/pin
POST /api/ui
GET /api/live
POST /api/live
GET /api/wifi
POST /api/wifi
GET /api/time
POST /api/time
GET /api/config/export
POST /api/config/import
POST /api/config/backup
POST /api/config/restore
POST /api/config/reset_partial
GET /api/ota
POST /api/ota
GET /api/release
POST /api/release/check
POST /api/release/install
GET /api/mqtt
POST /api/mqtt
GET /api/notifications
POST /api/notifications
POST /api/notifications/test
POST /api/calibrate
POST /api/calibrate/clear
POST /api/calibrate/mode
POST /api/reboot
POST /api/shutdown
POST /api/factory_reset
Le GET /api/status renvoie notamment :
- dB, Leq, Peak
- historique glissant
- uptime
- statut Wi-Fi, IP et RSSI
- état NTP / heure courante
- température MCU
- version firmware et environnement de build
- état OTA / MQTT
- état LIVE, PIN et calibration
- stats runtime LVGL / heap
L'interface web permet aussi de piloter finement l'affichage du panneau tactile 7" :
- choisir la vue affichée : principal, horloge, LIVE ou sonomètre
- activer ou désactiver complètement le tactile
- activer un mode plein écran par vue pour masquer la barre du haut sur l'écran local
- appliquer ces changements immédiatement sans reflasher le firmware
Ces réglages sont sauvegardés via l'API UI du firmware et restent actifs après redémarrage.
Sur un build headless, cette section n'est pas applicable : il n'y a pas d'écran local à piloter.
Le projet combine deux niveaux de protection :
- authentification web avec création du premier compte au bootstrap
- gestion de comptes locaux avec changement de mot de passe et suppression d'utilisateur
- sessions web pour l'administration et l'accès au flux live
- code PIN local pour protéger les pages sensibles sur le panneau tactile
Le code PIN local n'existe que sur les builds avec écran.
Endpoints associés :
GET /api/auth/status
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/bootstrap
GET /api/users
POST /api/users/create
POST /api/users/password
POST /api/users/delete
POST /api/pin
Le panneau peut mémoriser jusqu'à 4 réseaux Wi-Fi pour s'adapter à plusieurs lieux d'usage :
- maison, bureau, studio, partage de connexion, etc.
- conservation du mot de passe déjà stocké si le champ reste vide
- prise en charge des réseaux ouverts si aucun mot de passe n'est renseigné
- état de connexion visible dans l'interface web
Endpoints associés :
GET /api/wifi
POST /api/wifi
Le firmware intègre une vraie gestion des réglages pour éviter de tout refaire à la main :
- export JSON complet de la configuration
- import de configuration depuis l'interface web
- backup local du dernier état connu
- restore du backup en un clic
- reset partiel par section :
ui,time,audio,calibration,ota,mqtt - horodatage du dernier backup visible dans le statut
Endpoints associés :
GET /api/config/export
POST /api/config/import
POST /api/config/backup
POST /api/config/restore
POST /api/config/reset_partial
SoundPanel 7 fait aussi office de grande horloge réseau. Dans un studio, une régie ou un setup podcast, avoir une heure fiable avec les secondes en grand est souvent aussi utile que la mesure sonore.
Le firmware gère :
- la synchronisation NTP automatique
- le paramétrage du serveur NTP
- la timezone POSIX
- l'intervalle de resynchronisation
- l'affichage local
HH:MMavec badge secondes - l'heure complète côté interface web
Par défaut, le serveur NTP configuré est fr.pool.ntp.org.
Le panneau peut publier ses mesures vers un broker MQTT.
Paramètres disponibles :
- host
- port
- username / password
- client ID
- topic racine
- intervalle de publication
- retain
Topics effectivement publiés :
soundpanel7/availability
soundpanel7/state
soundpanel7/db
soundpanel7/leq
soundpanel7/peak
soundpanel7/live/state
soundpanel7/live/set
soundpanel7/wifi/rssi
soundpanel7/wifi/ip
Avec MQTT Discovery, le firmware publie automatiquement les entités Home Assistant suivantes :
dB InstantLeqPeakLIVEWiFi RSSIWiFi IP
Le panneau peut envoyer des alertes vers des services externes lorsqu'un seuil est dépassé ou lors du retour à la normale.
Canaux pris en charge :
- Slack via incoming webhook
- Telegram via Bot API
- WhatsApp via Cloud API
Fonctionnalités disponibles :
- notification des alertes
warninget/oucritique - notification optionnelle du retour à la normale
- résumé des cibles actives
- mémorisation du dernier résultat et du dernier succès
- envoi de test depuis l'interface web
Endpoints associés :
GET /api/notifications
POST /api/notifications
POST /api/notifications/test
Deux approches sont proposées :
La plus simple si Home Assistant utilise déjà MQTT : tu actives MQTT sur le SoundPanel 7, tu renseignes le broker, et les entités sont créées automatiquement.
Une intégration custom est fournie dans :
Le firmware annonce le service :
_soundpanel7._tcp.local.
L'intégration interroge l'endpoint dédié /api/ha/status avec un bearer token Home Assistant.
Capteurs exposés par l'intégration native :
dB InstantLeqPeakWiFi RSSIWiFi IPUptime
Le dépôt peut maintenant être ajouté dans HACS comme custom repository.
Pré-requis :
- une release GitHub publiée (ex.
v0.1.0) - HACS installé dans Home Assistant
Étapes :
- ouvrir
HACS > Integrations - ouvrir le menu en haut à droite puis
Custom repositories - ajouter
https://github.com/jjtronics/SoundPanel7 - choisir la catégorie
Integration - rechercher
SoundPanel 7dans HACS puis l'installer - redémarrer Home Assistant
- redémarrer le SoundPanel 7
- ouvrir
Paramètres > Appareils et services - attendre la découverte automatique
Copier custom_components/soundpanel7 dans le dossier de configuration Home Assistant :
config/custom_components/soundpanel7
Exemple :
mkdir -p /config/custom_components
cp -R custom_components/soundpanel7 /config/custom_components/Puis :
- dans l'interface web du panneau, ouvrir
Paramètres > Home Assistant - générer ou définir un token dédié
- redémarrer Home Assistant
- redémarrer le SoundPanel 7
- ouvrir
Paramètres > Appareils et services - attendre la découverte automatique
Le flow de configuration demandera ce token.
Si rien n'apparaît, vérifier en priorité :
- que le token Home Assistant est bien configuré côté panneau
- que Home Assistant et le panneau sont sur le même réseau
- que
manifest.jsonest bien présent côté Home Assistant - que le panneau répond bien sur son interface web
- que le mDNS n'est pas perturbé par le réseau ou les VLANs
Le projet gère maintenant deux modes OTA complémentaires :
- OTA réseau classique depuis PlatformIO /
espota - OTA GitHub intégrée directement depuis l'interface web de la tablette
Une fois l'OTA classique configurée sur l'appareil, la mise à jour se fait avec :
pio run -e soundpanel7_ota -t uploadDans platformio.ini, l'environnement OTA repose sur :
upload_protocol = espota- port par défaut
3232 - mot de passe OTA configurable
Pour éviter de commit des IP ou ports locaux, garde platformio.ini générique et place tes réglages perso dans platformio.override.ini, ignoré par Git. Un exemple est fourni dans platformio.override.example.ini.
Tu peux aussi passer l'IP à la volée :
pio run -e soundpanel7_ota -t upload --upload-port 192.168.1.137Pour la variante 7B :
pio run -e soundpanel7b_ota -t upload
pio run -e soundpanel7b_ota -t upload --upload-port 192.168.1.138L'OTA espota suppose que le poste de build et l'appareil sont sur le même réseau joignable.
Le firmware sait aussi :
- vérifier la dernière release publiée sur GitHub
- comparer cette release avec la version courante du firmware
- télécharger
firmware.bindirectement depuis les assets de release - vérifier le
SHA-256avant application - écrire l'image dans la partition OTA inactive puis redémarrer automatiquement
Le point d'entrée utilisé par l'appareil est :
https://github.com/jjtronics/SoundPanel7/releases/latest/download/release-manifest.json
Flux recommandé :
- publier une release GitHub
- ouvrir
Paramètres > GitHub Releasessur la tablette - cliquer
Vérifier les mises à jour - cliquer
Installer
À partir de v0.2.7, le flux OTA GitHub embarqué est considéré comme fiable pour une mise à jour complète directement depuis l'appareil.
Le système de calibration fonctionne en 3 ou 5 points.
Procédure recommandée :
- placer un sonomètre de référence à côté du SoundPanel 7
- générer ou mesurer un niveau stable
- saisir la valeur réelle
- capturer les points de référence
Valeurs typiques utiles en mode 3 points :
45 dB65 dB85 dB
Le firmware permet aussi :
- de choisir le mode
3 pointsou5 points - de régler la durée de capture
- d'effacer la calibration
- de conserver des offsets de secours dans la configuration
Le firmware stocke ensuite les points et corrige la lecture.
Pour réinjecter rapidement une calibration connue via l'interface web (Configuration > Importer JSON), voici un exemple prêt à l'emploi pour un MAX4466 :
{
"type": "soundpanel7-config",
"version": 8,
"audioSource": 1,
"calibrationPointCount": 5,
"calibrationCaptureSec": 3,
"analogBaseOffsetDb": 0,
"analogExtraOffsetDb": 15,
"calPointRefDb": [35, 50, 70, 80, 90],
"calPointRawLogRms": [1.3779, 1.4131, 1.9797, 2.4076, 2.9448],
"calPointValid": [1, 1, 1, 1, 1],
"analogCalibrationPointCount": 5,
"analogCalibrationCaptureSec": 3,
"analogBaseOffsetDb": 0,
"analogExtraOffsetDb": 15,
"analogCalPointRefDb": [35, 50, 70, 80, 90],
"analogCalPointRawLogRms": [1.3779, 1.4131, 1.9797, 2.4076, 2.9448],
"analogCalPointValid": [1, 1, 1, 1, 1]
}audioSource: 1 correspond à Analog Mic. Cet exemple remplit à la fois la calibration active et le profil analogique persistant.
Une vidéo de démonstration montre le SoundPanel 7 à côté d'un vrai sonomètre professionnel, pendant une montée progressive de bruit blanc, afin de vérifier que les mesures restent cohérentes.
Cliquer sur l'image pour ouvrir la vidéo comparative MP4.
Le cœur du projet reste volontairement simple :
AudioEngine -> SharedHistory -> UI / Web / MQTT
|
-> stockage et restitution des mesures
Composants principaux :
src/main.cpp: orchestration globalesrc/AudioEngine.cpp: acquisition et calculs audiosrc/ui/UiManager.cpp: interface LVGLsrc/WebManager.cpp: HTTP, admin, live view, APIsrc/MqttManager.cpp: MQTT et discoverysrc/OtaManager.cpp: OTAsrc/ReleaseUpdateManager.cpp: vérification / installation des releases GitHubsrc/SettingsStore.cpp: persistance NVS
.
├── src/ Firmware principal
├── custom_components/ Intégration Home Assistant
├── include/ Headers partagés
├── assets/ Polices
└── platformio.ini Build, flash et environnements
Le projet est déjà exploitable, mais reste évolutif :
- la chaîne audio dépend encore beaucoup du capteur analogique réel
- le rendu final dépend de la calibration
- certains paramètres de
platformio.inisont ajustés pour la machine de dev actuelle - la documentation hardware et câblage peut encore être enrichie
En clair : c'est un projet sérieux, vivant, et déjà très utile.
Les contributions sont bienvenues, surtout sur :
- documentation
- guide hardware et câblage
- calibration
- UX de l'interface
- intégration et fiabilité réseau
Point d'entrée recommandé :
- compiler
- flasher
- valider l'affichage local
- tester l'interface web
- tester MQTT, OTA et Home Assistant
- Overview
- Visual tour
- Key features
- Use cases
- Features
- Hardware target
- Buy the ESP
- Quick start
- Default configuration
- Web interface
- Dashboard display
- Web security and PIN
- Wi-Fi multi-AP
- Configuration management
- NTP clock
- MQTT and Home Assistant
- Outbound alerting
- OTA updates
- Calibration workflow
- Firmware architecture
- Project layout
- Project status
- License
SoundPanel 7 is a connected wall panel that makes several things instantly visible:
- ambient sound level
- network-synchronized time down to the second
- local device, Wi-Fi, and service status
The original idea came from a very practical problem: the open space where I work was simply too noisy.
The goal was to build a gentle awareness tool: something visible, factual, calm, and readable enough to reduce noise without policing people.
From there, the device evolved into a standalone panel for offices, studios, control rooms, podcast setups, workshops, and other real workspaces.
SoundPanel 7 is not just a sound meter. It is a local monitoring panel for sound, time, network visibility, diagnostics, and connected integrations.
Before getting into firmware and integration details, here is the project in real environments: lab space, recording studio, and day-to-day use.
- Large 7" touchscreen for sound, time, and device status at a glance
- Real-time sound monitoring with instant dB, Leq, and Peak
- Large NTP clock with visible seconds for studio and broadcast-style timing
- Dual interface: local LVGL UI plus secure embedded web administration
- Connected integrations: MQTT, Discovery, Home Assistant, and OTA
- Persistent settings with export, import, backup, and restore
- Noisy open space: make sound levels visible without turning into the noise police
- Recording studio: keep both sound level and precise time in view
- Broadcast or control room: display reliable network time with seconds
- Podcast or voice booth: follow timing and on-air references
- Workshop or public space: show a simple, readable ambient indicator
- Smart home wall panel: useful information, not just decoration
- continuous sound level measurement
- selectable audio source:
Demo,Analog Mic,PDM MEMS,INMP441 - Leq calculation
- Peak calculation
- configurable visual thresholds
- configurable rolling history
- Fast or Slow response mode
- configurable peak hold
- microphone calibration in 3 or 5 points
- configurable calibration capture duration
- always-visible large clock
- visible seconds for broadcast, recording, and sync use cases
- automatic NTP synchronization
- configurable NTP server, timezone, and sync interval
- sync status visible in the UI and the API
- direct touch control on the 7" panel
- immediate reading of sound levels and time
- access to local system information
- screen off and shutdown from the interface
- local PIN protection for sensitive pages
- fully usable without a browser
- real-time monitoring and administration
- UI, audio, Wi-Fi, NTP, OTA, MQTT, and network configuration
- browser-based calibration and LIVE mode control
- GitHub firmware release check and install directly from the web UI
- web authentication with first-account bootstrap, user management, and sessions
- outbound notifications via webhooks / API: Slack incoming webhook, Telegram Bot API, WhatsApp Cloud API, with test delivery
- live SSE stream on port
81 - config export / import / backup / restore
- partial reset by scope:
ui,time,audio,calibration,ota,mqtt - system actions: reboot, shutdown, factory reset
- Wi-Fi through configuration portal
- mDNS / Zeroconf:
_soundpanel7._tcp.local. - MQTT
- MQTT Discovery for Home Assistant
- LIVE control through both Web UI and MQTT
- native Home Assistant integration through Zeroconf/mDNS
- OTA through
espota
- uptime
- MCU temperature
- firmware version
- build environment
- OTA / MQTT state
- LVGL load, UI timings, internal heap / PSRAM
- LVGL object count
- last backup timestamp
- Waveshare ESP32-S3-Touch-LCD-7
- Waveshare ESP32-S3-Touch-LCD-7B
- 7" touchscreen
- ESP32-S3
- Wi-Fi
- PSRAM
- USB
- controllable backlight
For the official board documentation, see also:
The ESP32-S3-Touch-LCD-7B uses a different display geometry than the 7 (1024x600 instead of 800x480), so it requires dedicated PlatformIO environments (soundpanel7b_usb, soundpanel7b_ota) to avoid display issues.
The firmware now supports three distinct hardware profiles through PlatformIO:
soundpanel7_usb/soundpanel7_ota: Waveshare 7-inch touchscreen profile with local LVGL UI, local PIN, display control, and full web administrationsoundpanel7b_usb/soundpanel7b_ota: Waveshare 7B 1024x600 touchscreen profile with local LVGL UI, local PIN, display control, and full web administrationsoundpanel7_headless_usb/soundpanel7_headless_ota: standard ESP32-S3 without screen for a web-only sound meter
In headless mode:
- there is no local touch UI
- screen, touch, and local PIN settings disappear from the web admin
- TARDIS mode can drive the onboard RGB LED found on some standard ESP32-S3 boards to simulate the cabin light
- the rest stays the same: audio metering, web UI, Wi-Fi, NTP, MQTT, OTA, Home Assistant, config export/import
Example headless build: a web-only sound meter integrated into a TARDIS model.
I published a full write-up about this hardware on my blog, including hands-on feedback, photos, and a final rating:
That article also includes the affiliate purchase link for the ESP32-S3 Touch LCD used in this project.
The firmware now lets you choose the audio source directly from the web admin:
Demo: simulated values for development and demosAnalog Mic: analog microphone such asMAX4466PDM MEMS: digital PDM microphoneINMP441: digital I2S microphone
Compatible examples:
MAX4466or similar fixed-gain analog microphone modules- 3.3 V PDM MEMS microphones
INMP441
Model to definitely avoid:
MAX9814: its automatic gain control makes it unsuitable for reliable measurement here
Important:
- audio pins are not configured from the web UI
- GPIO mapping is selected automatically from the
PlatformIOenvironment Waveshareprofile = Waveshare pin mapheadlessprofile = standard ESP32-S3 pin map
The tables below document the default wiring used by the current firmware.
| Microphone type | Module signal | Firmware GPIO | Board label / silk screen |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO6 |
Sensor AD |
| PDM MEMS | CLK |
GPIO12 |
SCK |
| PDM MEMS | DATA |
GPIO13 |
MISO |
| INMP441 | SCK / BCLK |
GPIO12 |
SCK |
| INMP441 | WS / LRCL |
GPIO11 |
MOSI |
| INMP441 | SD |
GPIO13 |
MISO |
Useful notes:
- on the Waveshare board,
GPIO11,GPIO12, andGPIO13are also the exposedTFbus labeledMOSI,SCK,MISO - if you wire a digital microphone there, avoid using the TF card at the same time
- for
INMP441, connectL/RtoGNDto read the left channel
The soundpanel7b_* profile reuses the same default audio wiring as the Waveshare ESP32-S3-Touch-LCD-7.
| Microphone type | Module signal | Firmware GPIO | Board label / silk screen |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO6 |
Sensor AD |
| PDM MEMS | CLK |
GPIO12 |
SCK |
| PDM MEMS | DATA |
GPIO13 |
MISO |
| INMP441 | SCK / BCLK |
GPIO12 |
SCK |
| INMP441 | WS / LRCL |
GPIO11 |
MOSI |
| INMP441 | SD |
GPIO13 |
MISO |
The headless profile targets an ESP32-S3 DevKitC-1 or equivalent without a screen.
| Microphone type | Module signal | Firmware GPIO | Usual board silk screen |
|---|---|---|---|
Analog Mic (MAX4466) |
OUT |
GPIO4 |
4 / IO4 |
| PDM MEMS | CLK |
GPIO12 |
12 / IO12 |
| PDM MEMS | DATA |
GPIO13 |
13 / IO13 |
| INMP441 | SCK / BCLK |
GPIO12 |
12 / IO12 |
| INMP441 | WS / LRCL |
GPIO11 |
11 / IO11 |
| INMP441 | SD |
GPIO13 |
13 / IO13 |
Useful notes:
- on a standard
ESP32-S3board, these labels are usually printed directly asIO4,IO11,IO12,IO13or simply4,11,12,13 - for
INMP441, connectL/RtoGNDto stay on the left channel - make sure the microphone and the board share a common ground
- some
ESP32-S3 N16R8boards also expose an onboard addressable RGB LED that can be used by TARDIS mode
By default, the project builds with a mock audio mode to make development easier without a real measurement chain.
In platformio.ini, this flag is enabled by default:
-DSOUNDPANEL7_MOCK_AUDIO=1If you connect a real analog input, check that setting first before judging the panel's behavior.
On headless builds, the web admin also exposes a TARDIS mode block for the cabin lighting:
Sound alert: the interior LED follows the meter alert levelFixed color: manual selection through a color pickerTARDIS takeoff: non-blocking blue animated effect inspired by the TARDIS beacon glow
On compatible boards, the onboard RGB LED is used for the interior light, while the exterior light remains driven through its dedicated GPIO output.
TARDIS mode can reuse the onboard RGB LED to animate the cabin glow in blue.
git clone https://github.com/jjtronics/SoundPanel7.git
cd SoundPanel7The easiest setup is:
- VS Code
- PlatformIO extension
You can also use the pio CLI if PlatformIO Core is already installed.
pio runExplicit per-profile builds:
pio run -e soundpanel7_usb
pio run -e soundpanel7b_usb
pio run -e soundpanel7_headless_usbThe default environment remains soundpanel7_usb. For a Waveshare ESP32-S3-Touch-LCD-7B, explicitly select soundpanel7b_usb.
The default environment is soundpanel7_usb.
pio run -e soundpanel7_usb -t uploadFor a Waveshare ESP32-S3-Touch-LCD-7B:
pio run -e soundpanel7b_usb -t uploadFor a standard ESP32-S3 without screen:
pio run -e soundpanel7_headless_usb -t uploadpio device monitor -b 115200Once OTA is configured on the device:
pio run -e soundpanel7_ota -t upload7B variant:
pio run -e soundpanel7b_ota -t uploadHeadless variant:
pio run -e soundpanel7_headless_ota -t uploadMachine- and network-specific values should not be committed in platformio.ini.
Use a local platformio.override.ini file ignored by Git instead, for example from platformio.override.example.ini.
Example:
[env:soundpanel7_usb]
upload_port = /dev/cu.usbmodemXXXX
monitor_port = /dev/cu.usbmodemXXXX
[env:soundpanel7_ota]
upload_port = 192.168.1.137One-shot alternative:
pio run -e soundpanel7_ota -t upload --upload-port 192.168.1.137Also make sure the machine running espota is on the same reachable Wi-Fi/network as the device.
Typical local values to override are:
upload_portmonitor_port- OTA password if used
At boot, the firmware initializes:
- settings storage
- display and touch, when the build includes a screen
- networking
- OTA
- MQTT
- web interface
- audio engine
Current firmware defaults:
- hostname:
soundpanel7 - NTP server:
fr.pool.ntp.org - POSIX timezone:
CET-1CEST,M3.5.0/2,M10.5.0/3 - NTP sync interval:
180 min - OTA enabled:
yes - OTA port:
3232 - MQTT enabled:
no - MQTT base topic:
soundpanel7 - analog pin:
GPIO6 - default audio source: analog sensor
- analog RMS window:
256 samples - default audio response:
Fast - peak hold:
5000 ms - default calibration:
3 points,3 scapture
These settings are defined in src/SettingsStore.h.
Once the device is connected to Wi-Fi:
http://DEVICE_IP/http://soundpanel7.local/if mDNS is available- live stream:
http://DEVICE_IP:81/api/events
The interface lets you configure:
- brightness
- color thresholds
- history duration
- audio response mode
- orange / red alert hold time
- LIVE mode and default dashboard page
- control over the local dashboard display: selected page, touch enabled/disabled, fullscreen mode without the top menu
- Wi-Fi settings
- NTP, timezone, sync interval, and hostname
- OTA settings
- MQTT settings
- outbound notifications: Slack incoming webhook, Telegram Bot API, WhatsApp Cloud API
- microphone calibration
- local access PIN
- web user accounts
- backup / restore / import / export of settings
Animated walkthrough of the settings area:
Main endpoints exposed by the firmware:
GET /api/auth/status
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/bootstrap
GET /api/users
POST /api/users/create
POST /api/users/password
POST /api/users/delete
GET /api/homeassistant
POST /api/homeassistant
GET /api/ha/status
GET /api/status
POST /api/pin
POST /api/ui
GET /api/live
POST /api/live
GET /api/wifi
POST /api/wifi
GET /api/time
POST /api/time
GET /api/config/export
POST /api/config/import
POST /api/config/backup
POST /api/config/restore
POST /api/config/reset_partial
GET /api/ota
POST /api/ota
GET /api/release
POST /api/release/check
POST /api/release/install
GET /api/mqtt
POST /api/mqtt
GET /api/notifications
POST /api/notifications
POST /api/notifications/test
POST /api/calibrate
POST /api/calibrate/clear
POST /api/calibrate/mode
POST /api/reboot
POST /api/shutdown
POST /api/factory_reset
GET /api/status includes:
- dB, Leq, Peak
- rolling history
- uptime
- Wi-Fi status, IP, and RSSI
- NTP state / current time
- MCU temperature
- firmware version and build environment
- OTA / MQTT state
- LIVE, PIN, and calibration state
- LVGL / heap runtime statistics
The web interface also lets you control how the 7" local panel is displayed:
- choose the active view: overview, clock, LIVE, or sound meter
- enable or disable touch input entirely
- enable fullscreen per view to hide the top bar on the local screen
- apply changes immediately without reflashing the firmware
These settings are stored through the firmware UI API and persist across reboots.
The project combines two protection layers:
- web authentication with first-user bootstrap
- local user management with password changes and user deletion
- web sessions for administration and access to the live stream
- local PIN protection for sensitive pages on the touchscreen panel
Associated endpoints:
GET /api/auth/status
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/bootstrap
GET /api/users
POST /api/users/create
POST /api/users/password
POST /api/users/delete
POST /api/pin
The panel can store up to 4 Wi-Fi networks so it can move between different environments more easily:
- home, office, studio, phone hotspot, and similar setups
- keep an already stored password when the field is left empty
- support open networks when no password is provided
- show the current connection state in the web interface
Associated endpoints:
GET /api/wifi
POST /api/wifi
The firmware includes real configuration lifecycle tooling so settings do not have to be rebuilt manually:
- full JSON export of the current configuration
- configuration import from the web interface
- local backup of the latest known state
- one-click backup restore
- partial reset by scope:
ui,time,audio,calibration,ota,mqtt - last backup timestamp visible in status
Associated endpoints:
GET /api/config/export
POST /api/config/import
POST /api/config/backup
POST /api/config/restore
POST /api/config/reset_partial
SoundPanel 7 also works as a large network clock. In a studio, control room, podcast setup, or broadcast workflow, reliable time with visible seconds is often just as useful as the sound reading itself.
The firmware handles:
- automatic NTP synchronization
- configurable NTP server
- POSIX timezone support
- configurable resync interval
- local
HH:MMdisplay with a seconds badge - full time display in the web interface
The default NTP server is fr.pool.ntp.org.
The panel can publish its metrics to an MQTT broker.
Available settings:
- host
- port
- username / password
- client ID
- base topic
- publish interval
- retain
Published topics:
soundpanel7/availability
soundpanel7/state
soundpanel7/db
soundpanel7/leq
soundpanel7/peak
soundpanel7/live/state
soundpanel7/live/set
soundpanel7/wifi/rssi
soundpanel7/wifi/ip
With MQTT Discovery, the firmware publishes these Home Assistant entities automatically:
dB InstantLeqPeakLIVEWiFi RSSIWiFi IP
The panel can send alerts to external services when a threshold is exceeded or when the sound level returns to normal.
Supported channels:
- Slack through an incoming webhook
- Telegram through the Bot API
- WhatsApp through the Cloud API
Available capabilities:
- notify on
warningand/orcriticalalerts - optional notification when the level returns to normal
- summary of active targets
- last result and last successful delivery tracking
- test delivery from the web interface
Associated endpoints:
GET /api/notifications
POST /api/notifications
POST /api/notifications/test
Home Assistant support is available in two ways:
If your Home Assistant setup already relies on MQTT, this is the quickest path: enable MQTT on the panel, configure the broker, and entities will be created automatically.
A custom integration is included in:
The firmware advertises:
_soundpanel7._tcp.local.
The integration queries the dedicated /api/ha/status endpoint with a Home Assistant bearer token.
Sensors exposed by the native integration:
dB InstantLeqPeakWiFi RSSIWiFi IPUptime
The repository can now be added to HACS as a custom repository.
Requirements:
- a published GitHub release (for example
v0.1.0) - HACS already installed in Home Assistant
Steps:
- open
HACS > Integrations - open the top-right menu and choose
Custom repositories - add
https://github.com/jjtronics/SoundPanel7 - select the
Integrationcategory - search for
SoundPanel 7in HACS and install it - restart Home Assistant
- restart SoundPanel 7
- open
Settings > Devices & Services - wait for auto-discovery
Installation example:
mkdir -p /config/custom_components
cp -R custom_components/soundpanel7 /config/custom_components/After that:
- in the panel web UI, open
Settings > Home Assistant - generate or set a dedicated token
- restart Home Assistant
- restart SoundPanel 7
- open
Settings > Devices & Services - wait for auto-discovery
The config flow will ask for that token.
If the device does not show up, check:
- the Home Assistant token is configured on the panel
- same local network on both sides
manifest.jsoncorrectly copied- panel reachable through its web UI
- mDNS not blocked by network setup or VLAN segmentation
The project now supports two complementary OTA flows:
- classic network OTA through PlatformIO /
espota - built-in GitHub OTA directly from the tablet web UI
Once classic OTA is configured on the device, updates use:
pio run -e soundpanel7_ota -t uploadIn platformio.ini, the OTA environment uses:
upload_protocol = espota- default port
3232 - configurable OTA password
To avoid committing local IPs or serial ports, keep platformio.ini generic and put personal overrides in platformio.override.ini, which is ignored by Git. An example is provided in platformio.override.example.ini.
You can also pass the target IP directly:
pio run -e soundpanel7_ota -t upload --upload-port 192.168.1.137For the 7B variant:
pio run -e soundpanel7b_ota -t upload
pio run -e soundpanel7b_ota -t upload --upload-port 192.168.1.138espota assumes the build machine and the device are on the same reachable network.
The firmware can also:
- check the latest published GitHub release
- compare it with the currently running firmware version
- download
firmware.bindirectly from the release assets - verify the
SHA-256before applying the update - write the image to the inactive OTA partition and reboot automatically
The device uses this stable manifest entry point:
https://github.com/jjtronics/SoundPanel7/releases/latest/download/release-manifest.json
Recommended flow:
- publish a GitHub release
- open
Settings > GitHub Releaseson the tablet - click
Check for updates - click
Install
Starting with v0.2.7, the built-in GitHub OTA flow is considered reliable for full end-to-end device updates.
The calibration system uses 3 or 5 reference points.
Recommended process:
- place a reference sound meter next to SoundPanel 7
- generate or observe a stable sound level
- enter the real measured value
- capture the reference points
Typical useful values in 3-point mode:
45 dB65 dB85 dB
The firmware also lets you:
- switch between
3-pointand5-pointmodes - configure the capture duration
- clear the current calibration
- keep fallback offsets in settings
The firmware stores those points and applies the correction curve accordingly.
To quickly restore a known calibration through the web UI (Configuration > Import JSON), here is a ready-to-use example for a MAX4466:
{
"type": "soundpanel7-config",
"version": 8,
"audioSource": 1,
"calibrationPointCount": 5,
"calibrationCaptureSec": 3,
"analogBaseOffsetDb": 0,
"analogExtraOffsetDb": 15,
"calPointRefDb": [35, 50, 70, 80, 90],
"calPointRawLogRms": [1.3779, 1.4131, 1.9797, 2.4076, 2.9448],
"calPointValid": [1, 1, 1, 1, 1],
"analogCalibrationPointCount": 5,
"analogCalibrationCaptureSec": 3,
"analogBaseOffsetDb": 0,
"analogExtraOffsetDb": 15,
"analogCalPointRefDb": [35, 50, 70, 80, 90],
"analogCalPointRawLogRms": [1.3779, 1.4131, 1.9797, 2.4076, 2.9448],
"analogCalPointValid": [1, 1, 1, 1, 1]
}audioSource: 1 maps to Analog Mic. This example fills both the active calibration and the persisted analog profile.
A short demo video shows SoundPanel 7 next to a professional sound level meter while white noise is increased progressively, to confirm the readings stay aligned.
Click the image to open the comparative MP4 video.
The core flow remains intentionally simple:
AudioEngine -> SharedHistory -> UI / Web / MQTT
|
-> data storage and playback
Main components:
src/main.cpp: global orchestrationsrc/AudioEngine.cpp: audio acquisition and calculationssrc/ui/UiManager.cpp: LVGL interfacesrc/WebManager.cpp: HTTP, admin, live view, APIsrc/MqttManager.cpp: MQTT publishing and discoverysrc/OtaManager.cpp: OTA updatessrc/ReleaseUpdateManager.cpp: GitHub release check and install flowsrc/SettingsStore.cpp: NVS persistence
.
├── src/ Main firmware
├── custom_components/ Home Assistant integration
├── include/ Shared headers
├── assets/ Fonts
└── platformio.ini Build, flash, and environments
The project is already useful and operational, but still evolving:
- the audio chain still depends heavily on the real analog sensor hardware
- final accuracy depends on calibration quality
- some
platformio.inivalues are tuned for the current development machine - hardware and wiring documentation can still be expanded
In short: this is a serious project, a living one, and already a very practical tool.
This project is released under the MIT License.
See LICENSE.












