Lichtsteuerung Modellflugzeug (Standmodell)

Hallo,

ich bin ganz neu in der Welt von Arduino und der Programmierung.

Ich möchte eine Lichtsteuerung für ein Modellflugzeug erstellen, welches diverse Unterprogramme zum Anschalten einzelner Lichter hat (Taster soll die Programme wechseln). Hinzu kommt, dass zusätzlich noch die Blitzlichter blinken sollen, aber halt nur in ein paar Programmen und in anderen halt nicht. Habe schon ziemlich viel durchforstet, um ähnliche Programme zu finden... leider vergebens. ABER ein netter Herr hat hier sein Programm zur Schiffssteuerung vorgestellt. Dieses wollte ich als Hilfe verwenden , weil da der Lichtprogrammwechsel mit einem "const boolean" ausgeführt wird und es einfach gesagt nur der Binäre Code (Licht an oder aus) ist. Auch ist mir bewusst geworden, dass die Blinkgeschichte mit der Funktion Blink without delay gemacht werden sollte... meine Frage aber hier: Kann ich mit dieser Funktion auch Doppelblitze erzeugen? Am besten zeige ich euch einfach mal so den Schaltfolge bei den Programmen:

// Programme:
// 0 - Cold and Dark
// 1 - Day: NAV
// 2 - Day: NAV/Beacon
// 3 - Day: NAV/Beacon/Taxi
// 4 - Day: NAV/Beacon/Taxi/Landing/Strobes
// 5 - Night: NAV/Logo/Innenbeleuchtung
// 6 - Night: NAV/Logo/Innenbeleuchtung/Beacon
// 7 - Night: NAV/Logo/Innenbeleuchtung/Beacon/Taxi
// 8 - Night: NAV/Logo/Innenbeleuchtung/Beacon/Taxi/Landing/Strobes

Das Beacon blitzt einmal und die Strobes sollen doppelblitzen...

ein originalgetreues Blitzen hatte ich ohne die blink without delay funktion erstellt, aber in einem anderen Programm...
siehe hier:

int AirbusBeaconLED = 5;
int AirbusStrobeLED = 6;
int BoeingBeaconLED = 10;
int BoeingStrobeLED = 7;

void setup() {
  
  //LEDs für Airbus und Boeing
  pinMode(AirbusBeaconLED, OUTPUT);
  pinMode(AirbusStrobeLED, OUTPUT);
  pinMode(BoeingBeaconLED, OUTPUT);
  pinMode(BoeingStrobeLED, OUTPUT);


}

void loop() {
  
  StrobeAirbus();
  delay(180);
  StrobeAirbus();
  delay(700);
  BeaconAirbus();


  StrobeBoeing();
  delay(700);
  BeaconBoeing();

}

int StrobeAirbus() {
  digitalWrite(AirbusStrobeLED, HIGH);
  delay(5);
  digitalWrite(AirbusStrobeLED, LOW);
}
int StrobeBoeing() {
  digitalWrite(BoeingStrobeLED, HIGH);
  delay(5);
  digitalWrite(BoeingStrobeLED, LOW);
}

int BeaconAirbus() {
  digitalWrite(AirbusBeaconLED, HIGH);
  delay(5);
  digitalWrite(AirbusBeaconLED, LOW);
}

int BeaconBoeing() {
  digitalWrite(BoeingBeaconLED, HIGH);
  delay(5);
  digitalWrite(BoeingBeaconLED, LOW);
}

Das müsste ja eigentlich in die Funktion umgesetzt werden, also mit Interval etc... blicke aber langsam nicht mehr durch :smiley: dachte ich bastel mir aus verschiedenen Programmen was zusammen, da ich selber nicht gerade der "Programmierer" bin und eher nicht durchblicke... :smiley: Ich würde mich echt freuen, wenn mir jemand von euch helfen könnte, diese Programmteile zu einer genialen Lichtsteuerung zusammenzubasteln. (**Aus vielen Dingen mach eins **)

Hier mal mein aktueller Code für die Lichtsteuerung OHNE die blitzfunktionen (die aber rein sollen): funktioniern tut er nicht :smiley: (wen wundert´s)

Danke schonmal ! :slight_smile:

Hallo und willkommen im Forum!

Schau mal, ob Dir Anleitung Endlicher Automat mit millis() hilft. Das Blaulicht entspricht Deinem Blitzer, wenn Du die Zeiten etwas anpaßt.

Hey,

Danke für die Willkommensgrüße!

Werde da gleich mal reinschauen :wink:

