Forum: Mikrocontroller und Digitale Elektronik Delay Arduino


von Nicolas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Super (Gast)


Lesenswert?


von EAF (Gast)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Helmut H. (helmuth)


Lesenswert?

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
von Tom (Gast)


Lesenswert?

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?!

von Helmut H. (helmuth)


Lesenswert?

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
von PittyJ (Gast)


Lesenswert?

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.

von Nicolas (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nicolas (Gast)


Angehängte Dateien:

Lesenswert?

Ablaufdiagramm

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Nicolas schrieb:
> Unbenanntes_Diagramm.drawio

Was soll das für ein Dateiformat sein und welches Programm kann damit 
etwas anfangen?

Nicolas schrieb:
> Ablaufdiagramm.png

von Helmut H. (helmuth)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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 ;-)

von Stefan F. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Nicolas (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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?

von quotendepp (Gast)


Lesenswert?

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) ;-)

von Nicolas (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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
Noch kein Account? Hier anmelden.