Klatschschalter mit Mikrofon Sound Sensor Modul am Multi Function Shield
Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.In meiner 37-in-one-Sensoren-Bulk-Sammlung finden sich auch zwei Module mit einem Mikrofon, mit dem wir z. B. einen Klatschschalter realisieren können.
Hardware: Mikrofon Sound Sensor Modul KY-037

Bei den beiden auf dem Foto abgebildeten Modulen handelt sich einmal um die linke Variante Modul KY-037 mit einem etwas größeren Mikrofon und zum Zweiten um die rechte Variante Modul KY-038 mit einem kleinen Mikrofon.
Vom Aufbau und der Funktionsweise unterscheiden sich beide ansonsten nicht sonderlich, die Version mit dem größeren Mikrofon dürfte ein wenig empfindlicher sein, was aber nicht weiter ins Gewicht fällt.
Beide Module haben die gleiche Anschlussbelegung: (von oben nach unten, Vorderseite oben, Pins rechts):
- AO = Analog Out (kommt an Pin A5 am MFS)
- G = GND
- + = +5V
- DO = Digital Out (kommt an Pin ~5 am MFS)
Das Einstellen des Poti erfordert ein klein wenig Geduld, denn es nur ein kleiner Bereich in den großen Einstellbereich des Potis, der nützlich ist; und zwar genau der an der Schwelle, bei der die LED an bzw. ausgeht. Ist dieser Bereich gefunden, wird das Poti langsam drehend so eingestellt, dass die kleine LED nur bei lauten Geräuschen wie Klatschen aufleuchtet und ansonsten ausbleibt.

Über den analogen Anschluss A0 wird die Lautstärke des Schalls, der am Mikrofon ankommt, als Spannungspegel weitergegeben und kann über den Serial Plotter in der Arduino IDE ausgegeben werden. Rechts die Momentaufnahmes eines "in die Hände Klatschens". Man sieht gut, wie der Normalpegel um 500 um bis zu 50 Einheiten ausschlägt, als das Klatschen beginnt, um dann schnell wieder zu verhallen.
Natürlich könnte man auch das analoge Signal auswerten, es ist aber bequemer, das digitale zu nehmen, da dieses von außen durch das Poti beeinflusst werden kann, ohne jedesmal die Firmware auf neue Bedingungen wie z. B. einen wechselnden Standort, anzupassen.

Als Anwendungsbeispiel wollen wir einen klassischen Klatschschalter realsieren. Der funktioniert so: wenn man zweimal kurz hintereinander (innerhalb einer halben Sekunde) in die Hände klatscht, dann wird dies registriert und eine Aktion erfolgt. Im Programm werden die beiden unteren LEDs eingeschalten, die auch im weitere Verlauf als Kennzeichen anbleiben. Außerdem wird die boolsche Variable doubleClap auf True gesetzt. Im weiteren Programmverlauf könnte man dies jetzt auswerten und z. B. mit einem zusätzlichen angeschlossenen Relais eine Lampe ein- aus ausschalten. So muss man dann z. B. beim zu Bett gehen nicht noch einmal aufstehen, sondern erledigt das Licht ausschalten im Liegen.
Ist das Poti richtig eingestellt, so wird jedes Klatschen mit einem kurzen Aufblitzen der LED 1 auf dem Multi Function Shield und der LED L2 auf dem Modul selbst angezeigt. Außerdem wird der Zähler, den die 7-Segment-Anzeige ausgibt mit jedem Klatschen erhöht. Erfolgt nach einem Klatschen gleich noch ein weiteres, so gilt das als Doppelklatschen und wird durch die beiden unteren LEDs und ein kurzes Piepen angezeigt. Außerdem wird die Variable doubleClap auf True gesetzt.
Mit einem Druck auf S1 auf dem MFS kann man den Zähler und die Zustände auf Null stellen.
Hier eine kleine Demonstration des Programmes als Video:

Source-Code
////////////////////////////////////////////////////////
// (C) 2019 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
////////////////////////////////////////////////////////
#include <TimerOne.h> // für Timings und Interrupts
#include <MultiFuncShield.h> // API für das Multi Function Shield
#define PinData 5 // wo ist Digital Out angeschlossen?
#define PinAnalog A5 // wo ist Analog Out angeschlossen?
void setup() {
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multi-function shield library
pinMode (PinData, INPUT_PULLUP);
Serial.begin (115200);
}
void loop() {
MFS.beep(1, 5, 2); // bereit
byte state;
int ana=0;
long lastClap=0;
int claps=0;
boolean doubleClap=false;
int range=25;
while (1) {
if (MFS.getButton() == BUTTON_1_PRESSED) { // zurücksetzen mit S1
MFS.beep(1, 5, 2);
claps=0;
doubleClap=false;
MFS.write (claps);
MFS.writeLeds(LED_1, OFF);
MFS.writeLeds(LED_3, (doubleClap==true));
MFS.writeLeds(LED_4, (doubleClap==true));
}
state=digitalRead(PinData);
ana=1023-analogRead(PinAnalog);
Serial.println(ana);
if (state == HIGH) { // Geräusch liegt vor
claps++;
MFS.writeLeds(LED_1, ON);
if (millis()-lastClap < 500) {
doubleClap=true;
MFS.beep(10);
}
MFS.writeLeds(LED_3, (doubleClap==true));
MFS.writeLeds(LED_4, (doubleClap==true));
MFS.write (claps);
delay(20); // Klatschen ausklingen lassen, evtl. erhöhen
lastClap=millis();
}
MFS.writeLeds(LED_1, OFF);
delay(1);
} //end while 1
} //end loop()