{"id":23,"date":"2015-06-15T21:22:01","date_gmt":"2015-06-15T21:22:01","guid":{"rendered":"http:\/\/madgyver.de\/?p=23"},"modified":"2024-02-08T09:23:18","modified_gmt":"2024-02-08T09:23:18","slug":"arduino-taster-abfragen-und-entprellen","status":"publish","type":"post","link":"https:\/\/madgyver.de\/de\/arduino-taster-abfragen-und-entprellen\/","title":{"rendered":"Taster abfragen und richtig entprellen"},"content":{"rendered":"<p>Wenn Sie einen Arduino mit einem Taster steuern m\u00f6chten, stehen Sie vor der Herausforderung, den Taster richtig abzufragen und zu entprellen. Das Anschlie\u00dfen eines Tasters an den Arduino ist zwar einfach, aber die korrekte Erfassung der Tastendr\u00fccke erfordert spezielle Ma\u00dfnahmen. In diesem Artikel werden wir Ihnen zeigen, wie Sie einen Taster mit dem Arduino verbinden und wie Sie Prellen effektiv verhindern k\u00f6nnen. Schauen wir uns gemeinsam an, wie Sie Ihren Arduino mithilfe eines Tasters steuern k\u00f6nnen.<\/p>\n<p>&nbsp;<\/p>\n<p>Beim Auslesen von Tastern kommt es h\u00e4ufig zu einem Ph\u00e4nomen dass sich Prellen nennt. Dieses Prellen kann zu unerw\u00fcnschten Effekten f\u00fchren, wie mehreren Ausl\u00f6sungen eines Tastendrucks oder ungenauen Eingaben. Bevor wir uns aber damit genauer besch\u00e4ftigen, lesen wir erst einmal einen Taster aus.<\/p>\n<p>Zum Gl\u00fcck ist das Anschlie\u00dfen eines Tasters sehr einfach, und die Arduino-IDE bietet sogar einen vorgefertigten Sketch, den Sie unter<\/p>\n<p><strong>Beispiele -&gt; 02.Digital -&gt; Taster<\/strong> finden k\u00f6nnen.<\/p>\n<p>&nbsp;<\/p>\n<p>Hier ist der Quellcode:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">\/*\r\nButton\r\n\r\nTurns on and off a light emitting diode(LED) connected to digital\r\npin 13, when pressing a pushbutton attached to pin 2.\r\n\r\nThe circuit:\r\n* LED attached from pin 13 to ground\r\n* pushbutton attached to pin 2 from +5V\r\n* 10K resistor attached to pin 2 from ground\r\n\r\n* Note: on most Arduinos there is already an LED on the board\r\nattached to pin 13.\r\n\r\ncreated 2005\r\nby DojoDave http:\/\/www.0j0.org\r\nmodified 30 Aug 2011\r\nby Tom Igoe\r\n\r\nThis example code is in the public domain.\r\n\r\nhttp:\/\/www.arduino.cc\/en\/Tutorial\/Button\r\n*\/\r\n\r\n\/\/ constants won't change. They're used here to\r\n\/\/ set pin numbers:\r\nconst int buttonPin = 2; \/\/ the number of the pushbutton pin\r\nconst int ledPin = 13; \/\/ the number of the LED pin\r\n\r\n\/\/ variables will change:\r\nint buttonState = 0; \/\/ variable for reading the pushbutton status\r\n\r\nvoid setup() {\r\n\/\/ initialize the LED pin as an output:\r\npinMode(ledPin, OUTPUT);\r\n\/\/ initialize the pushbutton pin as an input:\r\npinMode(buttonPin, INPUT);\r\n}\r\n\r\nvoid loop() {\r\n\/\/ read the state of the pushbutton value:\r\nbuttonState = digitalRead(buttonPin);\r\n\r\n\/\/ check if the pushbutton is pressed.\r\n\/\/ if it is, the buttonState is HIGH:\r\nif (buttonState == HIGH) {\r\n\/\/ turn LED on:\r\ndigitalWrite(ledPin, HIGH);\r\n}\r\nelse {\r\n\/\/ turn LED off:\r\ndigitalWrite(ledPin, LOW);\r\n}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Neben einem Arduino braucht man nat\u00fcrlich noch einen Taster\u00a0und einen Widerstand. Der Widerstand verbindet\u00a0<strong>Pin 2<\/strong>\u00a0mit\u00a0Masse und zieht die Spannung an dem Pin auf 0V.\u00a0\u00a0Wenn man den Taster bet\u00e4tigt wird der Pin an die Versorgungsspannung gelegt (5V) \u00a0und die Spannung am Pin steigt quasi sofort auf 5V. Diese Spannung\u00a0wird vom Arduino erkannt\u00a0und kann \u00fcber die Funktion\u00a0<em>digitalRead<\/em>\u00a0ausgelesen werden.<\/p>\n<p><a href=\"http:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-62\" src=\"http:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine-300x254.png\" alt=\"\" width=\"300\" height=\"254\" srcset=\"https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine-300x254.png 300w, https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine-768x650.png 768w, https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine-1024x866.png 1024w, https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster_Steckplatine.png 1755w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Zus\u00e4tzlich zum Arduino ben\u00f6tigen Sie einen Taster und einen Widerstand. Der Widerstand verbindet Pin 2 mit Masse und zieht die Spannung an dem Pin auf 0V. Wenn Sie den Taster bet\u00e4tigen, wird der Pin an die Versorgungsspannung (5V) gelegt und die Spannung am Pin steigt quasi sofort auf 5V. Diese Spannung wird vom Arduino erkannt und kann \u00fcber die Funktion digitalRead ausgelesen werden.<\/p>\n<p>Der Sketch setzt Pin 2 in den Inputmodus und Pin 13 in den Outputmodus. An Pin 2 befindet sich der Taster und an Pin 13 ist auf dem Arduino bereits eine LED eingebaut. In der Loop-Schleife wird kontinuierlich \u00fcber die Funktion digitalRead der Pin 2 \u00fcberpr\u00fcft. Die Variable buttonState wird dann auf 0 oder 1 gesetzt, je nachdem welchen Wert digitalRead zur\u00fcckgibt. Wenn die Variable auf 1 gesetzt wird, wird die LED eingeschaltet, ansonsten wird sie ausgeschaltet.<\/p>\n<p>Das funktioniert gut, aber es fehlt die M\u00f6glichkeit, zwischen An- und Aus-Zustand zu wechseln, wenn der Taster gedr\u00fcckt wird.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>Einzelne Tastendr\u00fccke<\/strong><\/h2>\n<p>Um zu \u00fcberpr\u00fcfen, ob der Taster bereits gedr\u00fcckt wurde, speichern wir dies in einer Variable. Hier ist ein Beispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">\/*\r\nButton\r\n\r\nTurns on and off a light emitting diode(LED) connected to digital\r\npin 13, when pressing a pushbutton attached to pin 2.\r\n\r\nThe circuit:\r\n* LED attached from pin 13 to ground\r\n* pushbutton attached to pin 2 from +5V\r\n* 10K resistor attached to pin 2 from ground\r\n\r\n* Note: on most Arduinos there is already an LED on the board\r\nattached to pin 13.\r\n\r\n*\/\r\n\r\n\/\/ constants won't change. They're used here to\r\n\/\/ set pin numbers:\r\nconst int buttonPin = 2; \/\/ the number of the pushbutton pin\r\nconst int ledPin = 13; \/\/ the number of the LED pin\r\n\r\n\/\/ variables will change:\r\nint buttonState = LOW; \/\/ variable for reading the pushbutton status\r\nint buttonread = 0;\r\n\r\nvoid setup() {\r\n\/\/ initialize the LED pin as an output:\r\npinMode(ledPin, OUTPUT);\r\n\/\/ initialize the pushbutton pin as an input:\r\npinMode(buttonPin, INPUT);\r\nSerial.begin(9600);\r\n}\r\n\r\nvoid loop() {\r\n\/\/ read the state of the pushbutton value:\r\nbuttonread = digitalRead(buttonPin);\r\n\r\n\/\/ check if the pushbutton is pressed.\r\n\/\/ if it is, the buttonState is HIGH:\r\nif (buttonread == HIGH) { \/\/Check if Button was pressed before and being pressed now\r\n\r\nif (buttonState == LOW)\r\n{\r\n\/\/ turn LED on:\r\ndigitalWrite(ledPin, HIGH);\r\nbuttonState = HIGH;\r\nSerial.println(&amp;amp;amp;amp;amp;amp;amp;amp;quot;Button pressed&amp;amp;amp;amp;amp;amp;amp;amp;quot;);\r\n}\r\n}\r\nelse {\r\nif (buttonState == HIGH) {\r\ndigitalWrite(ledPin, LOW);\r\nbuttonState = LOW;\r\n}\r\n}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Zu Beginn wird buttonState mit LOW initialisiert. Diese Variable speichert, ob der Taster bereits gedr\u00fcckt wurde (LOW zeigt an, dass noch nicht gedr\u00fcckt wurde). Wenn der Taster gedr\u00fcckt wird, wird die LED eingeschaltet und eine Meldung \u00fcber den Serial Port ausgegeben. Auch beim Loslassen des Tasters bleibt die LED an.<\/p>\n<p>Allerdings k\u00f6nnen mehrere Nachrichten \u00fcber die serielle Schnittstelle auftreten, obwohl der Taster nur einmal gedr\u00fcckt wurde. Dieses Verhalten sollte nicht auftreten, selbst wenn der Taster gedr\u00fcckt gehalten wird.<\/p>\n<p><a href=\"http:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Button_prellen.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-63\" src=\"http:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Button_prellen-300x252.png\" alt=\"\" width=\"300\" height=\"252\" srcset=\"https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Button_prellen-300x252.png 300w, https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Button_prellen.png 459w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Das obige Bild z.B. ist nach einem einzigen Tastendruck. Was ist passiert?<\/p>\n<p>&nbsp;<\/p>\n<h2>Prellen<\/h2>\n<p>Beim Bet\u00e4tigen des Tasters schlie\u00dft man den Stromkreis, aber dies geschieht nicht sofort. Die mechanischen Bauteile im Taster sind nicht perfekt, und es kann eine Weile dauern, bis der Stromkreis vollst\u00e4ndig geschlossen ist. Dieses Verhalten wird als &#8220;Prellen&#8221; bezeichnet. Um dieses Verhalten zu korrigieren, muss der Taster &#8220;entprellt&#8221; werden. Es gibt verschiedene Ans\u00e4tze, sowohl elektrisch als auch softwaretechnisch.<\/p>\n<p>Eine einfache Softwarel\u00f6sung besteht darin, nach dem Einlesen des Tasters einen kurzen Moment zu warten und dann, falls dieser HIGH war, den Taster noch einmal einzulesen. Wenn der Taster immer noch auf HIGH ist, kann der Arduino sicher sein, dass es ein echter Tastendruck war.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\">if (buttonread == HIGH) { \/\/Check if Button was pressed before and being pressed now\r\ndelay(5);\r\nif ((buttonState == LOW) &amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp; (digitalRead(buttonPin)) )\r\n{\r\nif (digitalRead(buttonPin)) {\r\n\/\/ turn LED on:\r\ndigitalWrite(ledPin, HIGH);\r\nbuttonState = HIGH;\r\nSerial.println(&amp;amp;amp;amp;amp;amp;amp;amp;quot;Button pressed&amp;amp;amp;amp;amp;amp;amp;amp;quot;);\r\n}\r\n}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Wie lange man genau warten muss, h\u00e4ngt von Fall zu Fall ab und ist nicht besonders kritisch. F\u00fcr gew\u00f6hnlich reichen 5 bis 50 Millisekunden.<\/p>","protected":false},"excerpt":{"rendered":"<p>Wenn Sie einen Arduino mit einem Taster steuern m\u00f6chten, stehen Sie vor der Herausforderung, den Taster richtig abzufragen und zu&hellip;<\/p>\n","protected":false},"author":1,"featured_media":67,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[1],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/madgyver.de\/wp-content\/uploads\/2015\/06\/Arduino-Taster-Entprellen.jpg","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5OAKZ-n","_links":{"self":[{"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/posts\/23"}],"collection":[{"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":21,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":175,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/posts\/23\/revisions\/175"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/media\/67"}],"wp:attachment":[{"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/madgyver.de\/de\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}