4.4 KiB
ESP32-WROOM-32U HTTP Audio Streamer für BirdNET-Go
Dieses Repository enthält die Firmware für einen autarken HTTP-WAV-Audiostreamer auf Basis eines ESP32-WROOM-32U DevKits (mit externer Antenne) und eines I2S-MEMS-Mikrofons (z. B. INMP441 oder ICS-43434).
Der Streamer erfasst Audio mit 48 kHz / 16 Bit Mono und stellt es über einen unterbrechungsfreien HTTP-Webserver direkt im Netzwerk bereit. Dieser Stream kann nativ von BirdNET-Go (z. B. im Docker-Container auf einem NAS) oder im Browser/VLC verarbeitet werden.
Features
- HTTP WAV Streaming: Direkte, standardkonforme Bereitstellung der Rohdaten über HTTP (Port 80) ohne Overhead durch komplexe RTSP-Protokolle.
- Asynchrones Dual-Core Processing: Nutzt die mächtige arduino-audio-tools Bibliothek. Das Auslesen des Mikrofons und das Senden über WLAN laufen asynchron. Das verhindert TCP-Fragmentierung und eliminiert Audio-Aussetzer ("schwarze vertikale Balken") im BirdNET-Spektrogramm vollständig.
- Hohe WLAN-Reichweite: Ausgelegt auf das ESP32-WROOM-32U Modul mit U.FL-Anschluss und externer Stabantenne für den stabilen Langzeiteinsatz im Garten.
Hardware & Pinbelegung
Komponenten
- MCU: ESP32-WROOM-32U DevKit (ESP32 Dev Module)
- Mikrofon: I2S MEMS (z. B. INMP441, ICS-43434)
- Zusatz: Stützkondensator (470 µF oder 1000 µF)
Verdrahtung
| Mikrofon Pin | ESP32-WROOM-32U Pin | Beschreibung |
|---|---|---|
| VDD | 3V3 | Versorgungsspannung (3,3 V – niemals an 5 V / VIN!) |
| GND | GND | Masse |
| L/R (SEL) | GND | Kanalwahl (GND erzwingt den linken Mono-Kanal) |
| SCK / BCLK | GPIO 27 | I2S Bit Clock (Sample-Takt 48 kHz) |
| WS / LRCL | GPIO 26 | I2S Word Select |
| SD / Dout | GPIO 25 | I2S Serial Data Out (Audio-Datenleitung) |
Hardware-Tipp für den Außeneinsatz:
- Löte einen Elektrolytkondensator (470 µF oder 1000 µF) nah am ESP32 zwischen 3V3 und GND. Das fängt Stromspitzen der WLAN-Antenne beim Senden ab und verhindert interne Spannungsabfälle sowie Rauschen im Audiosignal.
- Die externe Antenne muss auf dem U.FL-Port aufgesteckt sein, bevor das Board mit Strom versorgt wird.
Konfiguration & Flashen
Voraussetzungen
- Arduino IDE (mit ESP32-Boardpaket) oder PlatformIO.
- Zusatzbibliothek:
arduino-audio-toolsvon Phil Schatzmann (Installation via ZIP in Arduino IDE oder überlib_depsin PlatformIO).
Wichtige IDE-Einstellungen
Da die Audio-Bibliothek sehr umfangreich ist und einige ESP32-Boards spezielle Speichereinstellungen benötigen, müssen folgende Parameter unter Werkzeuge in der Arduino IDE gesetzt werden:
- Board:
ESP32 Dev Module - Partition Scheme:
Huge APP (3MB No OTA/1MB SPIFFS)(Zwingend erforderlich für die Audio-Bibliothek!) - Flash Mode:
DIO(Verhindert Speicher-Lesefehler) - Flash Frequency:
40MHz(Verhindert Crash-Loops / Boot-Schleifen bei günstigen Flash-Bausteinen) - Erase All Flash Before Sketch Upload:
Enabled(Empfohlen beim allerersten Flashen, um alten Datenmüll zu bereinigen)
Anpassung & Upload
Passe vor dem Kompilieren im Code die WLAN-Zugangsdaten an:
const char *ssid = "DEINE_SSID";
const char *password = "DEIN_WLAN_PASSWORT";
Upload-Hinweis für das DevKit:
Wenn während des Uploads in der Konsole Connecting........ erscheint, muss die winzige "BOOT"-Taste auf dem ESP32-Board für 1-2 Sekunden gedrückt gehalten werden, um den Flash-Vorgang manuell zu starten.
Nach dem Neustart (Druck auf die "EN"-Taste) gibt der Serielle Monitor (115200 Baud) die IP-Adresse aus. Die Stream-URL lautet:
http://<ESP32-IP>/
Einbindung in BirdNET-Go
- Web-Dashboard von BirdNET-Go öffnen.
- In die Einstellungen (Settings) wechseln und zum Bereich Audio-Schnittstelle (Audio / Input) scrollen.
- Den Stream eintragen:
- Stream-URL:
http://<ESP32-IP>/(ohne Port-Angabe am Ende)
- Stream-URL:
- Änderungen speichern. Das Spektrogramm im Dashboard sollte nun einen durchgängigen, lückenlosen Audio-Feed zeigen.
Lokaler Test
Um den Stream unabhängig von BirdNET-Go zu verifizieren:
- Einen Webbrowser oder VLC Media Player öffnen (
Strg + N-> Netzwerkstream öffnen). - URL eingeben:
http://<ESP32-IP>/. - Die Wiedergabe startet sofort. (Achtung: Browser haben meist ein paar Sekunden Puffer-Verzögerung).