Oder einfach in BlinkWirhoutDelay nen Zähler einbauen, schon hast du nen recht flexiblen Taktgeber, denn den Zähler kannst du nun abfragen und
-ist er eins, blinkt es schnell
-ist er zwei, blinkt es langsam
usw.usf.
Im Grunde muss nur das eigentliche Intervall so kurz sein, wie das kürzeste, benötigte, und die längeren sind dann einfach Vielfache von. Das geht beliebig genau...
So bastel ich mir oft flexible Timer, die man andauernd braucht.

Die Problematik ist vergleichbar mit dem “belebten Haus” auf einer Modelleisenbahnanlage. Neben dem Ein- und Ausschalten der Beleuchtung gibt es auch noch das flackernde Licht beispielsweise des Fernsehers. Ich habe das mit einer Trennung beider Abläufe gelöst. Das Beleuchtungsprogramm schaltet über einen Merker die Funktion des Flackerns ein, während das Flackern selbst durch einen separaten Programmteil erzeugt wird. Mein im Detail sicher noch zu optimierenderer Vorschlag:

const byte LED_AUSGAENGE[] = { 2, 3, 4, 5, 6, 7, 8, 9}, taster = A0, blitzLed = 7;
bool aktTaster, altTaster, blitz;
byte prgNr;                          // aktuelles Programm
const unsigned int blitzZeiten[] = {50, 50, 50, 400};
const byte anzahlBlitzZeiten = sizeof(blitzZeiten) / sizeof(blitzZeiten[0]);
byte blitzZeitenNr;
unsigned long aktMillis, blitzMillis;

// hier werden die Programme definiert
const byte anzahlProgramme = 9, anzahlLeds = sizeof(LED_AUSGAENGE);
const boolean programme[anzahlProgramme][anzahlLeds] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 1, 0},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1}
};

void prgwechsel(byte nr) {
  Serial.print("prgNr: ");
  Serial.print(prgNr);
  Serial.print("  IOs:");
  for (byte j = 0; j < anzahlLeds; j++) {
    digitalWrite(LED_AUSGAENGE[j], programme[nr][j]);  // LED schalten
    Serial.print("  ");
    Serial.print(programme[nr][j]);
  }
  Serial.println();
}

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(taster, INPUT_PULLUP);
  for (byte j = 0; j < anzahlLeds; j++) {
    pinMode(LED_AUSGAENGE[j], OUTPUT);
  }
  prgwechsel(0);  // Anfangsstatus -> alles Aus
  aktTaster = digitalRead(taster);
  altTaster = aktTaster;
}

void loop() {
  aktMillis = millis();
  altTaster = aktTaster;
  aktTaster = digitalRead(taster);
  if (!altTaster && aktTaster) {
    delay(30);
    prgNr++;
    prgNr = prgNr % anzahlProgramme;
    prgwechsel(prgNr);
    blitz = digitalRead(LED_AUSGAENGE[blitzLed]);
    blitzZeitenNr = 0;
    blitzMillis = aktMillis;
  }
  if (blitz && (aktMillis - blitzMillis >= blitzZeiten[blitzZeitenNr])) {
    digitalWrite(LED_AUSGAENGE[blitzLed], !digitalRead(LED_AUSGAENGE[blitzLed]));
    blitzMillis = aktMillis;
    blitzZeitenNr++;
    blitzZeitenNr = blitzZeitenNr % anzahlBlitzZeiten;
  }
}

WOW!

das sieht doch schon mal richtig richtig gut aus. :slight_smile:

Ich setzte mich mal gleiich dran und schau mal wie es aussieht!!

Vielen lieben Dank schonmal für die ganze Mühe ! :wink:

biberlecram:
Bsp Pin 7 ist Blitz (im Porgramm) und im Aufbau steckt auch eine Led in Pin 7 drin, aber komischer weiße blitzt die Led an Pin 5.. ganz merkwürdig.

Bei mir blitzt nur die letzte LED. Ich habe die Ausgänge für den UNO anders konfiguriert, hast Du das für Deine Verhältnisse (mit welchem Arduino?) geändert?

Arduino Mega 2560… was muss ich denn machen?
soll ich mal den Code einstellen?

Es geht um diese Zeile, die Du an Deine Verhältnisse anpassen mußt:const byte LED_AUSGAENGE[] = { 2, 3, 4, 5, 6, 7, 8, 9}, taster = A0, blitzLed = 7;

blitzLed2 = 10 gibt es nicht, da das Feld nur neun Werte hat. Also blitzLed2 muß kleiner als anzahlLeds sein. Der Index geht von 0 bis 8.