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
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.