Lampe per Klatschen an- und ausschalten mit dem Arduino

Arduino KlatschschalterHeute gibt es mal wieder ein kleines Arduino Bastelprojekt. Diesmal frei nach dem Motto: “Gleich klatscht es, aber keinen Beifall!” Denn wenn es heute klatscht, dann sollte am Ende des Artikels eine Lampe an- bzw. ausgehen.

Das Projekt entstand aus der (vermutlich Informatiker-spezifischen) “Notlage”, in der ich mich seit einiger Zeit befand und die wie folgt aussah: Man will abends ins Bett, muss jedoch als Erstes das Schlazimmer-Licht anmachen, um den Schalter der Nachttischlampe zu finden. Daraufhin schaltet man die Nachttischlampe an und läuft wieder zur Tür, um das Schlafzimmerlicht wieder auszuschalten. Ihr merkt schon, das Schlafzimmer-Licht ist eigentlich nur ein Mittel zum Zweck.

Als findiger Informatiker und Bastler verspürt man da doch den unbändigen Drang, den Prozess “Licht an” zu optimieren und so entstand folgende kleine Optimierung an meiner Nachttischlampe.

Nun kann ich direkt beim Betreten des Schlafzimmers die Nachttischlampe mittels zweifachem Klatschen anschalten und spare mir somit den unnötigen Gang zum Bett und vom Bett wieder zurück, um das Schlafzimmer-Licht auszuschalten. Das klingt jetzt vielleicht nach gnadenloser Faulheit und ich sehe auch schon die Ersten von euch die Hände über dem Kopf zusammenschlagen, jedoch geht es hierbei primär um die Bastelei, die mein Nerd-Herz erwärmt.

Klatschalter im Eigenbau – Was braucht man dafür?

Um nun selbst solch eine Konstruktion zu bauen, benötigen wir nur eine Handvoll (relativ) günstiger Komponenten. Für meinen Aufbau habe ich mich folgender Teile bedient:

An Werkzeugen kommt ihr mit folgendem aus:

Summa summarum macht das rund 22€ für die Bauteile (exklsive Werkzeuge) und ist somit knapp 14€ teurer als der Fertig-Klatschschalter von Amazon für ~8€. Wer jedoch auch 1-2 Monate auf die Teile warten kann, der bestellt sie bei eBay direkt aus China und kommt dann auf rund 10€ für alles zusammen, womit wir wieder auf den gleichen Preis wie die Fertiglösung kommen.

Mal ganz davon abgesehen, geht es hier ja sowieso primär um den Spaß an der Bastelei statt darum, ein möglichst günstiges Produkt zu schaffen.

Aufbau und Verkabelung des Arduino für den Klatschsensor

Haben wir alle Teile beisammen, kann es mit dem Aufbau losgehen. Aufgrund der geringen Komponentenanzahl hält sich der Kabelsalat in Grenzen. (Kein Vergleich zu meinem Arduino-Webradio.)

Schaltplan Arduino KlatschschalterBevor es losgeht noch schnell ein bisschen Theorie bzw. ein paar Worte zur Funktionsweise. Der Arduino soll über den angeschlossenen “Soundsensor” durchgehend lauschen, ob ein besonders hoher Lautstärkepegel vorliegt. Dieser Pegel wird durch das Klatschen erzeugt. Kommt dieser besonders hohe Pegel 2 mal in einem bestimmten Zeitabstand vor, so schaltet der Arduino ein Relay, welches wiederum die angeschlossene Nachttischlampe durchschaltet. Bedingt durch das Relay und den Optokoppler auf dem Relay-Board erreichen wir zudem eine Galvanische Trennung zwischen Mikrokontroller-Ebene und Nachttischlampe.

Mehr zur Programmlogik folgt in einem späteren Abschnitt des Artikels. Nun geht es erst einmal an die Verkabelung. Das nachfolgende Bild sowie die Zuweisungs-Tabelle sollten eigentlich selbsterklärend sein. Wenn ihr dennoch Fragen zur Verkabelung habt, lasst es mich in den Kommentaren wissen.

