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.
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);
.
