Taster sind wie ein Monoflop

Hallo Zusammen, seit zwei Tagen habe ich einen Arduino Mega 2560 und habe ein Verhalten, das so nicht sein dürfte. Angeschlossen an die digitalen Pins sind 4 Taster und 6 LED. Bei allen vier angeschlossenen Tastern behalten die Eingänge auf dem Arduino den Status HIGH, auch wenn der Taster wieder losgelassen wird. Da ich das nicht glauben wollte habe ich mit einem Multimeter die Spannung am Eingang gemessen: Taster gedrückt = 4,96V = HIGH; Taster nicht gedrückt = 0V = LOW. Das habe ich mit einem Stückchen Code getestet. Taster gedrückt LED geht an; Taster losgelassen LED bleibt an. Dann habe ich den Code soweit wie möglich vereinfacht. Variablen raus etc. Das Ergebnis bleibt. Hat das von Euch schon mal wer erlebt? Hier der Code:

Gunther

void setup() { pinMode(48, OUTPUT); pinMode(46, OUTPUT); pinMode(44, OUTPUT); pinMode(42, OUTPUT); pinMode(40, OUTPUT);

pinMode(39, INPUT); pinMode(37, INPUT); pinMode(35, INPUT); pinMode(33, INPUT); }

void loop() { if (digitalRead(33)==HIGH){digitalWrite(48,HIGH);} if (digitalRead(35)==HIGH){digitalWrite(46,HIGH);} if (digitalRead(37)==HIGH){digitalWrite(44,HIGH);} if (digitalRead(39)==HIGH){digitalWrite(42,HIGH);} }

Wie genau sieht denn die Schaltung dazu aus?

Im Prinzip wie die Beispielschaltungen. Bei jeder LED wird die Katode über 200 Ohm mit GND verbunden und die Anode mit dem dazugehörigen PIN vom Arduino. Und jeder Taster wurde einzeln so aufgebaut wie die Beispielschaltung "Button" mit den 10kiloOhm um den Ausgang definiert auf LOW zu setzen.

bastelheini: void setup() { pinMode(48, OUTPUT); pinMode(46, OUTPUT); pinMode(44, OUTPUT); pinMode(42, OUTPUT); pinMode(40, OUTPUT);

pinMode(39, INPUT); pinMode(37, INPUT); pinMode(35, INPUT); pinMode(33, INPUT); }

void loop() { if (digitalRead(33)==HIGH){digitalWrite(48,HIGH);} if (digitalRead(35)==HIGH){digitalWrite(46,HIGH);} if (digitalRead(37)==HIGH){digitalWrite(44,HIGH);} if (digitalRead(39)==HIGH){digitalWrite(42,HIGH);} }

Hallo Gunther,

mal eine Frage: Ist das der ganze Code? Da fehlt nämlich das Low Setzen. Im Augenblick setzt du nur High pro LED, wenn der Schalter gedrückt ist, aber du setzt nicht Low, wenn er nciht gedrückt ist, somit bleiben die LED's an.

