Wechselndes LED Blitzen

Tach zusammen,

ich bastel an einer Beleuchtung für ein RC Flugzeug.

Dafür soll am Ende eine rote LED etwa im 1000ms Takt aufblitzen.
In den Pause soll eine weiße LED kurz doppel-blitzen.

Das einzelne Blitzen kriege ich hin:

  if (millis() - time > 1500) {        // Blitzlicht ROT
      time = millis();
        digitalWrite(FlashLightsR, HIGH);
    }
    if (millis() - time > 20) {
        digitalWrite(FlashLightsR, LOW);
    }

Wie realisiere ich aber in den Pausen ein weiteres Blitzen?
Sollte ich die millis besser in eine Variable schreiben anstatt sie direkt zu verwenden?

Danke
Cappy

Hallo,

Dein Ansatzt mit millis war schon mal gut.

Du benötigst z.B eine Schrittkette oder Ablaufsteuerung (State mashine). die du in Abhängigkeit von millis() steuerst. Beispiele wie man das macht gibts reichlich.
Mit den Zeiten kannst Du ja noch etwas spielen.

Vorschlag:

  1. rote LED ein
  2. nach 100 ms aus
  3. nach 250ms weisse LED ein
  4. nach 100 ms Weiss aus
    5.nach 300 ms weiss ein
  5. nach 100 ms weiss aus
  6. nach 250 ms wieder bei 1 anfangen

Die Wartezeiten kannst Du natürlich in Variable legen.

Wenn das Ding sonst nichts mehr machen soll kannst Du auch delay nehmen. (Asche über mein Haupt :slight_smile: )

Heinz

Viele Wege sind möglich, für ein anderes Thema hatte ich mal diesen Ansatz:

const byte ledrot = 8;
const byte ledweiss = 9;

const unsigned int intervall[] = {400, 50, 400, 50, 50, 50};
const byte anzahl = sizeof(intervall) / sizeof(intervall[0]);
unsigned long zeit_jetzt, zeit_vorhin;
byte schritt;

void setup() {
  pinMode(ledrot, OUTPUT);
  pinMode(ledweiss, OUTPUT);
}

void loop() {
  zeit_jetzt = millis();
  if ((zeit_jetzt - zeit_vorhin) >= intervall[schritt]) {
    zeit_vorhin = zeit_jetzt;
    switch (schritt) {
      case 0:
        digitalWrite(ledrot, HIGH);
        break;
      case 1:
        digitalWrite(ledrot, LOW);
        break;
      case 2:
        digitalWrite(ledweiss, HIGH);
        break;
      case 3:
        digitalWrite(ledweiss, LOW);
        break;
      case 4:
        digitalWrite(ledweiss, HIGH);
        break;
      case 5:
        digitalWrite(ledweiss, LOW);
        break;
    }
    schritt = (schritt + 1) % anzahl;
  }
}

Auf Kosten von Speicher geht es kürzer:

#define ROT 8
#define WEISS 9

const unsigned int intervall[] = {50,  400,    50,    50,    50,   400};
const byte ledpin[]            = {ROT, ROT, WEISS, WEISS, WEISS, WEISS};
const byte anzahl = sizeof(intervall) / sizeof(intervall[0]);
unsigned long zeit_jetzt, zeit_vorhin;
byte schritt;

void setup() {
  pinMode(ROT, OUTPUT);
  pinMode(WEISS, OUTPUT);
  digitalWrite(ROT, HIGH);
}

void loop() {
  zeit_jetzt = millis();
  if ((zeit_jetzt - zeit_vorhin) >= intervall[schritt]) {
    zeit_vorhin = zeit_jetzt;
    schritt = (schritt + 1) % anzahl;
    digitalWrite(ledpin[schritt], !digitalRead(ledpin[schritt]));
  }
}

Bei mehr Geblinke könnte auch eine Struktur sinnvoll sein:

#define ROT 8
#define WEISS 9

