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.
EAF schrieb: > Array und Strukturen würden dir die Möglichkeit bieten, auf > Durchnummerierungen zu verzichten. Dir die Codeduplikate ersparen. z.B. so:
1 | //
|
2 | const byte anz = 6; |
3 | const byte inAuf[anz] = {23, 3, 25, 21, 27, 29}; |
4 | const byte inZu[anz] = {22, 2, 24, 20, 26, 28}; |
5 | byte last[anz] = {LOW, LOW, LOW, LOW, LOW, LOW}; |
6 | const byte outAuf[anz] = {30, 4,}; //... |
7 | const byte outZu[anz] = {31, 5,}; //... |
8 | const byte outLauf[anz] = {32, 6,}; //... |
9 | long premilis[anz] = {100, 100, 100, 100, 100, 100}; |
10 | |
11 | void setup() { |
12 | for (byte i = 0; i < anz; i++) { |
13 | pinMode(inAuf[i], INPUT_PULLUP); |
14 | pinMode(inZu[i], INPUT_PULLUP); |
15 | pinMode(outAuf[i], OUTPUT); |
16 | digitalWrite(outAuf[i], HIGH); |
17 | pinMode(outZu[i], OUTPUT); |
18 | pinMode(outLauf[i], OUTPUT); |
19 | }
|
20 | }
|
21 | void loop() { |
22 | for (byte i = 0; i < anz; i++) { |
23 | if (digitalRead( inAuf[i]) == HIGH && last[i] == LOW) { |
24 | digitalWrite(outLauf[i], HIGH); //Schrankenlauf |
25 | digitalWrite(outAuf[i], LOW); |
26 | digitalWrite(outZu[i], LOW); |
27 | }
|
28 | }
|
29 | }
|
:
Bearbeitet durch User
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?!
Nicolas schrieb: > die dann 5 sec später eine LED steuern sollen. So etwa?
1 | enum stateT {oben, runter, unten , rauf}; |
2 | stateT state[anz]; |
3 | |
4 | void loop() { |
5 | for (byte i = 0; i < anz; i++) { |
6 | switch (state[i]) { |
7 | case oben: |
8 | if (digitalRead(inZu[i]) == HIGH) { |
9 | state[i] = runter; |
10 | digitalWrite(outLauf[i], HIGH); |
11 | digitalWrite(outAuf[i], LOW); |
12 | digitalWrite(outZu[i], LOW); |
13 | premillis[i] = millis(); |
14 | }
|
15 | break; |
16 | case runter: |
17 | if (millis() - premillis[i] >= Laufzeit) { |
18 | state[i] = unten; |
19 | // LED schalten?
|
20 | digitalWrite(outLauf[i], HIGH); |
21 | }
|
22 | break; |
23 | case unten: |
24 | if (digitalRead(inAuf[i]) == HIGH) { |
25 | state[i] = rauf; |
26 | digitalWrite(outLauf[i], LOW); |
27 | digitalWrite(outAuf[i], HIGH); |
28 | digitalWrite(outZu[i], LOW); |
29 | premillis[i] = millis(); |
30 | }
|
31 | break; |
32 | case rauf: |
33 | if (millis() - premillis[i] >= Laufzeit) { |
34 | state[i] = oben; |
35 | // LED schalten?
|
36 | digitalWrite(outLauf[i], HIGH); |
37 | }
|
38 | break; |
39 | }
|
40 | }
|
41 | }
|
:
Bearbeitet durch User
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.
Ein Schaltlan wäre auch sinnvoll, um zu sehen, wohin die Tasten, LEDs schalten. Pullup beißt sich nämlich mit high aktiv (sagte ich schon).
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:
1 | void loop() { |
2 | for (byte i = 0; i < anz; i++) { |
3 | automat(i); |
4 | {
|
5 | {
|
Aber das ist natürlich Geschmackssache.
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) ;-)
Danke an alle die sich hier mit eingebracht haben ich habe es jetzt realisieren können mit der state machine (diesmal wirklich) viele Grüße Nicolas
Nicolas schrieb: > ich habe es jetzt realisieren können mit der state machine > (diesmal wirklich) Zeig doch mal deinen Quelltext.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.