Besser wäre: digitalWrite(48, digitalRead(33)); Allerdings krigst du so jedes Prellen des Tasters mit... Hast du einen Pulldown Widerstand am Schalter (Also ein Widerling zwischen Pin und GND)? Wenn nicht, bitte vorsehen... Sonst könnte es passieren, daß es trotzdem nciht sauber funktioniert. Die Eingänge sind so hochohmig, daß ein nciht beschalteter Pin schon mal rauschen empfängt... Noch besser ist aber, Schalter gegen Masse (Achtung im Programm dann umgekehrte Logik!!!) und dann den internen Pullup verwenden. Dazu einfach den Eingang per pinMode(##, INPUT_PULLUP); verwenden. Zeile wäre dann: digitalWrite(48, !digitalRead(33));

Hallo Willie, ja den Pulldownwiderstand gibt es. Deinen Vorschlag digitalWrite(48, digitalRead(33)); werde ich heute Abend auf jeden Fall testen. Aber mit dem LOW setzen habe ich ein Verständnissproblem. Alles was in dem Bereich loop() läuft wird immer wieder zyklisch wiederholt. Das bedeutet doch, daß die if Anweisung wie ich sie verbrochen habe in jedem Zyklus ausgeführt wird. if (digitalRead(33)==HIGH){digitalWrite(48,HIGH);} Also müsste doch bei einem Durchlauf die LED gesetzt werden, .... o.k. und bei einem Durchlauf mit LOW gibt es keine Anweisung also bleibt die LED an. Ich glaube ich habe meinen Fehler gefunden.

Gunther

Richtig.

Bei einem Durchlauf mit Schalter offen wird keine digitalWrite-Anweisung ausgeführt, somit bleibt der alte Zustand erhalten......

Hallo Willie, jetzt muß ich noch eine Frage stellen. Gibt es eine Möglichkeit ein Ergebnis eines Eingangs in einer Variablen zu speichern und zwar über mehrere Durchläufe hinweg selbst wenn sich dann der Eingang ändert? Beispiel: Taster an PIN 30 wird gedrückt das Ergebnis HIGH wird in der Variablen var gespeichert also var=HIGH. Jetzt möchte ich genau diesen Wert auch noch so lange erhalten bis er gezielt auf LOW gesetzt wird. Egal was der Taster an PIN 30 macht.

Gunther

Natürlich. Verwende dafür byte oder int

Aber du solltest dir wirklich mal anschauen wie man Taster entprellt. In deinem Fall reicht dafür vielleicht erst mal dein delay() von 5-20ms nach dem Auslesen des Tasters. Wenn du es nicht-blockierend machen willst: https://github.com/thomasfredericks/Bounce-Arduino-Wiring

Jetzt war ich einen Moment irritiert. :astonished:

Aber offensichtlich gibt es jetzt noch einen Gunther hier. :D

Willkommen, Namensvetter!

Gunther

Ja aber noch nicht sehr lange. Danke

Gunther

bastelheini: Hallo Willie, jetzt muß ich noch eine Frage stellen. Gibt es eine Möglichkeit ein Ergebnis eines Eingangs in einer Variablen zu speichern und zwar über mehrere Durchläufe hinweg selbst wenn sich dann der Eingang ändert? Beispiel: Taster an PIN 30 wird gedrückt das Ergebnis HIGH wird in der Variablen var gespeichert also var=HIGH. Jetzt möchte ich genau diesen Wert auch noch so lange erhalten bis er gezielt auf LOW gesetzt wird. Egal was der Taster an PIN 30 macht.

Gunther

Ja klar, du definierst dir dafür eine globale Variable. Also z.B. sowas:

byte taster;

void setup() {
  taster = 0;
}

void loop() {
  ...
  if (digitalRead(12) == 0) {
    taster = 1;
  }
  ...
}

Wenn du dann Taster später nicht mehr brauchst, einfach wieder auf 0 setzen. Wenn du dir sicher bist, das Taster immer nur die Werte 0 und 1 annehmen kann, kannste auch einen bool nehmen.

bool taster;

void setup() {
  taster = 0;
}

void loop() {
//  ...
  if (digitalRead(12) == 0) {
    taster = 1;
  }
//  ...
}

hi,

Also müsste doch bei einem Durchlauf die LED gesetzt werden, .... o.k. und bei einem Durchlauf mit LOW gibt es keine Anweisung also bleibt die LED an. Ich glaube ich habe meinen Fehler gefunden.

der satz hat mich zu einem herzlichen lachen gebracht (kein lachen, daß sich lustig über etwas macht). ein richtig schönes AHA-erlebnis Deinerseits...

willkommen hier im forum und noch viel spaß,

stefan

Danke

Hallo Willie, Deine Idee mit der direkten Zuweisung habe ich eingebaut und dadurch:

Also müsste doch bei einem Durchlauf die LED gesetzt werden, .... o.k. und bei einem Durchlauf mit LOW gibt es keine Anweisung also bleibt die LED an. Ich glaube ich habe meinen Fehler gefunden.

bin ich einen großen Schritt weitergekommen. Meistens ist es eben nur eine Kleinigkeit. Jetzt habe ich noch ein Problem mit einer While Anweisung. Aber dazu sollte ich der Ordnung halber ein neues Thema beginnen.

Gunther