Geräusch(Klingel) Detektor mit ESP Home

Der hier vorgestellte Geräusch-Detektor ist eine einfache, aber äußerst zuverlässige Lösung, um akustische Ereignisse mit einem ESP8266 und dem KY-037 Mikrofonmodul zu erkennen.
Durch die Kombination aus digitalem Mikrofonsignal und einer intelligenten Auswertung in ESPHome lassen sich Geräusche nicht nur erkennen, sondern auch sauber von zufälligen Spitzen oder Störungen unterscheiden.

Der Detektor eignet sich ideal für Anwendungen wie:

  • Überwachung von Maschinen oder Geräten
  • Erkennung von Klopf- oder Klatschsignalen
  • Raumüberwachung (z. B. „zu laut“, Alarm, Aktivitätserkennung)
  • Trigger für Automatisierungen in Home Assistant

Im Folgenden wird gezeigt, wie der Sensor angeschlossen, eingestellt und das Signal in ESPHome ausgewertet wird.

Geräusch-Detektor mit ESPHome

Dieses Projekt besteht aus einem ESP8266 (hier ein ESP8266-01) und dem Mikrofonmodul KY-037 (AZ-Delivery).
Der Detektor erkennt Geräusche anhand des digitalen Ausgangs (D0) des KY-037.

Verdrahtung

  • Spannungsversorgung wie üblich über 5 V bzw. 3,3 V (abhängig vom Aufbau).
  • Der digitale Ausgang D0 des KY-037 wird mit GPIO0 des ESP8266-01 verbunden.

Einstellung des KY-037

Am Modul befindet sich ein kleiner Drehregler zur Einstellung der Empfindlichkeit.
Dieser sollte so weit nach links gedreht werden, bis die entsprechende LED (Pin unten → linke LED) des Moduls erlischt.

Ab diesem Punkt kann die Empfindlichkeit so angepasst werden,
dass die LED zuverlässig beim gewünschten Geräusch aufleuchtet.

Erkennungsprinzip (einfach erklärt :innocent:)

Der KY-037 liefert ein digitales Signal:

  • HIGH (1) → Geräusch über Schwelle erkannt
  • LOW (0) → kein Geräusch

Der ESP8266 liest dieses Signal alle 10 ms aus und zählt dabei:

  1. Wie oft HIGH gemessen wurde
  2. Wie viele Messungen insgesamt erfolgten

Nach Ablauf eines einstellbaren Zeitfensters (z. B. 500 ms) wird berechnet,
wie hoch der Prozentsatz der HIGH-Messungen ist – der sogenannte Duty Cycle.

  • Liegt dieser Wert über dem eingestellten Schwellenwert, gilt:
    :arrow_right: Geräusch erkannt

  • Liegt er darunter, gilt:
    :arrow_right: Kein Geräusch

Warum dieses Verfahren sinnvoll ist

Der digitale Ausgang des KY-037 kann bei kurzen Störungen oder hoher Empfindlichkeit flackern.
Durch die Auswertung über ein Zeitfenster erkennt das System nur Geräusche, die konstant genug auftreten – spontane Spitzen werden zuverlässig herausgefiltert.

Hier nun der Code für ESP Home:

esphome:
  name: geraeusch-detektor
  friendly_name: Geräusch Detektor

  on_boot:
    priority: -100
    then:
      - delay: 1s
      - lambda: id(geraeusch_raw).publish_state(true);
      - delay: 1s
      - lambda: id(geraeusch_raw).publish_state(false);

esp8266:
  board: esp01_1m  # ESP8266-01 mit 1MB Flash

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  min_auth_mode: WPA2

logger:

api:
  encryption:
    key: "/2T3uEG/myrLB238isK3i+TxsyN+LZwwwp6X94x1MM8="

ota:
  - platform: esphome
    password: "10cab680eff476760fd6f81885168774"

# --- GPIO-Sensor für Geräusch ---
binary_sensor:
  - platform: gpio
    id: geraeusch_raw
    name: "Geräusch Rohsignal"
    internal: true 
    pin:
      number: GPIO0     # nur GPIO0 oder GPIO2 verfügbar auf ESP8266-01
      mode: INPUT_PULLUP
    device_class: sound

  - platform: template
    id: geraeusch_erkannt
    name: "Geräusch erkannt"
    device_class: sound

# --- Globale Zähler ---
globals:
  - id: signal_high_count
    type: int
    restore_value: no
  - id: signal_total_count
    type: int
    restore_value: no

# --- Einstellbare Parameter über Home Assistant ---
number:
  - platform: template
    name: "Fenster(ms)"
    id: window_size
    min_value: 100
    max_value: 2000
    step: 50
    unit_of_measurement: "ms"
    initial_value: 500
    optimistic: true

  - platform: template
    name: "Schwelle(%)"
    id: duty_threshold
    min_value: 0.05
    max_value: 1.0
    step: 0.05
    initial_value: 0.25
    optimistic: true

