{{backlinks>.}} ===== Pushbuttons ===== Ist ein digitaler Input nicht verbunden (bzw. hängt einfach ein loser Draht daran) ist die Spannung nicht definiert. Schlimmer noch, variable elektrische Felder induzieren eine Spannung (v.a. 50Hz Wechselstrom) und der digitale Input kann wild zwischen 0 und 1 wechseln. Im Falle eines Pushbuttons wird das eine Ende des Buttons auf GND oder 5V gehängt, und das andere Ende mit dem Input-Pin verbunden und zusätzlich über einen grossen Widerstand auf 5V oder GND, damit der Zustand auch bei offenem Schalter definiert ist. Der Arduino hat interne Pullup-Widerstände, die man aktivieren kann. Man spart sich damit einen Widerstand in der Schaltung. Allerdings ist dann die Logik "vertauscht", d.h. man liest eine Eins wenn der Button offen, und eine Null wenn er gedrückt ist. // Kurzform: pinMode(2, INPUT_PULLUP); // Alternative pinMode(2, INPUT); digitalWrite(2, HIGH); // Pullup aktivieren ==== Debouncing ==== Diese Schalter schliessen nicht immer sofort und vollständig, sondern können noch vibrieren, was als mehrere ganz schnelle Knopfdrücke missinterpretiert werden kann. Abhilfe kann eine Filterung mit Hilfe eines RC-Gliedes oder eine entsprechende Programmlogik sein. {{:lehrkraefte:blc:math:formi:push-button.png?direct&200|}} Das "Bouncing" kann mit folgendem Programm visiualisert werden. Das ist besonder eindrücklich, wenn man zwei Drähte zusammenhält. // GND auf eine Seite des Buttons, andere Seite auf Pin 2 // Oder Pin 2 und GND mit zwei Stecker berühren (oder einfach ein- und ausstecken). void setup() { pinMode(2, INPUT_PULLUP); Serial.begin(115200); // Funktion aufrufen, wenn immer der Zustand ändert. attachInterrupt(digitalPinToInterrupt(2), click, CHANGE); } #define NUM 20 // volatile, damit im Interrupt verfügbar volatile int pos = 0; volatile long us[NUM]; // Interrupt Methode void click() { if (pos