Siro sagt es! Solang der in clickedIt() hängt bekommt er nichts mit. Und das fast eine halbe Sekunde lang. Dann bleibt für das Taste Drücken nur die Zeit, bis er nach dem clickedIt() wieder im clickedIt() landet, weil es aufgerufen wird. Man müsste daher die Taste für ca. 1 Sekunde drücken, vielleicht auch etwas länger, damit er es mitbekommt oder eben öfter. Das Problem gibt es, seit es Computer gibt. Deshalb hat man sich dafür etwas einfallen lassen: Interrupt Controller. Ob der Arduino einen solchen hat, weiß ich nicht, aber er kennt Interrupts. Die Digital Pins, die für einen Interrupt (Unterbrechung) genutzt werden können sind hier soweit alle aufgeführt: https://www.arduino.cc/reference/en/...tachinterrupt/
Der Taster müsste an einen solchen Pin angeschlossen werden. Wenn dann der Taster gedrückt wird, sollte der Arduino direkt zur Interruptroutine springen und andere Dinge unterbrechen. Das nennt sich dann Interrupt Service Routine.
Auf der Seite ist alles beschrieben:
Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
Parameters
interrupt: the number of the interrupt (int)
pin: the pin number (Arduino Due, Zero, MKR1000 only)
ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:
LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.
The Due, Zero and MKR1000 boards allows also:
HIGH to trigger the interrupt whenever the pin is high.
Wenn man keinen Interrupt nutzt, hat man das Problem, dass man dauernd überall im Programmcode immer wieder auf den Taster prüfen müsste, damit man den Tastendruck nicht verpasst. Das kann sogar funktionieren, bläht aber den Code auf und ist äußerst unübersichtlich (in der Regel funktioniert es auch nicht wirklich gut).
Was man tun kann, ist dieses rausschmeißen:
Code:
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(100);
In loop() kann man immer auf den Taster prüfen. Verändert sich das Signal, kann man reagieren. Außerdem zählt man einen Zähler runter (Startwert meinetwegen bei 1000), bei jedem Durchlauf von loop() zähler = zähler -1. Wenn der Zähler auf 0 ist, setzt man die LED entweder auf HIGH oder LOW, abhängig davon, was zuletzt war (logisch) und setzt den Zähler wieder auf den Startwert. Wegen der Blinkgeschwindigkeit kann man den Zählerstartwert variieren.
Lesezeichen