# --- Intervalle für Duty-Cycle-Berechnung ---
interval:
  - interval: 10ms
    then:
      - lambda: |-
          id(signal_total_count)++;
          if (id(geraeusch_raw).state) {
              id(signal_high_count)++;
          }

  - interval: 10ms
    then:
      - lambda: |-
          static float elapsed = 0.0;
          elapsed += 0.01; // 10ms Schritt

          if (elapsed * 1000 >= id(window_size).state) {
              float duty = (float)id(signal_high_count) / (float)id(signal_total_count);

              if (duty >= id(duty_threshold).state) {
                  if (!id(geraeusch_erkannt).state) {
                      id(geraeusch_erkannt).publish_state(true);
                  }
              } else {
                  if (id(geraeusch_erkannt).state) {
                      id(geraeusch_erkannt).publish_state(false);
                  }
              }

              // Zähler zurücksetzen
              id(signal_high_count) = 0;
              id(signal_total_count) = 0;
              elapsed = 0.0;
          }

Im Home Assistant hat man nun die Möglichkeit die Werte für „Fenster“ und „Schwelle“ entsprechend anzupassen!

Viel Spaß beim Testen und Ausprobieren und vielleicht findet der eine oder andere eine sinnvolle Verwendung dafür!

Falls Ihr es benutzt könnt Ihr hier ja mal einen kurzen Kommentar hinterlassen!

7 „Gefällt mir“

Ja cool, vielen Dank für die ausführliche Beschreibung!
Ich habe allerdings die analogen Aus- und Eingänge verwendet, als A0 vom Ky-037 an A0 vom ESP8266.
Dann wird es vermutlich nicht funktionieren, oder?

Nein wahrscheinlich nicht!
Ich verwende da ja einen etwas anderen Ansatz.
Vorteil:
Dadurch das ich den „Digitalausgang“ verwende kann ich durch die Feineinstellung des KY-037 etwas „vor selektieren“ und alles unter dem eingestellten Pegel schon mal aussen vor lassen!

Brauchst das ja bei Dir halt nur umswitchen!?

Danke Dir, genau das mache ich wenn ich wieder vor Ort bin.
Das dauert zwar noch 3 Monate, aber ich gebe Dir dann gern Feedback. :+1:

Wunderbar!!

Genau das stand auch noch auf meiner Liste aber ich habe es immer nach hinten verschoben.

30 min. später alles aufgebaut, getestet und für SEHR GUT befunden.

Danke

1 „Gefällt mir“

Angesteckt :nerd_face:
und sehr gute Erklärung :+1:

Daher gerade ein KY-037 Mikrofonmodul bestellt, brauchte eh noch DS18B20 (viele hier im Einsatz und noch keinen Ausfall)

1 „Gefällt mir“

Lieferung ist gerade eingetroffen :grinning:
Habe den KY-037 mit D0 an einen meiner ESP32C3 an GPIO10
Code eingefügt und geflasht
Funktioniert erst mal reibungslos und wird jetzt getestet
Danke

Hey, wie war das mit den Kanonen und den Spatzen!? :wink:

Have fun!

1 „Gefällt mir“

Habe nur solche hier :grin:
Hätte noch C5 oder S3, das wäre dann Overkill :sunglasses:

Die Seeed Studio XIAO ESP32C3 haben eine Externe Antenne und haben hervorragendem Empfang, kann diese uneingeschränkt empfehlen

Ja, habe ich auch schon verbaut! Sind zwar nicht ganz „billig“ aber dafür „grundsolide“ in der Funktion!
Man soll bekannter weise nicht an der falschen Stelle sparen! :+1:

1 „Gefällt mir“

Falls Jemand ein Problem hat mit dem Binary Sensor hat :kissing_smiling_eyes:

Dann mal am Poti nach rechts drehen bis die LED an ist und dann ist der Status wieder verfügbar

Hatte versucht zusätzlich den Analog Ausgang mit einzubinden und dann habe ich eine Weile gebraucht bis der eigentliche Binary Sensor wieder funktioniert

Habe eine Lösung für mein Problem beim Booten gefunden
Dein Code erweitern mit:

esphome:
  name: geraeusch-detektor
  friendly_name: Geräusch Detektor

  on_boot:
    priority: -100
    then:
      - delay: 1s
      - lambda: id(geraeusch_raw).publish_state(true);
      - delay: 1s
      - lambda: id(geraeusch_raw).publish_state(false);
1 „Gefällt mir“

Vielen Dank für deine Erweiterung! Habe das oben im Code mit eingeflegt!

Kurze Erklärung zum Code:

Am Ende des Bootvorgangs wird der Status für „geraeusch_raw“ auf TRUE und wieder zurück auf FALSE gesetzt!

Damit wird ein „stabiler klar definierter Ausgangswert“ gesetzt
→ quasi eine Art Initialisierung !

1 „Gefällt mir“