Taster, 1ten drücken AN, 2ten drücken AUS

Hallo,

ist es mit Arduino möglich, dass ein Taster beim ersten Tastendruck bspw. eine Aktion ausführt (z.B. LED an) und beim nächsten Tastendruck die LED wieder ausschaltet?

Stelle mir das durch die loop Struktur problematisch vor und wüsste keinen möglichen Ansatz.

Entschulige bitte, aber das ist wirklich eine der einfachsten Problemstellungen überhaupt. Du musst eigentlich nur auf den Tastendruck reagieren (steigende oder fallende Flanke) und dabei den Zustand eines Ausgangs toggeln, also umkehren. Erschwerend kommt nun aber hinzu, dass die mechanischen Taster prellen, also im Millisekundenbereich mehrfach auslösen. Das Prellen kann man hardwaretechnisch kaum verhindern, es muss also durch intelligente Programmierung ausgeschlossen werden, dass mehrfach ausgelöst wird. Im einfachsten Fall - und das ist wirklich nicht als intelligente Lösung heranzuziehen - blockierst du den gesamten Mikrocontroller für etwa 100 Millisekunden mit einem einfachen delay (100);.

Okay danke, habe ein passendes Beispiel dazu gefunden.

Es ist übrigens alles einfach, wenn man es einmal gemacht hat :wink:

sth77:
Entschulige bitte, aber das ist wirklich eine der einfachsten Problemstellungen überhaupt. ...

Das denke ich immer wieder beim Lesen mancher Postings.

Je nach Laune würde ich dem Schreiber dann gerne ans Schienbein treten oder etwas unfreundliches loslassen. Wenn ich aber gut drauf bin, fällt mir zum Beispiel ein, wie vernagelt ich selbst manchmal sein kann oder dass ich erst einige Zeit nach dem Kauf meines ersten Computers verstanden habe, was Programmieren wirklich bedeutet (und wie es funktioniert).

Momentan denke ich, dass es doch immerhin etwas ist, wenn sich jemand mit derartigem beschäftigen möchte. Aber ich hatte heute auch schon eine Nussecke und einen Capuccino zum Frühstück :slight_smile:

Gruß

Gregor

Hallo Ignoty!

Du sprichst große Worte gelassen aus!

´bin auch erst seit 2 Wochen in der Arduino Gemeinde und habe am Wochenende 3h gebraucht um mir so ein Programm zu schreiben bis es lief.
Um so größer ist dann die Freude wenn es funzt!

Z.b. habe ich überall im Handbuch einen "Toggle" Befehl gesucht wie ich Ihn von anderen Programmen kannte und eine Variable "bit" die nur zwei Zustände hat.
Ich habe mir dann dadurch geholfen das ich eine Variable mit dem Wert -1 definiert habe und die bei jedem Tastendruck mit -1 multipliziert habe. (Ergibt -1, 1, -1, 1, -1, ....)

Dies als Aufmunterung für Alle Neueinsteiger denen es auch so geht!!!

Inzwischen weiß ich, dass es so eine Variable auch beim Arduino gibt (die heißt hier "boolean") und lässt sich toggeln.

Gerne schicke ich Dir bei Interesse auch ´mal eine Programmversion zu.

Wuehlmaus:
Z.b. habe ich überall im Handbuch einen "Toggle" Befehl gesucht wie ich Ihn von anderen Programmen kannte und eine Variable "bit" die nur zwei Zustände hat.

Es wird Zeit, dass das „semantische Web“ kommt. [OT] Weißt jemand, wie es damit aussieht?

Wuehlmaus:
Ich habe mir dann dadurch geholfen das ich eine Variable mit dem Wert -1 definiert habe und die bei jedem Tastendruck mit -1 multipliziert habe. (Ergibt -1, 1, -1, 1, -1, ....)

Das ist ein Beispiel für einen Workaround, IMO aber auch für schlechte Programmierung. Wer schon eine Weile dabei ist und sowas programmiert, hat ein Nicht-Fleißbildchen verdient :slight_smile:

Gruß

Gregor

Wuehlmaus:
Inzwischen weiß ich, dass es so eine Variable auch beim Arduino gibt (die heißt hier "boolean") und lässt sich toggeln.

Arduino ist auch nur normales C/C++. Es gibt natürlich Unterschiede zum PC einfach weil es ein 8 Bit Prozessor ist, aber die grundlegenden Datentypen sind identisch.

boolean ist zwar vom Namen her eine Arduino Eigenheit, aber in den neueren Version ist es auch einfach nur der C++ Standard-Datentyp "bool". Vorher war es "unsigned char" wie früher in C. Damit kann man genauso eine 1 oder 0 mit ! invertieren.

Eine direkte Togglefunktion gibt es - komischerweise in den Arduino Libs - nicht.
Man kann sich was aber selber schreiben.

Die meisten AVRs könnten sogar das ganze sehr schnell. PORTX ^= 1<<BIT;
In Arduino kann es so aussehen, dass

digitalWrite(PIN, state = !state);
Dürfte gehen als Zuweisung,

ja, funzt:

byte PIN = 13;
bool state;
void setup() {pinMode(PIN,OUTPUT);}
void loop() {
  static uint32_t previousmillis;
  if (millis() - previousmillis > 50) {
    digitalWrite(PIN, state = !state);
    previousmillis = millis();
  }
}

Okay, danke fürs testen :wink: Wobei byte und bool vermutlich keinen Unterschied spielen, wenn ich das richtig in Erinnerung habe :wink:

Mein Favorit:

digitalWrite(PIN, !digitalRead(PIN));

Ignoty:
Es ist übrigens alles einfach, wenn man es einmal gemacht hat :wink:

Sehe ich genauso, darum frage, wenn Du eine Frage hast. Irgendwer hat dann Nussecke und Capuccino intus, um Dir nett und konstruktiv zu antworten :slight_smile: Bei mir fehlte die Nussecke ...

Hier noch eine Anregung mit if (Switch_alt != SwitchStatus) als Flankenerkennung.

agmue:
Mein Favorit:

digitalWrite(PIN, !digitalRead(PIN));

Das toggelt einen Pin, aber keinen bool. Den bool kann man u.U. anderswo noch gut gebrauchen. Klar, dann könnte man ja auch wieder den Pin auslesen. Aber wir sollten es hier doch anfängerverständlich und einfach lassen.

sschultewolter:
Okay, danke fürs testen :wink: Wobei byte und bool vermutlich keinen Unterschied spielen, wenn ich das richtig in Erinnerung habe :wink:

Ich hatte beides als byte definiert, es aber extra wegen der Verständlichkeit und Beispielhaftigkeit auf bool geändert. Ich weiss auch, dass das kein Speicher spart.