DIY-Projekt · ESP32-S3

Das Bewegungs­radio

Ein akkubetriebener Lautsprecher, der automatisch Webradio spielt, sobald jemand den Raum betritt, und sich wieder schlafen legt, wenn niemand mehr da ist.

WLAN-Webradio
PIR-Bewegungssensor
Akku mit USB-C-Laden
3D-gedrucktes Gehäuse

Navigation mit ← → oder Leertaste

01 · Funktionsprinzip

So funktioniert es

01

Deep Sleep

ESP32 und Verstärker sind aus. Verbrauch unter 1 mA, nur der PIR-Sensor wacht.

02

Bewegung

Der AM312 setzt seinen Ausgang auf HIGH und weckt den ESP32 über den RTC-Pin.

03

Verbinden

WLAN-Verbindung und Stream-Aufbau dauern ca. 3–6 Sekunden.

04

Radio läuft

MP3-Stream wird dekodiert und per I2S an den MAX98357A geschickt.

05

Nachlauf

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.

02 · Einkaufsliste

Teileliste

BauteilEmpfehlungWarumca. Preis
MikrocontrollerAdafruit ESP32-S3 Feather (2 MB PSRAM)
Alt.: DFRobot FireBeetle 2 ESP32-S3
Akku-Ladeschaltung und USB-C an Bord, geringer Schlafstrom, PSRAM puffert den Stream18–22 €
BewegungssensorAM312 Mini-PIRLäuft mit 3,3 V, winziger Ruhestrom (~0,1 mA)2–3 €
VerstärkerMAX98357A I2S-ModulDAC und 3-W-Verstärker in einem, läuft direkt am Akku, SD-Pin zum Abschalten4–6 €
Lautsprecher3 W / 4 Ω, Ø 40 mmPasst zum MAX98357A, klingt in geschlossener Kammer gut3–6 €
AkkuLiPo 3,7 V, 2500 mAh, JST-PH 2-poligSteckt direkt am Feather, wird per USB-C geladen. Polarität prüfen!8–12 €
SchalterMini-SchiebeschalterTrennt den Akku komplett1 €
KleinkramLitzen, M2.5-Einschmelzmuttern, Schrauben, PETGGehäuse und Befestigung3–5 €
Gesamt≈ 40–55 €
03 · Schaltplan

Verkabelung

AM312 PIR VCC OUT GND ESP32-S3 Feather mit PSRAM · USB-C 3VGPIO 5GND BATGND GPIO 9GPIO 10 GPIO 11GPIO 12 JST · Akku MAX98357A VINGNDBCLKLRCDINSD + / − Lautsprecher 4 Ω LiPo 3,7 V 2500 mAh
Versorgung (3V / BAT) GND PIR-Signal → Wake-up BCLK LRC DIN SD (Verstärker an/aus)

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.

04 · Stromversorgung

Akkulaufzeit

Laufzeitrechner

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

–

Stromspar-Maßnahmen im Design

  • ESP32 im Deep Sleep, Wake-up per PIR (ext0)
  • Verstärker über SD-Pin komplett abgeschaltet
  • WLAN wird vor dem Schlafen getrennt
  • Kein WLAN gefunden? Nach 15 s zurück in den Schlaf
  • Feather statt DevKit: kein dauerhafter LED- und Reglerverbrauch
05 · Firmware

Code (Arduino IDE)

#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();
}

Setup in der IDE

  • Board-Paket esp32 von Espressif installieren
  • Board: Adafruit Feather ESP32-S3 2MB PSRAM
  • Bibliothek: ESP32-audioI2S (schreibfaul1)
  • PSRAM in den Werkzeug-Einstellungen aktivieren

Stream-URL finden

Auf radio-browser.info den Sender suchen und eine MP3-URL mit 128 kbit/s kopieren.

06 · Gehäuse

3D-Modell

Ziehen = drehen · Mausrad = zoomen · Hover = Bauteil

Bauteile

    07 · Konstruktion

    Maße & Druckhinweise

    Hauptmaße

    Außen (B×H×T)110 × 80 × 70 mm
    Wandstärke2,5 mm
    Lautsprecherkammer≈ 47 × 75 × 37 mm
    ≈ 130 ml
    Lautsprecher-AusschnittØ 36 mm + Gitter
    PIR-ÖffnungØ 9,5 mm
    USB-C-Ausschnitt10 × 4,5 mm (Rückseite)

    Klang

    • Kammer mit Trennwänden von der Elektronik luftdicht abtrennen
    • Kabeldurchführung mit Heißkleber abdichten
    • Lochgitter 2–3 mm vor der Membran, Stoff dahinter
    • Lautsprecher mit Moosgummi-Ring einschrauben

    Druck & Montage

    • PETG statt PLA (wärmebeständiger)
    • Board auf Abstandshaltern mit M2.5-Einschmelzmuttern
    • Akku mit Halterung oder Klett sichern
    • Rückdeckel verschrauben, nicht kleben
    • Kein Metall über der WLAN-Antenne
    • Front aufrecht drucken, Gitter ohne Stützen
    08 · Umsetzung

    Bau-Checkliste

    • Teile bestellen
    • Arduino IDE, esp32-Boardpaket und ESP32-audioI2S installieren
    • Test 1: Stream ohne PIR und Akku per USB abspielen
    • Test 2: PIR-Sensor einbinden, Nachlauf prüfen
    • Test 3: Deep Sleep und Wake-up testen
    • Ruhestrom mit Multimeter messen (Ziel: unter 1 mA)
    • Gehäuse modellieren und Testdruck der Front
    • Endgültiges Gehäuse in PETG drucken
    • Löten, einbauen, Kammer abdichten
    • Aufstellen und Nachlaufzeit feinjustieren

    Tipp: Haken anklicken, um Schritte abzuhaken.