Heute 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:
- 1x Arduino Nano v 3.0 (ATmega 328)
- 1x Arduino Sound Sensor / LM393
- 1x Arduino Relay Board
- Diverse Kabel/Steckbrücken aus der Bastelkiste z.B.:
An Werkzeugen kommt ihr mit folgendem aus:
- Seitenschneider
- Lötkolben
- Messer
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.)
Bevor 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
Nun, 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.
Die 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!
I’ll gear this review to 2 types of people: current Zune owners who are considering an upgrade, and people trying to decide between a Zune and an iPod. (There are other players worth considering out there, like the Sony Walkman X, but I hope this gives you enough info to make an informed decision of the Zune vs players other than the iPod line as well.)
Das ist ein tolles Projekt! Ich finde die Idee sehr praktisch und die Umsetzung gut erklärt. Danke fürs Teilen, ich werde es definitiv ausprobieren!
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’
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.
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
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.?
Sorry ich meinte das Schloss hier :https://www.roboter-bausatz.de/530/elektronisches-tuerschloss-12v-fuer-schubladen/tueren-etc.-arduino-rfid
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
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!
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.
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
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?
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.)
Perfekt;) Das war die Lösung. Danke dir=)
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!
Alles klar! Vielen Dank! :)
Das deprimiert hat sich da via Auto Korrektur eingeschlichen. Sorry
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
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
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!
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! :-)
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;
}
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.
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.
Hallo Katja,
dazu brauchst du die Arduino IDE. Schau dir einfach diese kurzen Videos auf Youtube an. Dort wird der Einstieg recht gut erklärt.
https://www.youtube.com/watch?v=avOZaRoKVgg&list=PLAB63281B90FB376E&index=1
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!
Sehr nett. Da wird auch mein Nerdherz erwärmt ;)
Super Beschreibung. Das baue ich mir auf jeden Fall nach.
Danke und Gruß
Paul
Same here!
Faulheit kann schon ein großer Motivator sein ;)
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ß:-)
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.
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.