Guten Tag alle miteinander,
bei meinem Arduino Programm habe ich aktuell ein Problem.
Ich möchte mein Programm "gleichzeitig" laufen lassen, deswegen arbeite
ich über die millis() funktion aber ich will Signale einlesen die dann 5
sec später eine LED steuern sollen. Wenn ich mit millis arbeite dann
sind die 5 sec schon rum wenn ich mein Signal bekomme, da das Signal
von Hand ausgelöst wird und nicht immer Periodisch zu den selben Zeiten
kommt.
Ich würde gerne beim ersten durchlauf die if funktion für das Umschalten
auf die LED //zu überspringen, wenn das möglich ist. Oder halt ein
Ersatz für delay der aber ganau wie delay funktioniert.
Also kurz gesagt ich habe ein (Zeit) variables Eingangssignal.
Das soll bei High eine LED (Gelb) ansteuern und nach 5 sec eine LED
(ROT)
viele Grüße
Tipp:
Array und Strukturen würden dir die Möglichkeit bieten, auf
Durchnummerierungen zu verzichten. Dir die Codeduplikate ersparen.
Nicolas schrieb:> Also kurz gesagt ich habe ein (Zeit) variables Eingangssignal.> Das soll bei High eine LED (Gelb) ansteuern und nach 5 sec eine LED> (ROT)
Wo ist da dein Problem?
Nicolas schrieb:> Guten Tag alle miteinander,> bei meinem Arduino Programm habe ich aktuell ein Problem.> Ich möchte mein Programm "gleichzeitig" laufen lassen,
Nennt sich Multitasking.
> deswegen arbeite> ich über die millis() funktion aber ich will Signale einlesen die dann 5> sec später eine LED steuern sollen.
Dein Ansatz bewegt sich in die richtige Richtung, aber die Umsetzung ist
sehr aufgeblasen und unübersichtlich.
> Wenn ich mit millis arbeite dann> sind die 5 sec schon rum wenn ich mein Signal bekomme, da das Signal> von Hand ausgelöst wird und nicht immer Periodisch zu den selben Zeiten> kommt.
Das ist ja normal.
> Ich würde gerne beim ersten durchlauf die if funktion für das Umschalten> auf die LED //zu überspringen, wenn das möglich ist. Oder halt ein> Ersatz für delay der aber ganau wie delay funktioniert.
Chaos. Beschreibe doch mal mit einfachen Worten, was dfein Programm
machen soll.
> Also kurz gesagt ich habe ein (Zeit) variables Eingangssignal.> Das soll bei High eine LED (Gelb) ansteuern und nach 5 sec eine LED> (ROT)
Klingt nach einem Monoflop, welches auf eine Signalflanke reagieren
soll?
Ich würde mal sagen, das ist ne Aufgabe für einen Scheduler.
Und das Tastendrücken erkennt man einfacher mit einer Entprellib oder
dem Arduino Debounce. Dann wird nur auf die Flanke reagiert, d.h. die
Taste gedrückt halten, startet die Aktion nicht alle 5s erneut.
Hier mal der Scheduler mit Entprellib:
Beitrag "Wartezeiten effektiv (Scheduler)"
Die Entprellib muß man noch auf 16 Bit erweitern (uint16_t), da 12
Tasten.
Nicolas schrieb:> Also kurz gesagt ich habe ein (Zeit) variables Eingangssignal.> Das soll bei High eine LED (Gelb) ansteuern
Also bei nicht gedrückter Taste, da ja die Pullups eingeschaltet sind.
Nicolas schrieb:> bei meinem Arduino Programm habe ich aktuell ein Problem.
Zeichne erstmal ein Pulsdiagramm mit den Abhängigkeiten, damit klar
wird, was du vorhast.
Nicolas schrieb:> Hallo nochmal,> ich habe das mit der Statemachine probiert und alles fuktioniert.> Wollte nur noch eine kurze Rückmeldung geben.> vielen Dank
Was stimmt denn jetzt? Im anderen Thread sagst Du, dass Du es
hinbekommen hast und hier zeigst Du das gleiche Programm?!
Eigentlich ist erst einmal ein Buch notwendig. Eines, das Programmieren
erklärt: Arrays, Datenstrukturen, Schleifen. Denn hier fehlt ja so viel
Basiswissen.
Mit Maske darf man in Bibliotheken. Und Amazon hat rund um die Uhr auf.
Hallo zusammen,
mal von Anfang ja ich bin recht neu in Arduino und habe deswegen auch
nicht viel Erfahrung gesammelt das es bessere Möglichkeiten gibt meinen
Code verständlicher auszudrücken wusste ich nicht ich habe einfach
versucht das in "schöne" Blöcke einzuteilen
das folgende bezieht sich auf die Zeilen 106-114
Das Problem ist, im Standard Zustand ist die Grüne LED an und die
anderen beiden aus. Wenn ich mein HIGH Signal bekomme geht die Grüne aus
und eine Gelbe an. Nach 5 sec soll dann die Rote angehen. Das High
Signal braucht aber ein bisschen bis es zurückgenommen wird sprich die
Gelbe würde wieder an gehen und die Rote alle 5 sec einmal kurz
aufleuchten. ich will jetzt das die Rote ca. 5 sec an bleibt damit die
Anlage von der ich das Signal entnehme kapiert das das High Signal
ausgehen soll.
Ich kriege es auch hin das ich das High Signal nicht abfrage wenn die
Rote einmal an war aber die Rote geht ja durch die millis() Funktion
direkt an und wartet keine 5 sec, da die 5 sec ja immer erreicht sind.
und ja ich hatte es Teils hinbekommen jetzt kam halt das Problem das
meine LED direkt wenn das High Signal kommt angeht und nicht 5 sec
wartet damit das High Signal weggenommen werden kann
Tut mir leid falls das wieder so umständlich beschrieben ist ich weis
allerdings nicht wie ich es besser formulieren kann.
So einen undurchdringlichen Wust an Code mag sich keiner ansehen.
Schreib das Ganze nochmal neu, aber nur für eine Schranke. Und erst,
wenn das einwandrei funktioniert, kann man es erweitern.
Entwickeln geht immer ein Schritt nach dem anderen und nicht alles
gleichzeitig.
Nicolas schrieb:> Ablaufdiagramm
Ein brauchbarer Anfang. Aber es gibt kein HIGH-Signal. Es gibt eher
Signal X, Y, Z, welches HIGH sein kann. Das sollte man auch so
schreiben. Dann entfallen solche Peinlichkeiten wie (anderes HIGH
Signal)
Aber die Auslösung des Ablauft mittels ZUSTAND = HIGH ist hier
vermutlich ungünstig bis falsch. Du musst eher den Übergang von
LOW->HIGH erkennen (Flanke) und dann den Ablauf starten.
weiterhin scheinen deine beiden LEDs rot und grün miteinander verkoppelt
zu sein. D.h. deine getrennt gezeichneten Abläufe gehören zusammen. Das
sollte man auch so zeichnen, siehe Statemachine.
Also nochmal, Zustandsdiagramm richtig zeichnen.
So etwa?
> enum stateT {oben, runter, unten , rauf};> stateT state[anz];
Ich würde den Startwert für die Stati hinschreiben, auch wenn das in C
implizit "oben" ist, weil das dem Wert 0 entspricht.
Und ich würde den inneren teil der Schleife in eine Funktion auslagern:
Nicolas schrieb:> Unbenanntes_Diagramm.drawio
Was soll das für ein Dateiformat sein und welches Programm kann damit
etwas anfangen?
Nicolas schrieb:> Ablaufdiagramm.png
Stefan ⛄ F. schrieb:> Ich würde den Startwert für die Stati hinschreiben,
Ausrede: Da habe ich mich taktisch zurückgehalten, weil sie unbekannt
sind.
Nehme an, dass es um eine Schrankensteuerung geht(?), da kann es
durchaus sein, dass manche oben oder unten oder zwischendrin sind, wenn
der Arduino loslegt. Man müsste im Setup alle hochfahren um einen
definierten Zustand zu erreichen. Pech, wenn dann gerade ein Zug
heranrauscht.
Helmut H. schrieb:> Man müsste im Setup alle hochfahren um einen definierten Zustand zu> erreichen. Pech, wenn dann gerade ein Zug heranrauscht.
Während des Setups muss der Block gesperrt sein, also kein Problem ;-)
Wolfgang schrieb:>> Unbenanntes_Diagramm.drawio> Was soll das für ein Dateiformat sein und welches Programm kann damit> etwas anfangen?
Ich rate mal: draw.io
Wer jetzt nicht so schwer. Trotzdem werde ich mir das Programm nicht
installieren.
Helmut H. schrieb:> Man müsste im Setup alle hochfahren um einen> definierten Zustand zu erreichen. Pech, wenn dann gerade ein Zug> heranrauscht.
OK, dann braucht es also noch den Zustand "unbekannt" und der muss
implementiert werden.
Beim ersten starten des Programms würd ich alle auf hoch setzten da ich
die Züge selber simuliere.
mit diagrammeditor.de habe ich das gemacht. Aber nicht als Programm auf
dem Rechner sondern im Internet.
Nicolas schrieb:> Beim ersten starten des Programms würd ich alle auf hoch setzten da ich> die Züge selber simuliere.
Welche Zügen? Ist das ne Eisenbahnsteuerung?
Wolfgang schrieb:> Während des Setups muss der Block gesperrt sein, also kein Problem ;-)
und die befehle nicht vergessen (hier wäre es ek gestört) ;-)