Mit Tastendruck Variable am Arduino verändern

Hallo, wie bekomme ich es programmiert, dass, wenn ich einen Taster am Arduino kurz drücke, eine Variable auf HIGH geht, und beim nächsten Mal drücken wieder auf LOW usw..., also dass mit jedem Druck zum Beispiel eine LED an/ausgeschaltet werden kann? lg.

Taster auslesen Taster entprellen Tastendrücke zählen Niederwertigstes Bit, des Zählers, zum LED schalten verwenden.

Die "Herausforderung" bei Tastendrücke zählen ist, zu merken dass der Taster im vorigen Durchlauf noch nicht gedrückt war.

Statt "zählen" reicht es auch , dann den led-Zustand zu invertieren.

dafa7583: Hallo, wie bekomme ich es programmiert, dass, wenn ich einen Taster am Arduino kurz drücke, eine Variable auf HIGH geht, und beim nächsten Mal drücken wieder auf LOW usw..., also dass mit jedem Druck zum Beispiel eine LED an/ausgeschaltet werden kann? lg.

Dafür habe ich erst vor drei Tagen ein Beispielprogramm gepostet: http://forum.arduino.cc/index.php?topic=476129.msg3253858#msg3253858

Dabei ging es darum, per Tastendruck eine LED im Wechsel AUS und BLINKEND zu schalten.

Konkret wird in meinem Code eine Variable namens 'blinking' auf true oder false gesetzt.

Wobei true und false im Grunde vom Wert her quasi als HIGH und LOW interpretiert werden können.

LOW ist 0

false ist auch 0

Und HIGH ist 1

Und true ist alles, was nicht 0 ist. Also beispielsweise auch 1 ist true

Schau Dir meinen Beitrag und das Beispielprogramm vom 9.Mai an, da ist eine buttonPressed() Funktion mit boolschem Rückgabewert enthalten, die sich vielseitig einsetzen läßt!

Und der Tastschalter ist mit der einfachstmöglichen Schaltung am Arduino angeschlossen: Ein Pol des Tasters am BUTTONPIN und der andere Pol des Tasters an GND.

Dadurch wird kein externer Pull-Down-Widerstand in der Tasterschaltung benötigt, sondern das Programm aktiviert am BUTTONPIN den internen Pull-Up-Widerstand des Atmega. Gedrückter Tastschalter gibt LOW Losgelassener Tastschalter gibt HIGH

Und die buttonPressed() Funktion macht eine StateChangeDetection und erkennt den Übergang vom losgelassenen in den gedrückten Zustand des Schalters. Für Leitungslängen bis circa. einen halben Meter zwischen Arduino und Tastschalter ist das im allgemeinen ausreichend für eine einwandfreie Tasterfunktion ohne externen Pull-Widerstand am Taster.

Ich poste jetzt doch mal ein Beispiel mit dem „Idiotenbefehl" delay(), da es am Anfang manchmal einfacher ist zu verstehen. Generell habe ich mein Beispiel „eingedeutscht“ und versucht so wenig wie möglich Variablen einzubauen, um das Ansprechen und Abfragen der Pins klarer herauszuheben. Wenn das Grundgerüst verstanden ist, bin ich auch der Meinung, so schnell wie möglich, den Befehl delay(), zu vermeiden, da der Prozessor sonst zum „Nichtstun“ verdammt wird.

 int taster_val = LOW;
 int taster_val_prell = LOW;
 int tasterstatus = LOW; // letzer Wert zum Vergleichen mit dem aktuellem Wert

void setup() {

 pinMode(8, INPUT); // Pin8 als Eingang festgelegt - Taster zwischen +5V und Pin8
 pinMode(7, OUTPUT); // Pin7 als Ausgang festgelegt - LED mit Vorwiderstand (ca. 220Ohm - 1Kohm) zwischen +5V und Pin7
 Serial.begin(9600); // serielle Schnittstelle startklar machen, daß was am seriellen Monitor raus kommt
 Serial.println(" start"); // Arduino meldet sich mit Start - dient nur zur Kontrolle
}

void loop() {
 taster_val = digitalRead(8); // ließt das erste Mal den Status vom Pin8 und übergibt Wert an Variable taster_val
delay(100); // 50 geht auch für kurze Impulse
taster_val_prell = digitalRead(8); // ließt das zweite Mal den Status vom Pin8 und übergibt Wert an Variable taster_val_prell

if (taster_val == taster_val_prell && tasterstatus == LOW && taster_val == HIGH )
{
// --- hier zwischen den beiden gescheiften Klammern kommt der auszuführende Code rein für Status AN. ---  
Serial.println(" Ein");
digitalWrite(7, HIGH); // LED an
tasterstatus = HIGH; // speichert den Status HIGH in Variable tasterstatus, diese dient zum Vergleichen mit dem nächsten Zustand am Pin8
delay(100); // 50 geht auch für kurze Impulse
//-----Code Status AN Ende -------------------------------------------------------------------------------
}
else if (taster_val == taster_val_prell && tasterstatus == HIGH && taster_val == HIGH )
{
// --- hier zwischen den beiden gescheiften Klammern kommt der auszuführende Code rein für Status AUS. --- 
Serial.println(" Aus");
digitalWrite(7, LOW); // LED aus 
tasterstatus = LOW; // speichert den Status LOW in Variable tasterstatus, diese dient zum Vergleichen mit dem nächsten Zustand am Pin8
delay(100); // 50 geht auch für kurze Impulse
//-----Code Status AUS Ende ------------------------------------------------------------------------------
} 

}

// falls beim Betätigen des Tasters sich Status "An" "Aus" schnell abwechselt, 
// dann einen Widerstand ca. 10-20 kOhm von Pin8 zu Pin GND(neben Pin13) einstecken.
// das filtert die Störungen, die in der Umgebung sind, raus.

Gruß Benni

pinMode(8, INPUT); // Pin8 als Eingang festgelegt - Taster zwischen +5V und Pin8

Dass du an Pin8 auch einen Widerstand nach GND brauchst, weisst du? https://www.arduino.cc/en/Tutorial/Button

Zum Entprellen brauchst du nicht zweimal einzulesen und auch nur ganze wenige Millisekunden zu warten.

( Ausser dein Taster sind zwei Drähte, die du aneinander hältst )

michael_x:
Dass du an Pin8 auch einen Widerstand nach GND brauchst, weisst du?

Ja, steht auch so, ganz am Ende, von meinem Beispiel.

steht auch so, ganz am Ende, von meinem Beispiel

In meinem Alter habe ich nicht mehr so viel Zeit, sowas bis zum Ende zu lesen :wink:
Ausserdem steht da “falls…”

bool tasterval; // aktueller Taster-Zustand
bool tasteralt = LOW; // letzer Wert zum Vergleichen mit dem aktuellem Wert
bool ledstatus = LOW;

void loop() {
  if ( (tasterval=digitalRead(8)) != tasteralt) {
    // Änderung erkannt
    delay(5); // 5 ms reicht dicke zum entprellen
    tasteralt = tasterval;
    Serial.println ( tasterval? "GESCHLOSSEN" : "OFFEN" );
    if ( tasterval ) { 
      ledstatus = ! ledstatus; // bei jedem Drücken wechseln
      Serial.println ( ledstatus? "AN": "AUS");
      digitalWrite(7,ledstatus);
    }
  }
}

Ich mag’s kompakter.
Die Konstruktionbedingung ? t_Ausdruck : f_Ausdruck
kann man natürlich auch mit if - else realisieren.