Arduino Nano Sound Sensor
5V +5V
D3 OUT
GND GND
Arduino Nano Relay Modul
5V VCC
GND GND
D4 IN2

Programmierung der Klatscherkennung

Arduino Klatschsensor ProgrammablaufplanNun, da alle Kabel sitzen und der Lötkolben abkühlen sollte, kommen wir zur Programmierung. Ein paar grundlegende Gedanken haben wir uns eingangs ja schon gemacht. Das Programm soll also folgende Aufgaben erfüllen: Sensor auslesen, um festzustellen, ob geklatscht wurde. Klatschen vermerken und abspeichern und wenn zweimal geklatscht wurde, das Licht an- bzw. ausschalten. Um das Ganze zu visualisieren, habe ich einen kleinen Programmablaufplan dafür entworfen, den ihr auf der linken Seite sehen könnt.

Einen kleinen Kniff gibt es an dem eigentlich simplen Ablauf dennoch. Wenn der Soundsensor ein Geräusch erkennt, dass lauter als ein voreingestellter Pegel ist, dann vermeldet er beim Auslesen eine 0. Wenn ich jetzt also 1 Sekunde lang schreie, dann löst der Sensor auch mindestens zwei Mal aus, sodass das Licht angehen würde. Wie können wir also unterscheiden, ob jemand zweimal geklatscht hat und nicht der Nachbar mal wieder staubsaugt?

Um dieses Problem zu klären, schauen wir uns doch einfach einmal an, was ein Mikrofon aufnimmt, wenn wir klatschen. Hierzu habe ich mit der Freeware Audacity zwei Aufnahmen gemacht, während der ich jeweils zweimal geklatscht habe. Einmal schneller, einmal langsamer. Schließlich klatschen wir in der Praxis ja nicht immer exakt im gleichen Tempo.

Audio Analyse klatschen - AuswertungDie Aufnahmen in Audacity betrachten wir nun etwas genauer. Anhand des Ausschlags des Pegels können wir erkennen, wie lange ein “Klatscher” dauert und wie viel Zeit vergeht, bis zweimal geklatscht wurde. (Zur Verdeutlichung dient auch nebenstehendes Bild.)

Wir können erkennen, dass das schnelle zweimalige Klatschen rund 170 ms dauert und das langsame 340 ms. Rechnen wir nun noch etwas Toleranz mit ein, können wir behaupten, dass unser “Doppel-Klatscher” innerhalb von 400 ms abgehandelt ist. Dies nehmen wir nun als Sequenzlänge für obigen Ablaufplan. Wir zählen also 400 ms lang alle Peeks (Laustärke-Spitzen / Auslösungen) und schauen dann, ob genau zwei Mal ausgelöst wurde. Wenn unser Nachbar nun staubsaugen würde, dann wäre die Anzahl der Auslösungen auf die Sequenz betrachtet wesentlich höher. So können wir also unterscheiden, ob zweimal geklatscht (geklopft, gepfiffen, geschrien) wurde oder ob irgendeine andere Lärmquelle ausgelöst hat.

Der Quellcode

Nachdem wir nun den Aufbau sowie die Logik hinter der Programmierung behandelt haben, bleibt nur noch der Quellcode offen. Dieser sollte nun eigentlich selbsterklärend sein. Wenn doch noch Fragen zum Quellcode bestehen, schreibt einfach einen Kommentar unter diesen Artikel.

int soundSensor = 3;
int relay = 4;
int claps = 0;
long detectionSpanInitial = 0;
long detectionSpan = 0;
boolean lightState = false;

void setup() {
  pinMode(soundSensor, INPUT);
  pinMode(relay, OUTPUT);
}

