bin relativ neu auf dem Gebiet der Programmierung in der Arduino IDE.
Habe einige Projekte (mit der millis-Funktion) schon erfolgreich abschließen können, jedoch bei den aktuellen Projekt einige Probleme.
Komme irgenwie nicht dahinter, woran das Problem liegt.
Kurz zum Vorhaben:
Die Schaltung besitzt zwei Taster, wird der Taster EINST. betätigt bzw gedrückt gehalten soll die LED an Pin 1 leuchten solange man diesen Taster gedrückt hält, beim loslassen soll diese ausgehen.
Wird der Taster SAVE betätigt bzw. gedrückt gehalten soll die LED an Pin 0 leuchten solange man diesen Taster gedrückt hält, beim loslassen wieder ausgehen.
Die Unterscheidung zwischen den einzelnen Tastendrücken gedrückt, lang und kurz soll später weiter verarbeitet werden.
Nun zum Problem:
Das Programm unterscheidet nicht zwischen den beiden LEDs, sprich wird einer der beiden Taster betätigt leuchtet die LED an Pin 1, die LED an Pin 0 leuchtet nie.
Woran könnte dieses Problem liegen?
Anbei der Aufbau der Schaltung als Bild. Das ganze soll später eine Lauflichtsteuerung werden, über der man je nach Tastendruck einstellen kann, wie viele Ausgänge eingestellt werden sollen usw.
Welchen Betriebsmodus die Schaltung besitzen soll.
Das ganze soll später auf ein I2C - LCD angezeigt werde.
Anbei der Auszug aus dem Programm der beiden Taster (LCD, PRG-Taster und Ausgänge erstmal rausgelassen diese funktionieren soweit).
Über eine Idee zur Problemlösung oder einen besseren Code wäre ich dankbar.
Da du einen UNO verwendest, solltest du die Pins D0 und D1 nicht verwenden, da diese vom USB-Serialwandler belegt sind. Das gibt wie bei dir zu sehen ist, Probleme.
Statt dessen kannst du aber freie analoge Pins als digitale verwenden.
Und der analoge PIN A4 und A5 wird vom I2C Bus verwendet, den darfst du dann nicht noch anderwertig verwenden.
Einen Vorschlag:
Du entprellst 50mS, und unterscheidest kurze Tastendrücke von langen 400mS.
Ich würde die Längenmessung der Tasterdrucklänge während des Tastendrucks machen.
Sobald die 400mS vorbei sind ist der Tastendruck lange und Du brauchst nicht auf das loslassen des Tasters zu warten um die Aktion auszuführen.
Grüße Uwe
Genaue Erklährung:
Die I2C Schnittstelle ist beim ATmega328 des Arduino UNO eine Mehrfachbelegung der Pins A4 und A5.
Die Pins A4 und A5 sind beim Ardunino UNO R3 zwei mal vorhanden. Einmal als analoge Eingänge A4 und A5 und ein zweites Mal als SDA und SCL. Das verleitet die Pins doppelt zu verwenden. Aber wenn Du I2C verwendest, muß entweder A4/A5 oder SDA/SCL frei bleiben.
Bei anderen Modellen wie zB Leonardo oder MEGA2560 ist die I2C Schnittstelle an anderen Pins (20 und 21) Da gilt das gesagte nicht.
Deine Probleme der Pin Zuordnung wurden dir eh schon ausführlich beschrieben.
Deine "Programmbeschreibung" scheint mir unvollständig zu sein, daher fällt eine weitere Hilfe schwer.
Außer: Wenn du wirklich mit kurzem/langem Tastendruck arbeiten willst, dann empfehle ich dir die OneButton Library. Die kannst du im Bibliotheks-Manager installieren.
Ich muss leider gestehen, dass mich der Programmcode überfordert.
Es sind genau solche If Kaskaden, die mein Verständnis unterbinden.
Zudem habe ich auf der Seite nicht den Code gefunden.
Pin 0 und 1, das wurde schon genannt, dürfen nicht doppelt verwendet werden.
Ich rate zu einer Komplettrenovierung.
Zur Modularisierung.
H-L Wechsel erkennen und Millis abspeichern.
Wenn weniger als 50mS nichts kontrollieren.
Wenn mehr als 50mS auf L-H Wechsel kontrollieren.
Wenn 400mS vorbei dann ist der Taster lange gedrückt
Wenn L-H Wechsel vorher dann ist der Taster kurz gedrückt.
Grüße Uwe