Ein akkubetriebener Lautsprecher, der automatisch Webradio spielt, sobald jemand den Raum betritt, und sich wieder schlafen legt, wenn niemand mehr da ist.
Navigation mit ← → oder Leertaste
ESP32 und Verstärker sind aus. Verbrauch unter 1 mA, nur der PIR-Sensor wacht.
Der AM312 setzt seinen Ausgang auf HIGH und weckt den ESP32 über den RTC-Pin.
WLAN-Verbindung und Stream-Aufbau dauern ca. 3–6 Sekunden.
MP3-Stream wird dekodiert und per I2S an den MAX98357A geschickt.
Jede Bewegung setzt den Timer zurück. Nach 3 Min ohne Bewegung: zurück in Schritt 01.
Warum kein Bluetooth? WLAN-Streaming und Bluetooth gleichzeitig laufen auf dem ESP32 instabil, und der ESP32-S3 hat kein klassisches Bluetooth (A2DP). Ein fest verbauter Lautsprecher am I2S-Verstärker ist einfacher, zuverlässiger und stromsparender.
| Bauteil | Empfehlung | Warum | ca. Preis |
|---|---|---|---|
| Mikrocontroller | Adafruit ESP32-S3 Feather (2 MB PSRAM) Alt.: DFRobot FireBeetle 2 ESP32-S3 | Akku-Ladeschaltung und USB-C an Bord, geringer Schlafstrom, PSRAM puffert den Stream | 18–22 € |
| Bewegungssensor | AM312 Mini-PIR | Läuft mit 3,3 V, winziger Ruhestrom (~0,1 mA) | 2–3 € |
| Verstärker | MAX98357A I2S-Modul | DAC und 3-W-Verstärker in einem, läuft direkt am Akku, SD-Pin zum Abschalten | 4–6 € |
| Lautsprecher | 3 W / 4 Ω, Ø 40 mm | Passt zum MAX98357A, klingt in geschlossener Kammer gut | 3–6 € |
| Akku | LiPo 3,7 V, 2500 mAh, JST-PH 2-polig | Steckt direkt am Feather, wird per USB-C geladen. Polarität prüfen! | 8–12 € |
| Schalter | Mini-Schiebeschalter | Trennt den Akku komplett | 1 € |
| Kleinkram | Litzen, M2.5-Einschmelzmuttern, Schrauben, PETG | Gehäuse und Befestigung | 3–5 € |
| Gesamt | ≈ 40–55 € | ||
Wichtig: GPIO 5 muss ein RTC-fähiger Pin sein, damit er den ESP32 aus dem Deep Sleep wecken kann. Pinbelegung vor dem Löten mit dem Pinout deines Boards abgleichen.
Annahmen: Ruhestrom 0,8 mA, aktiv 180 mA + 10 mA pro Lautstärkestufe, 85 % nutzbare Kapazität. Echte Werte schwanken je nach WLAN-Empfang und Musik.
Laufzeit pro Ladung
Dauerbetrieb Radio
#include <WiFi.h> #include "Audio.h" #define PIR_PIN 5 #define AMP_SD 12 #define I2S_BCLK 9 #define I2S_LRC 10 #define I2S_DOUT 11 const char* ssid = "DEIN_WLAN"; const char* pass = "DEIN_PASSWORT"; const char* stream = "http://STREAM-URL"; const unsigned long NACHLAUF = 3UL * 60 * 1000; // 3 Minuten Audio audio; unsigned long letzteBewegung; void schlafen() { audio.stopSong(); digitalWrite(AMP_SD, LOW); // Verstärker aus WiFi.disconnect(true); esp_sleep_enable_ext0_wakeup((gpio_num_t)PIR_PIN, 1); esp_deep_sleep_start(); } void setup() { pinMode(PIR_PIN, INPUT); pinMode(AMP_SD, OUTPUT); digitalWrite(AMP_SD, HIGH); // Verstärker an WiFi.begin(ssid, pass); unsigned long t = millis(); while (WiFi.status() != WL_CONNECTED) { if (millis() - t > 15000) schlafen(); // kein WLAN → schlafen delay(200); } audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); audio.setVolume(12); // 0–21 audio.connecttohost(stream); letzteBewegung = millis(); } void loop() { if (digitalRead(PIR_PIN) == HIGH) letzteBewegung = millis(); if (millis() - letzteBewegung > NACHLAUF) schlafen(); audio.loop(); }
Auf radio-browser.info den Sender suchen und eine MP3-URL mit 128 kbit/s kopieren.
| Außen (B×H×T) | 110 × 80 × 70 mm |
| Wandstärke | 2,5 mm |
| Lautsprecherkammer | ≈ 47 × 75 × 37 mm ≈ 130 ml |
| Lautsprecher-Ausschnitt | Ø 36 mm + Gitter |
| PIR-Öffnung | Ø 9,5 mm |
| USB-C-Ausschnitt | 10 × 4,5 mm (Rückseite) |
Tipp: Haken anklicken, um Schritte abzuhaken.