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