void loop() {

  int sensorState = digitalRead(soundSensor);

  if (sensorState == 0)
  {
    if (claps == 0)
    {
      detectionSpanInitial = detectionSpan = millis();
      claps++;
    }
    else if (claps > 0 && millis()-detectionSpan >= 50)
    {
      detectionSpan = millis();
      claps++;
    }
  }

  if (millis()-detectionSpanInitial >= 400)
  {
    if (claps == 2)
    {
      if (!lightState)
        {
          lightState = true;
          digitalWrite(relay, HIGH);
        }
        else if (lightState)
        {
          lightState = false;
          digitalWrite(relay, LOW);
        }
    }
    claps = 0;
  }
}

Fazit

Nun ist der Artikel doch etwas länger geworden als gedacht. Dennoch ist der technische Aufbau als auch der Quellcode recht übersichtlich, sodass man wohl gut behaupten kann, dass es ohne großen Aufwand möglich ist, eine beliebige Lampe mit einer “Klatschfunktion” zu erweitern.

Was haltet ihr von dem Projekt? Habt ihr Fragen, Kritik oder Verbesserungsvorschläge? Lasst es mich wissen!

41 Kommentare

  1. Markussays:

    Hi,
    ich bekomme eine Fehlermeldung ” Arduino: 1.8.8 (Windows Store 1.8.19.0) (Windows 10), Board: “Arduino/Genuino Uno”

    D:\Dokumente\Arduino\sketch_klatschen\sketch_klatschen.ino: In function ‘void loop()’:

    sketch_klatschen:24:8: error: ‘else’ without a previous ‘if’

    else if (claps > 0 && millis()-detectionSpan >= 50)

    ^

    D:\Dokumente\Arduino\sketch_klatschen\sketch_klatschen.ino: At global scope:

    sketch_klatschen:48:9: error: expected declaration before ‘}’ token

    }

    ^

    exit status 1
    ‘else’ without a previous ‘if’

  2. Sörensays:

    Hallo Raffi,

    Super Tutorial, vielen Dank!
    Wie hast du den Nano mit Strom versorgt? Benutzt man bei solchen Projekten am besten Batterien/Akkus oder ein Netzteil?
    Vielen Dank im vorraus.

    Freundliche Grüße Sören

    • Habe ein Ladegerät von einem alten Smartphone genommen. Steckdose musste für die Lampe ja eh in der Nähe sein und so spar ich mir das Batterien wechseln.

    • Christiansays:

      Hallo Raffael,
      ich möchte gerne ein Babyphone, ohne Strahlung bauen und da ist mir die Idee gekommen, es so wie Du mit Deiner Klatschlampe, zu machen.
      Also Sensor beim Baby, Empfänger, kabelgebunden, bei den Eltern und das ganze natürlich mittels Geräusch vom Baby steuerbar.
      Da ich jedoch echt keinen Plan habe, wie man so etwas bauen könnte, würde ich mich freuen, wenn Du einen Plan für ein solches Gerät entwerfen könntest.

      Ich kann mir auch vorstellen, dass viele Eltern ihre Babys strahlungsfrei betreuen wollen. Vielleicht ist das auch eine Marktlücke?

      LG Christian

  3. Danielsays:

    Hallo,
    also ich bin auch komplett neu was Arduino betrifft. Ich hätte mal eine Frage und zwar möchte ich einen Geocache bauen der mittels klatschen entweder eine Lampe zum Glühen bringen soll oder aber einen Schließmechanismus öffnen und schließen soll. Jetzt wäre meine Frage ob man da die Strromquelle durch einen Batterie Slot tauschen kann und als Lampe zb. eine Fahrradrückleuchte nehmen könnte. Oder ansatt einer Lampe ein Schließmechanismus zb. ein 9V Schloss sowas zb. https://www.google.de/search?q=9v+schloss&client=firefox-b-ab&source=lnms&tbm=isch&sa=X&ved=0ahUKEwj6qeXezLHVAhVDa1AKHexyCzUQ_AUICygC&biw=1407&bih=710#imgrc=D2uwe1b8JVHNvM: verwenden kann.?

  4. Janik mettesays:

    Hallo zusammen

    Bin auch relativ neu auf dem Gebiet und wollte fragen ob ich den code einfach nur kopieren. Und in der Arduino ware einfügen muss oder muss ich da etwas beachten

  5. Veto4BRssssays:

    Habe alles nach Plan aufgebaut, aber es reagiert nicht auf klatschen. LEDs von Relay, Arduino und Sound Sensor leuchten alle. Wenn ich den Code hochlade, hört mein das Klacken des Relays und die Lampe brennt. Jedoch reagiert es dann nicht. Habe auch schon mit dem Potentiometer gespielt, aber das hilf auch nichts. Jemand eine Idee woran das liegen könnte?
    Danke schon mal im Voraus!

  6. Niklassays:

    Sind alle Kabel die man benötigt schon oben mit angegeben oder benötigt man da noch mehr?

    • Ein paar Kabel zum Verbinden brauchst du schon. Aber die habe ich oben als vierten Punkt in der Teileliste verlinkt.

  7. Valentinsays:

    Guten Abend

    Ich habe eine Frage bezüglich der Andruino Klatschschaltung. Ich möchte gerne als Lampe einen LED Streifen verwenden, und die ganze Schaltung mittels Stromkabel an das Stromnetz anschließen. Meine Frage wäre jetzt: Kann ich die einzelnen Kabel dann einfach miteinander verlöten oder brauche ich da zusätzliche Adapter oder vergleichbares? Könntest du mir auch eventuell Bilder liefern?
    Ich hoffe du kannst mir weiterhelfen.

    Vielen Dank im Voraus!

    Valentin

    • Janik Mettesays:

      Hallo valentin ich habe es auch mit einem led streifen nachgebaut,
      das klappt einwandfrei
      (bzw das zsm löten)
      jedoch sitze ich seit 3 stunden vor meinem rechner und bekomme den quellcode nicht auf den arduino…
      bitte jemand helfen

      • Hallo Janik,

        woran genau harpert es denn? Wird der Arduino nicht in der Arduino IDE angezeigt? Hast du den richtigen Port in der Arduino IDE ausgewählt? Hast du den richtigen “Board-Typ” in der IDE ausgewählt? Gibt es eine Fehlermeldung?

  8. Julian L.says:

    Hey, habe alles zusammengebastelt und Code aufgespielt. Reagiert jedoch sehr schlecht auf das Klatschen funktioniert nur ab und zu und dann nicht nach jedem 2 Klatschen. Kann das am Code liegen? Wenn ja wie könnte man diesen noch optimieren? MfG Julian

    • Hallo Julian,

      hast du schon versucht die Empfindlichkeit am Potentiometer des Soundsensors nachzuregeln? (Am Soundsensor sollte ein kleines Drehrad oder eine “Schraube” sein, mit der sich die Empfindlichkeit einstellen lässt. Hier vorsichtig nachregeln. Manchmal reicht schon eine Achtel-Drehung. Zwischendurch immer mal klatschen. Wenn das Klatschen erkannt wird, leuchtet eine LED am Soundsensor. So kann man den Sensor einpegeln und den eigenen Bedürfnissen anpassen.)

  9. Christopher H.says:

    Hallo zusammen!
    Ich bin ein Neuling auf dem Gebiet des Bastelns und der Informatik, würde die Lampe aber auch sehr gerne nachbauen!
    Die Bauteile habe ich alle schon besorgt.
    Meine Frage wäre:
    Muss ich noch irgendwelche Vorwiderstände oder der gleichen einbauen, dass die Lampe funktioniert oder reicht es, die Teile so wie es die Grafik beschreibt zu verbinden?
    Über eine Antwort würde ich mich sehr freuen!

    Christopher

    • Die Verkabelung kannst du 1-zu-1 übernehmen. Das Relay kann ohne weitere Widerstände vom Arduino gesteuert werden, da die nötigen Bauteile (wie z.B. Optokoppler) direkt auf der Relay-Platine verbaut sind.

      Den Verbraucher kannst du ebenfalls direkt ans Relay anschließen, da das Relay nichts anderes als ein Schalter ist. Aber denk dran – der Verbraucher hat vermutlich 220V – achte darauf, dass die Kabel vollständig im Relay sind und suche dir zusätzlich ein gutes Gehäuse für das Relay, sodass niemand ausversehen an die Spannungsquelle fassen kann!

  10. Karlsays:

    Das deprimiert hat sich da via Auto Korrektur eingeschlichen. Sorry

  11. Karlsays:

    Hey, wenn ich den Code dann übertragen habe, kann ich das Board von der USB Schnittstelle trennen, so das der Code dann auf dem deprimiert gespeichert wird?Die spannungs Versorgung für den mikrocontroller muss dann über eine separate spannungsquelle erfolgen oder geschieht dies über den 230V Anschluss von dem Relais?

    Lg

    Karl

  12. Ottosays:

    Hallo,

    ich habe das mal kurz nachgebaut und es funktioniert so weit sehr gut. Danke für die Idee!

    Das Problem ist, daß der Sensor auch bei anderen Geräuschen (zb Husten, Klopfen etc) auslöst.
    Also so höchstens für das Schlafzimmer geeignet, oder? Hat jemand eine Lösung, wie man auch die spezifische Frequenz von Klatschen berücksichtigen kann, um Fehl-Auslösungen zu unterbinden?

    Cheers,

    Otto

    • Hallo Otto,

      wenn du “Klatschmuster” haben willst, dann musst du den Code in folgenem Bereich erweitern:
      ” else if (claps > 0 && millis()-detectionSpan >= 50) ”

      Hier müsstest du noch mehrere Zweige schaffen. Also z.B.:
      else if (claps == 1 && millis()-detectionSpan >= 50)
      else if (claps == 2 && millis()-detectionSpan >= 250)
      else if (claps == 3 && millis()-detectionSpan >= 50)

      So würde in etwa das Muster: Ton-Pause-Pause-Pause-Pause-Pause-Ton-Pause-Ton
      erkannt werden. Durch die erzwungene Pause würde 3 maliges schnelles Klatschen nicht klappen.

      • Hallo,
        …da ich jetzt auch nicht DER Experte bin – ich habe die einzelone Zeile gegen die 3 vorgeschlagenen ersetzt; und bekomme folgende Fehlermeldung beim Kompilieren:
        expected primary-expression before ‘else’
        Weiß da vielleicht jemand zu helfen?!
        Gruß Tom

  13. Dariosays:

    Hallo

    Hab für mein Schlafzimmer genau eine solche Lösung gesucht und dank deiner Seite bin ich nun stolzer Besitzer eines Arduino Nano. Hab alles nachgebaut, klappt wunderbar. Sensationell, wie einfach man das selber bauen kann, bin schwer beeindruckt. Allerdings nur eine Frage: Wenn ich den Arduino von der USB Schnittstelle trenne und danach wieder verbinde (Power on), schaltet das Relay direkt und die Lampe geht an. Wieso das?
    Später will ich alles in einen kleinen Klemmkasten mit Netzteil verbauen, auf der Oberseite mit einem GU10 Einbauspot und einem Batmanzeichen ;)
    Vielen Dank nochmals für den Code!

  14. Jonassays:

    ich hab jetzt kein arduino nano sondern nur ein arduino uno da. geht das mit dem dann trotzdem oder ist das nicht kompatibel?

    Danke schon mal für die antwort :)

    • Hallo Jonas,

      für dieses Tutorial kannst du ohne Probleme deinen Arduino Uno nehmen. Ich hab den Nano nur für dieses Tutorial vorgeschlagen, weil er kleiner und günstiger als der Uno ist.

    • Das klappt genauso! :-)

  15. Stephansays:

    Hi, erstmal Danke für deinen Code, der ist echt gut ausgedacht. Einen Verbesserungsvorschlag habe ich aber:
    Und zwar hast du keine maximale Zeitbegrenzung zur Auswertung der Akustik eingetragen.
    So kann es passieren, dass wenn zum Beispiel die Tür knallt und 10min nichts passiert und dann wieder irgendwas passiert, einfach die Lampe an oder ausgeht.
    Deswegen habe ich am Ende noch ein paar Zeilen hinzugefügt, so dass nach 1 Sekunde wieder auf 2 neue “Klatscher” gewartet wird. Simpel aber beugt Fehlern vor :).

    if (millis()-detectionSpanInitial >= 1000)
    {
    claps = 0;
    }

    • Jonassays:

      könntest du den kompletten code noch mal mit deiner korrektur hier rein schicken weil ich weis nicht genau wo ich das einfügen soll. wäre supernett. Danke

      • Hallo Jonas,

        ich hatte die Änderungen bereits in obigen Code übertragen (nur, dass ich den Wert von 1000 auf 400 geändert habe, da 400ms ausreichen, um doppelt zu klatschen). Es sollte also soweit alles klar sein.

  16. Katjasays:

    Hallo,

    ich bin noch sehr neu auf dem Gebiet und verstehe noch nicht ganz wie ich mein geschriebenen Code auf die Platte übertrage. Wie verbinde ich das mit meinem PC?

    Über eine Antwort würde ich mich sehr freuen. Vielen Dank.

  17. Willisays:

    Hab den Arduino erst seit zwei Wochen.Gestern ist der Soundsensor angekommen. Hat alles sofort mit deinem Code funktioniert. Allerdings habe ich das ganze mit einer Led ausprobiert. Macht Lust auf mehr…
    Danke für deine Seiten!

  18. Sehr nett. Da wird auch mein Nerdherz erwärmt ;)

  19. Paulsays:

    Super Beschreibung. Das baue ich mir auf jeden Fall nach.
    Danke und Gruß
    Paul

  20. Danke sehr für den Beitrag. Habe ich vorher noch viel nie davon gehört.
    Sehr guter Blog im Netzt,würde ich gerne mehr lesen.
    Lieben Gruß:-)

  21. Martinasays:

    Hi, danke für die gute Anleitung. Das ist perfekt für meine Nachttisch Lampe. Ich bin mal gespannt ob mein Mann es schafft das nach zu bauen.

  22. Cool, danke für die Anleitung. Solte mich irgendwann mal mit dem Arduino auseinandersetzen, bisher hat mir dazu immer die zeit gefehlt. Sieht aber schon verdammt interessant aus.

    Hab zwar Raspberry Pi’s, aber der Arduino scheint wirklich für einfache Aufgaben perfekt zu sein.

    Bekommt man den irgendwie ins Netzwerk integriert?

    Gruß

    Christoph

    • Hallo Christoph,

      die Arduinos bekommt man eigentlich alle ins Netz. Da gibt es diverse Möglichkeiten, die unterschiedlich teuer und einfach/schwer zu benutzen sind.

      Da wären zum einen das offizielle WLAN-Shield für rund 63€ (https://www.sparkfun.com/products/11287) oder das CC3000 basierte WLAN-Shield für rund 30€ (http://www.adafruit.com/products/1491). Mit denen hab ich jedoch noch nicht gearbeitet, weil sie mir im Verhältnis zu den Arduinos (2-10€) zu teuer waren.

      Dann gäbe es da noch das offizielle Ethernet-Shield für 34€ (https://www.sparkfun.com/products/9026) und meinen Favoriten die enc28j60 basierten Ethernet-Module, welche es ab 2,50€ (http://ebay.eu/1rmqhrI) auf eBay gibt. Damit kommst du für 2,50€ ins LAN. Wenns WLAN werden soll, klemmst du einfach einen billigen OpenWRT Router (z.B. TP-Link WR703N) dahinter.

      Wenn du mal Tipps, Hilfe oder Anleitungen brauchst, sag Bescheid. Ich hab schon das ein oder andere Arduino-Projekt hinter mir. Leider fehlt bisher die Muße und Zeit alles davon zu verbloggen.

Schreibe einen Kommentar zu Raffi Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Sie dient nur dem Spamschutz.