Delay Arduino

Gast #6962327
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
Angehängte Dateien:
Gast #6962348
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?
#6962352
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?
#6962357
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.
#6962386
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
}
Gast #6962462
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?!
#6962499
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
}
Gast #6962513
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.
Gast #6963019
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.
Angehängte Dateien:
#6963033
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.
#6963041
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.
Gast #6963362
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.
#6963409
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.
Gast #6964101
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren