if funktion mit Schieberegister

Moin Moin,

ich bin noch in der Anfangsphase, mir programmieren anzueignen (sozusagen Level 0).
Ich habe einen Arduino Uno und möchte damit 2 Schieberegister ansteuern. Diese sollen 10 LEDs einschalten ( eine nach der anderen an und dann nach und nach wieder aus), wenn ich einen von 4 Tastern drücke und in umgekehrte reinfolge Ein/Aus schalten, wenn ich die anderen 4 Taster drücke.

Soweit so gut. Programm ist geschrieben, aber anstatt auf HIGH einer der Taster zu warten, fängt der Arduino an, die LEDs ein- und auszuschalten, auch nach passigem Schema, aber ohne den Taster abzufragen.

Sketch ist im Anhang. Ich hoffe er ist verständlich geschrieben.

Danke im voraus für eure Hilfe
Rusty

Spielfeld2.ino (11.3 KB)

Hi

Viel Platz für wenig Funktion - aber auch als Anfänger kann man ja Verbesserungen gebrauchen.

Hat (noch?) Nichts mit Deinem Problem zu tun:

  • mache konstant, was konstant ist - LED-Pins werden sich beim Programmlauf nicht ändern, also 'const'
  • nutze den Datentyp, Der reicht/gebraucht wird - Du nutzt INT (-32768...32767) - meine Arduinos haben keine 255 Pins - somit reicht BYTE (0...255) und negative Beinchen sind mir noch nicht unter gekommen.
  • benutze sprechende Variablen - wer ist GS1 und Wer GS1ST?
  • Kommentare können sehr hilfreich sein - gerade, wenn man den Sketch nicht (mehr) kennt
  • Du benutzt digitalRead auf einem INPUT-Pin - dort muß der taster zwischen Vcc und Pin liegen - bei gedrücktem Pin HIGH - bei gelöstem Pin 'offen' - Das geht nicht - Du brauchst einen PULL-DOWN-Widerstand für feste Pegel
  • wenn Du INPUT_PULLUP benutzt, ist der Pin unbenutzt auf HIGH, der Taster müsste nach GND, dadurch spart man sich den Pull-DOWN-Widerstand, weil man den Internen (aber PullUP) nimmt. Dadurch dreht sich aber die Logik um - gedrückt ist nun LOW
  • Dein Problem wird sein, daß unbetätigte, OFFENE, Pins 'irgendwas' empfangen - z.B. Radio - und wenn's Da für eine 1 (HIGH) reicht, bekommst Du ein HIGH, sonst ein LOW - Das kann der Pin in rasender Geschwindigkeit!
  • Deine Bit-Muster sind alle 'vorhersehbar' - bei Schritt 0 keine 1, bei Schritt Drei drei Einsen ... Das braucht man nicht fest im Code als Array - Das kann man auch währned der Laufzeit 'berechnen'
  • Deine FOR-Schleifen machen Alle genau das Gleiche - (ok, mit anderen, vorhersehbaren!, Daten) - auslagern in eine Funktion
  • Du möchtest DRINGEND STRG+T in der IDE drücken und alle unnützen Leerzeilen entfernen

So ... ich scrolle Mal etwas in Deinem Sketch runter :slight_smile:

Dein aktuelles Problem sind die fehlenden Pull-Widerstände an den Tastern - unbetätigt empfangen Diese Radio - packe pro Taster einen Pull-Down-Widerstand dabei (1...10k) und die Funktion wird sich langsam Dem annähern, was Du willst.

Den Rest solltest Du aber auch Mal andenken :slight_smile:

MfG

PS: Wenn Du sogar eine Frage in Deinem Post versteckt hättest, hätte man sogar gezielt Diese beantworten können - hoffe, trotzdem halbwegs getroffen zu haben.

Wie hast du die taster angeschlossen? Schalten diese nach Plus? wenn Ja, hast Du an den Eingängen vom Arduino, an denen die Taster hängen, jeweils einen Widerstand (10kOhm) nach GND geschaltet? den Braucht es nämlich, damit der Eingang nicht in der Luft hängt, solange kein Taster gedrückt ist. Denn ohne diesen Widerstand, der den Eingang auf GND (LOW) legt, ist es reiner Zufall, was digitalRead() ergibt, wenn der Taster nicht gedrückt ist.
LG Stefan

Deine FOR-Schleifen machen Alle genau das Gleiche - (ok, mit anderen, vorhersehbaren!, Daten) - auslagern in eine Funktion

Außerdem würde ich dir empfehlen, die shiftOut Funktion anzusehen. Da musst du allerdings den Unterschied zwischen
** **int** **
und anderen Datentypen kennen lernen.

danke erstmal

ich probiere es mit dem INPUT_PULLUP mal aus

die Taster hatte ich alle schon mit dem Widerstand versehen.

ich nehme mir die andere Ratschläge an und werde mir das notwendige wissen anzueignen

ich probiere es mit dem INPUT_PULLUP mal aus

die Taster hatte ich alle schon mit dem Widerstand versehen.

Eins von beidem sollte reichen!

Aber leider ist der Schaltplan geheim.
Genauso geheim, wie die verwendeten Widerstände, oder gar, wie sie angeschlossen sind.

ich nehme mir die andere Ratschläge an und werde mir das notwendige wissen anzueignen

Weiter machen!

Außerdem würde ich dir empfehlen, die shiftOut Funktion anzusehen.

Auch SPI ist an der Stelle eine brauchbare Alternative.

Rusty_94:
die Taster hatte ich alle schon mit dem Widerstand versehen.

Dann dürfte das was Du beschreibst nicht passieren.

Grüße Uwe

@Uwe:
Falls er die Widerstände nach Plus geschaltet hat , oder in Serie mit den Tastern, dann schon.
Aber da der Schaltplan noch immer genauso geheim ist, wie die Antwort auf meine Frage, wie er denn die Taster angeschlossen hat, können wir natürlich nur Vermutungen anstellen, - oder unsere Kristallkugel mit nem Teleskop koppeln.

LG Stefan