Schallsensor am Arduino – Geräusch als Auslöser

In diesem Beispiel soll ein Mikrofon (Schallsensor) verwendet werden, um bei ansteigender Lautstärke etwas auszulösen. In diesem Aufbau lediglich eine LED auf dem Board und einer auf dem Steckbrett.

Es gibt unterschiedliche Module um Schallsignale zu erfassen.
Hier zum Beispiel der KY-037 und der KY-038.

KY-037 KY-038

Beide sind Module zur Erfassung von Ton- oder Schallsignalen, jedoch unterscheiden sie sich in ihren spezifischen Eigenschaften und Anwendungen. Hier sind die Hauptunterschiede zwischen diesen beiden Modulen:

  • Mikrofon-Typ:
    • KY-037: Das KY-037-Modul verwendet ein analoges Mikrofon, um Schallsignale zu erfassen. Es liefert ein analoges Audiosignal als Ausgabe.
    • KY-038: Das KY-038-Modul verwendet ein digitales Mikrofon oder einen Schallsensor, um Schallsignale zu erfassen.
  • Ausgangssignal:
    • KY-037: Liefert ein analoges Ausgangssignal, das die Lautstärke des erfassten Tons in einer kontinuierlichen Spannung repräsentiert.
    • KY-038: Liefert ein digitales Ausgangssignal, das in der Regel „HIGH“ ist, wenn ein Ton erkannt wird, und „LOW“, wenn kein Ton erkannt wird.
  • Anwendungen:
    • KY-037: Aufgrund seines analogen Ausgangs eignet sich dieses Modul gut für Anwendungen, bei denen Sie die Lautstärke oder Frequenz des Tons analysieren oder verarbeiten möchten. Es kann in Audioverarbeitungsprojekten verwendet werden.
    • KY-038: Aufgrund seines digitalen Ausgangs eignet sich dieses Modul gut für einfache Schall- oder Geräuscherkennungsprojekte, wie das Auslösen einer Aktion, wenn ein bestimmter Schwellenwert an Lautstärke überschritten wird.
  • Empfindlichkeit:
    • Die Empfindlichkeit kann je nach Modell und Hersteller variieren. Bei den mir vorliegenden Modul ist diese an einem blauen digitalen Potentiometer einstellbar.
  • Stromversorgung:
    • Beide Module benötigen eine Spannungsversorgung, normalerweise 3,3 V oder 5 V. Wie immer dem Datenblatt des Herstellers entnehmen

In diesem Anwendungsbeispiel verwende ich den KY-038 am Uno R3:

Verdrahtung:

Hardware:
Microphone Sound Sensor Module

Quellcode für KY-038:

Einfache Lösung:

int ledPin = 13;  // Pin für die LED
int micPin = 4;   // Pin für den Schallsensor
boolean wert = 0; // Variable für den Sensorwert

void setup() {
  pinMode(ledPin, OUTPUT); // Pin-Modus für die LED setzen
  pinMode(micPin, INPUT);  // Pin-Modus für den Schallsensor setzen
}

void loop() {
  wert = digitalRead(micPin); // Sensorwert lesen
  if (wert == HIGH) {         // Wenn ein Ton erkannt wird
    digitalWrite(ledPin, HIGH); // LED einschalten
    delay(1000);               // LED eine Sekunde leuchten lassen
    digitalWrite(ledPin, LOW); // LED ausschalten
  }
}

Nun sollte beim Klatschen die rote LED angehen.
Sollte es nicht wie erwarten funktionieren, das KY-038-Sensormodul hat ein Potentiometer (blaues Rädchen), mit dem die Empfindlichkeit angepasst werden kann. Versuch mal, die Empfindlichkeit zu verändern. Bei mir wurde es im Uhrzeiger Sinn empfindlicher.


Mit Zeitstempel und Textausgabe im Seriellen Monitor:

int ledPin = 13;  // Pin für die LED
int micPin = 4;   // Pin für den Schallsensor
int wert = 0;     // Variable für den Sensorwert
unsigned long previousMillis = 0; // Variable für die Zeitmessung der seriellen Ausgabe
unsigned long ledMillis = 0;      // Variable für die Zeitmessung der LED
const long interval = 200;        // Intervall für die serielle Ausgabe (200 ms)
const long ledDuration = 3000;    // Dauer, für die die LED leuchten soll (3000 ms)
bool ledState = LOW;              // Zustand der LED

void setup() {
  pinMode(ledPin, OUTPUT); // Pin-Modus für die LED setzen
  pinMode(micPin, INPUT);  // Pin-Modus für den Schallsensor setzen
  Serial.begin(9600);      // Serielle Kommunikation starten
}

void loop() {
  unsigned long currentMillis = millis();
  wert = digitalRead(micPin); // Sensorwert lesen

  // Sensorwert im Seriellen Monitor ausgeben, falls das Intervall überschritten ist
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Serial.println(wert);
  }

  // Wenn ein Ton erkannt wird und die LED aus ist, LED einschalten und Zeit speichern
  if (wert == HIGH && ledState == LOW) {
    ledState = HIGH;
    digitalWrite(ledPin, HIGH); // LED einschalten
    Serial.print("Ich habe dich nach "); 
    Serial.print(currentMillis); 
    Serial.println(" ms gehört"); 
    ledMillis = currentMillis;  // Startzeit speichern
  }

  // Überprüfen, ob die LED eingeschaltet bleibt
  if (ledState == HIGH) {
    if (currentMillis - ledMillis >= ledDuration) {
      ledState = LOW;
      digitalWrite(ledPin, LOW); // LED ausschalten
    }
  }
}

Nach dem Hochladen wird bei ansteigender Lautstärke, wie klatschen, rufen, singen 🙂 usw. die LED eingeschaltet. Zum Testen ist das „delay“ derzeit auf 3 Sekunde Pause gestellt damit die LED einen Augenblick an bleibt. Im seriellen Monitor kann man sehen wenn ein Klatschen erkannt wurde.

Warum wird die Serielle Monitorausgabe nicht von der Delay pause beeinflusst?

Das liegt daran, dass die serielle Ausgabe und die LED-Steuerung in der Schleife loop() unabhängig voneinander ablaufen.

In der loop()-Funktion wird der Zustand des Mikrofonsensors regelmäßig geprüft und es wird wie gewünscht dieser Zustand alle 200 Millisekunden im Seriellen Monitor ausgegeben. Die Zeitmessung dafür wird durch die millis()-Funktion gesteuert, die die Anzahl der Millisekunden seit dem Start des Arduino-Boards zurückgibt.

Wenn ein Ton erkannt wird (wert == HIGH), schalten es die LED ein und verwenden delay(3000);, um die LED für drei Sekunde leuchten zu lassen. Während dieser Zeit pausiert die Schleife und wartet, bis drei Sekunden vorbei sind. Da die serielle Ausgabe auf einem separaten Zeitintervall (200 Millisekunden) basiert, wird der aktuelle Sensorwert weiterhin im Seriellen Monitor ausgegeben, sobald das Intervall erreicht ist, unabhängig von der Pause durch delay(3000);.

, , ,
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzerkomfort bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst und hilft uns zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.