//const unsigned int intervall[] = {50,  400,    50,    50,    50,   400};
//const byte ledpin[]            = {ROT, ROT, WEISS, WEISS, WEISS, WEISS};

struct Blinken {
  Blinken(const unsigned int intervall, const byte ledpin) : intervall(intervall), ledpin(ledpin) {}

  const unsigned int intervall; 
  const byte ledpin;
};

Blinken blinken[] {
  {50, ROT},
  {400, ROT},
  {50, WEISS},
  {50, WEISS},
  {50, WEISS},
  {400, WEISS}
};

const byte anzahl = sizeof(blinken) / sizeof(blinken[0]);
unsigned long jetzt, vorhin;
byte schritt;

void setup() {
  pinMode(ROT, OUTPUT);
  pinMode(WEISS, OUTPUT);
  digitalWrite(ROT, HIGH);
}

void loop() {
  jetzt = millis();
  if ((jetzt - vorhin) >= blinken[schritt].intervall) {
    vorhin = jetzt;
    schritt = (schritt + 1) % anzahl;
    digitalWrite(blinken[schritt].ledpin, !digitalRead(blinken[schritt].ledpin));
  }
}

cappy0815:
Wie realisiere ich ... ?

Guck da: Weekender – Ein Automat ohne delay()

Gruß

Gregor

Da gibt es von combie eine sehr schöne Library, mit der das einfach aufzubauen ist.
Leider kann ich hier am Tablett nicht sagen, wie die genau heißt.
Ich glaube “combie-SimpleTimer”.
Oder hier bzw. hier.

So grad nochmal gelesen. Der zweite Link (interval.zip) ist die Lösung für dein Problem.
Nimm das Beispiel “IntervalTest” und passe die Zeiten an.

Oh wei, oh wei ...

Das sind ja viele Ansätze.
Ich würde zunächst gerne bei den Millis bleiben.

Muss ja nicht mehrere Kapitel aufmachen.

Diese Schrittkette könnte ein Problem geben, oder?

Ich habe zwei Schalterstellungen, in denen jeweils andere Programme laufen.
Ist besagte Kette 1x gestartet, bekomme ich den Schalter aber nicht mehr mit, oder?

Ich hatte jetzt mal das hier versucht ...

    if (millis() - timeW > 500) {        // Blitzlicht WEISS
        digitalWrite(FlashLightW, HIGH);
        timeW = millis();
    }
    if (millis() - timeW > 20) {
        digitalWrite(FlashLightW, LOW);
    }
    
    if (millis() - timeR > 1500) {        // Blitzlicht ROT
        digitalWrite(FlashLightsR, HIGH);
        timeR = millis();
    }
    if (millis() - timeR > 20) {
        digitalWrite(FlashLightsR, LOW);
    }

... das will aber auch nicht so recht.

Blicke aber nicht, warum.

Cappy

cappy0815:
... das will aber auch nicht so recht.
Blicke aber nicht, warum.

Dann lerne, wie ein endlicher Automat arbeitet. Zu kapieren, was Rekursion ist, ist schwieriger. Lies und verstehe einfach mal.

Gruß

Gregor

cappy0815:
Ich würde zunächst gerne bei den Millis bleiben.

Mir ist unklar, was Du damit meinst, da in meinem Beispiel millis verwendet werden.

cappy0815:
Diese Schrittkette könnte ein Problem geben, oder?

Ich wüßte nicht, wie da ein Problem entstehen sollte.

cappy0815:
Blicke aber nicht, warum.

Mit einem Fragment kann zumindest ich wenig anfangen.

Irgendwann hat mal hier jemand ein Projekt gemacht, wo das Feuer etlicher Leuchttürme simuliert wurde. Das entspricht doch ziemlich genau dem, was du vorhast. Bemüh mal die Suche

ElEspanol:
Irgendwann hat mal hier jemand ein Projekt gemacht, wo das Feuer etlicher Leuchttürme simuliert wurde.

Noch näher dran könnte das Thema Lichtsteuerung Modellflugzeug (Standmodell) sein.

cappy0815:
Diese Schrittkette könnte ein Problem geben, oder?

Ich habe zwei Schalterstellungen, in denen jeweils andere Programme laufen.
Ist besagte Kette 1x gestartet, bekomme ich den Schalter aber nicht mehr mit, oder?

Hallo,

Schrittkette macht kein Problem , wie kommst du darauf. Wenn Du sie richtig aufbaust, delay nicht verwendet , blokiert da nichts. Was sollen Deine beiden Schalter denn machen? Haben die was mit dem Blitzlicht zu tun oder machen die ganz was anderes?

die Vorschläge von Agmue sind doch genau das was Du willst. Verwende das mal und baue es mit Deinen Schaltern aus.

Heinz

Moin Leute,

sorry für die späte Rückmeldung. War am Wochenende nicht zu Hause.

Offenbar habe ich nicht gründlich gelesen, das hole ich nach.

Ich möchte aber auch nochmal betonen, dass es gar nicht so leicht ist, die richtigen Suchbegriffe zu finden und zu nutzen und dann die Suchergebnisse auch noch richtig auf die eigenen Wünsche zu deuten, wenn man nicht mit dem Thema vertraut ist.

Sogar bei "Ablaufsteuerung" und "Schrittkette" war ich nicht 100%ig sicher, was damit gemeint ist.
Daher ging ich bei Schrittkette von "delay" aus und das wiederum brachte mich zu der Annahme, dass ich zwischendrin eben quasi das Programm blockiere, weil es ja im Delay hängt.

Inzwischen habe ich aber (glaube ich) das erreicht, was ich wollte.

Die beiden Schalter sind ein 2-stufiger Schalter (habe ich das etwas noch nicht beschrieben)

Position 0 - AUS
Position 1 - LEDs an und weitere LEDs blitzen
Position 2 - Zusätzlich zu den bereits leuchtenden und blizenden LEDs sollen 2weitere LEDs an sein.

Hab Geduld mit mir ... :-/
Ich habe die dumme Angewohnheit nach schnellen Lösungen zu suchen und dabei manchmal nicht jeden Weg auf's genaue zu untersuchen.

In diesem Fall geht es mir gerade nicht so unbedingt darum viel tiefer in den Arduino einzutauchen, sondern ihn zu nutzen.

Das ist immer Phasenweise so ... spätestens im Winter wird es wieder mehr Projekte im heimischen Keller geben und dann über ich wieder am Arduino ... JETZT soll der Flieger blitzen und fliegen.

Danke für Eure Hilfe
Cappy

cappy0815:
Ich möchte aber auch nochmal betonen, dass es gar nicht so leicht ist, die richtigen Suchbegriffe zu finden und zu nutzen und dann die Suchergebnisse auch noch richtig auf die eigenen Wünsche zu deuten, wenn man nicht mit dem Thema vertraut ist.

Erst wer die Antwort kennt, kann die Frage richtig formulieren, das ist normal.

cappy0815:
Sogar bei "Ablaufsteuerung" und "Schrittkette" war ich nicht 100%ig sicher, was damit gemeint ist.

Die Schrittkette = endlicher Automat = finite state machine war für mich der Einstieg in leicht verständliche Lösungsansätze. Daher kann ich die Beschäftigung damit nur empfehlen.

cappy0815:
Hab Geduld mit mir ... :-/
Ich habe die dumme Angewohnheit nach schnellen Lösungen zu suchen und dabei manchmal nicht jeden Weg auf's genaue zu untersuchen.

Du bist ungeduldig, aber wir sollen Geduld haben, ja ja. "Wer den schnellen Erfog sucht, sollte Holz hacken." habe ich hier mal gelesen.

Dann laß es mal blitzen und habe Spaß!