US Blaulicht Umbau.

Hallo, da es mein erster Beitrag ist stelle ich mich erst einmal etwas vor.

Ich bin Gelernter KFZ Mechatroniker, und ich habe durch ein BGJ eklektrotechnik kabel und Ströme usw. für mich endeckt, und ich habe richtig löten gelernt.

Da ich hobby mäßig schon so dein ein oder anderen Modell lkw mit beleuchtung ausgestattet habe, bin ich irgedn wann auf Arduino gestoßen. Da ich meine Projekte in einer Facebook Gruppe Teile (Tim Held LED Tech) habe ich einen Auftrag bekommen. Ich soll ein Altes US Blaulicht (7 einzelne Lampen) mit LEDs wieder fit machen. Da fiel die wahl auf ein Arduino Uno R3.

Eine einfach blink/blitz folge habe ich bereits hin bekommen.

Zuerst beschreibe ich mal die Verdratung und die Komponenten.

Also: pro Lampe werden mehrere Platinen mit jeweils 6x1Watt power LED verbaut.
Da der Strom Logischerweise für die Uno R3 zu viel währe, werden die einzelnen Platinen über IRF540N MOSFET´s 100V 33A 44mOhm gesteuert. Um den Strom auf jedem Channel der UNO R3 zu begrenzen ist zwischen den ausgängen der UNO R3 und dem Jeweiligen MOSFET ein 2,2kOhm wiederstand.

Die einfach Blinkfolge läuft soweit, aber ich möchte gerne mehr:

  1. über die 4 eingänge der UNO R3 verschiedene blink/blitz folgen nach einander durch schalten.

  2. Alle ausgänge unabhängig von einander blinken/blitzen lassen (momentan blinken sie nur nach einander mit delay dazwischen da ich das blink Beispiel nur etwas umgeschreiben habe)

  3. ein Rundumlicht mit 6 bis 8 einzelnen platinen symulieren.

Wenn mir jemand bitte erklähren kann wie ich den Script schreiben muss währe das sehr cool, da ich noch neuling im schreiben der scripts bin.

MFG

Blinkwithoutdelay ist die Basis
dann erweitern mit array für die Hell/Dunkelzeiten
dann erweitern auf die Anzahl der Lampen, sprich dann werden die arrays zweidimensional.

delay() ist auf alle Fälle ungeeignet und verboten

INTERVAL.h könnte dir auch noch nützlich sein

Danke für die Antwort. Leider verstehe ich nicht was du mit zweidimensional meinst, und dit deiner beschreibung ist glaube ich erst mal nur punkt 3 abgehackt.

Wobei mir punkt 2 am wichtigsten ist.

mfg

Dann stell doch mal an code hier rein, was du schon hast. Bitte mit Code-Tags (Schaltfläche links oben </> ) umrahmen.

Timbonade:
Leider verstehe ich nicht was du mit zweidimensional meinst

Ich meine ein zweidimensionales Array für die Werte der Hell/Dunkelphasen. In einer Dimension stehen die Zeiten, in der anderen Dimension die Ausgänge

Timbonade:
3. ein Rundumlicht mit 6 bis 8 einzelnen platinen symulieren.

Das ist das einfachste mit INTERVAL.h. Du lässt einfach einen Zähler mitlaufen, der den jeweiligen Ausgang aktiviert. Vorher jedoch alle anderen zugehötigen Ausgänge deaktivieren. Wenn du beim letzten Ausgang angekommen bist, wieder auf Anfang, usw.

Und teile uns bitte mit, wie du deinen Kenntnisstand von C bzw. Arduino auf einer Skala von 1 bis 100 einschätzt.

Timbonade:
Wenn mir jemand bitte erklähren kann wie ich den Script schreiben muss währe das sehr cool, da ich noch neuling im schreiben der scripts bin.

Schau mal, ob Dir Anleitung: Endlicher Automat mit millis() hilft. Rudi hat dann später eine Version in OOP erstellt und auch einen Schaltplan gemalt.

Innerhalb des Themas findest Du auch weitere Links.

Beim Thema Lichtsteuerung Modellflugzeug (Standmodell) findest Du auch ein zweidimensionales Feld:

const boolean programme[anzahlProgramme][anzahlLeds] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 1, 1},
  {1, 0, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1}
};

ElEspanol:
delay() ist auf alle Fälle ungeeignet und verboten

Könnten wir uns auf "... hier ungeeignet und unnütz ..." einigen?

hi,

Könnten wir uns auf "... hier ungeeignet und unnütz ..." einigen?

ich gehe noch weiter und sage: für ein rundumlicht die einfachste lösung.

gruß stefan

Eisebaer:
ich gehe noch weiter und sage: für ein rundumlicht die einfachste lösung.

Möglicherweise nutze ich delay() zu selten, um es als einfachste Lösung ansehen zu können. Aber es soll ja mehr als ein Rundumlicht sein.

Andererseits kommt der TO mit delay() nicht ans Ziel seiner Wünsche, weshalb die Variante mit millis() eine Alternative darstellt, die aufzuzeigen sich lohnt.

Ich bin gespannt auf den Sketch, den er uns zeigt, dann wissen wir schonmal mehr.

bei dem was der TO realisieren möchte, ist delay() für die Programmierung absolut fehl am Platze.
Nicht nur unnütz.

für ein Rundumlicht, bei dem der uC wirklich nix anderes machen muss, wäre delay() möglich. Soll aber noch ein Taster dran, ist es schon Essig

Hallo und danke für die Antworten, also Wissensstand von 1 bis 100 befinde ich mich glaube ich bei 1 höchstens 2... Asche auf mein Haupt. Ich hoffe auch durch dieses Projekt etwas zu lernen.

Also der code der momentan endlos läuft ist dieser:

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(4, LOW);
  digitalWrite(3, LOW);
  digitalWrite(13, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(200);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(13, LOW);
  digitalWrite(4, LOW);
  digitalWrite(3, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(200);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(4, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(30);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  delay(30);
}

so und nun wird eventuell klar was ich mit ´´nach einander´´ und ´´unabhängig blinken von einander´´ meine...

Also erst mal möchte ich wissen wie ich die Ausgänge, wie gesagt, unabhängig von einander mit verschiedenen geschwindigkeiten blinken lassen kann.

Die Rundumlicht symulation nehmen wir uns dann vor.

Und dann, das ich die blinkfolgen über einen Eingang weiter schalten kann.. Da wo ich die Arduino gekauft habe meinte jemand ich müsse ein Menü erstellen oder so.. na ja dazu später.

mfg

hiermit blitzt schon mal eine:

#include <INTERVAL.h>

byte LED = 13;
byte x;
unsigned long dauer[8] = {200, 10, 100, 50, 150, 70, 250, 30};     // Hell/Dunkel in ms

void setup()
{
  pinMode(LED, OUTPUT);
}


void loop() {

  INTERVAL(dauer[x])
  {
    digitalWrite(LED, !digitalRead(LED));
    x++;
    if (x == sizeof(dauer) / 4) x = 0;
  }

}

edit: INTERVAL hier

Und hier ist ein Blitz und das Rundlicht. Einfach gestrickt, leuchtet nur eine Led, die im Kreis läuft.

#include <INTERVAL.h>

byte LED = 13;   // Blitzlicht
byte rundlicht[] = {2, 3, 4, 5, 6, 7}; // Pins für das Rundlicht
byte x;
byte rundlichtx;
unsigned long dauer[8] = {200, 10, 100, 50, 150, 70, 250, 30};     // Hell/Dunkel in ms

void setup()
{
  for (byte a = 0; a < sizeof(rundlicht); a++) pinMode(rundlicht[a], OUTPUT);
  pinMode(LED, OUTPUT);
}


void loop() {

  INTERVAL(dauer[x])
  {
    digitalWrite(LED, !digitalRead(LED));
    x++;
    if (x == sizeof(dauer) / 4) x = 0;
  }

  INTERVAL(100)
  {
    for (byte a = 0; a < sizeof(rundlicht); a++) digitalWrite(rundlicht[a], LOW);
    digitalWrite(rundlicht[rundlichtx], HIGH);
    rundlichtx++;
    if (rundlichtx == sizeof(rundlicht)) rundlichtx = 0;
  }
}

Hi, und danke schon mal, ich versuche dann mal den code zu verstehen mit byte und x und so, momentan blicke ich noch nicht durch.

wie viel aufwand währe es den code so zu schreiben das jede led des Rundumlichtes über pwm angestuert wird damit die leds nacheinander sanft auf läuchten und wieder schwächer werden, damit es noch echter nach einem Rundumlich aussieht?

Aber nochmals fetten dank für den code.

Timbonade:
wie viel aufwand währe es den code so zu schreiben das jede led des Rundumlichtes über pwm angestuert wird

Das habe ich für einen Leuchtturm gemacht, der Aufwand ist grundsätzlich kein Problem. Allerdings sind die Ausgänge des UNO, die PWM können, für Deine Anwendung zu wenige. Abhilfe schafft beispielsweise TLC5940 oder PCA9685.

Hallo,

vielleicht kann man paar LEDs zusammenfassen. Wenn ich mir das wilde Geflacker so anschaue, dann leuchten immer welche gemeinsam. Spart Leitungen und Code.

oder in Hardware :slight_smile:

Findet jemand für das Blaulicht, egal erstmal ob US oder deutsches, eine Beschreibung der Abfolge?
Es gibt doch bestimmt eine Norm dafür wie das zu leuchten hat.

Also bei den DIN habe ich nix über US Blaulicht gefunden :slight_smile: :slight_smile: :slight_smile:

:grin:

Timbonade:
Also erst mal möchte ich wissen wie ich die Ausgänge, wie gesagt, unabhängig von einander mit verschiedenen geschwindigkeiten blinken lassen kann.

Ein schönes Beispiel findest Du in #10, wobei mir INTERVAL immer sympathischer wird.

Bezogen auf Deine Frage habe ich 12 scheinbar chaotisch blinkende Leds mit Hilfe von millis() (I am old school) angesteuert. Wie Du sehen kannst, ist das Programm recht kurz, dafür verwende ich ein zweidimensionales und mehrere eindimensionale Felder.

Leider habe ich gerade keine 12 LEDs zur Hand, weshalb ich einen LED-Streifen APA102 verwende. Die entsprechenden Programmteile habe ich gekennzeichnet. Die kannst Du löschen und durch Deine normale Initialisierung usw. ersetzen.

/* APA102 Anfang */
#include "FastLED.h"
FASTLED_USING_NAMESPACE
#define LED_TYPE    APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS  64
#define NUM_LEDS    12
CRGB leds[NUM_LEDS];
/* APA102 Ende */

const byte anzlichtIntervall = 4, anzLeds = NUM_LEDS;
const unsigned int lichtIntervall[anzLeds][anzlichtIntervall] =
{
/*  0 */  {200, 75, 100, 75},
/*  1 */  {100, 75,  11, 75},
/*  2 */  {200, 75, 101, 75},
/*  3 */  {100, 75,  12, 75},
/*  4 */  {200, 75, 102, 75},
/*  5 */  {100, 75,  13, 75},
/*  6 */  {200, 75, 103, 75},
/*  7 */  {100, 75,  14, 75},
/*  8 */  {200, 75, 104, 75},
/*  9 */  {100, 75,  15, 75},
/* 10 */  {200, 75, 105, 75},
/* 11 */  {100, 75,  16, 75}
};

byte index;
unsigned int lichtZaehler[anzLeds];
bool lichtStatus[anzLeds];

unsigned long aktMillis, lichtMillis[anzLeds];

void setup() {
/* APA102 Anfang */
  FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  LEDS.showColor(CRGB(0, 0, 0));
/* APA102 Ende */
}

void loop()
{
  aktMillis = millis();
  if (aktMillis - lichtMillis[index] >= lichtIntervall[index][lichtZaehler[index]]) {
    lichtMillis[index] = aktMillis;
    dW(index, lichtStatus[index]);    // ersetzt digitalWrite()
    lichtStatus[index] = !lichtStatus[index];
    lichtZaehler[index]++;
    lichtZaehler[index] = lichtZaehler[index] % anzlichtIntervall;
  }
  index++;
  index = index % anzLeds;
}

/* APA102 Anfang */
void dW(byte pos, bool status) {
  if (status) {
    leds[pos] = CRGB::White;
  } else {
    leds[pos] = CRGB::Black;
  }
  // send the 'leds' array out to the actual LED strip
  FastLED.show();
}
/* APA102 Ende */

Mir flimmern schon die Augen vor lauter Geflacker :o


ElEspanol:
Also bei den DIN habe ich nix über US Blaulicht gefunden :slight_smile: :slight_smile: :slight_smile:

:grin:

Das "Überblenden" vom Rundumlicht würde ich per Hardware lösen. Ich nehme an, jeder "Leuchtpunkt" besteht aus mehreren LEDs. Bau die einfach etwas überlappend und fertig.

Also ich verstehe immer weniger in dem code, die ganzen bezeichnungen und warum wann welcher ausgang angesteuert wird und welcher nicht.... Ich müsste erst mal die ganzen Bezeichnungen und deren Auswirkung und Zusammenhänge lernen... Den ersten Code habe ich ja noch nicht mal ganz verstanden.... sorry das ich so unwissend bin.

Von wegen Hadware überblenden, ist nicht möglich es werden wie gesagt mehrere patinen mit jeweil 6 x 1Watt power LED verbaut und da ist der abstand nun mal fix.

Zum Thema Din oder so, wür deutschland mag es eine feste Blink folge geben, bei den US dingern habe ich bereits das Internet durchsucht und keine kostante gefunden... auch die anordnung der einzelnen lampen ist unter den US Blaulichtern nicht fest gelegt... Huptsache blink und leuchtet in allen farben...

So zum abschluss nochmals; ich bin absoluter neuling im schreiben von codes. Gibt es irgend wo eine gescheite Deutsche grund Anleitung mit den ganzen Code Begriffen??

MFG

Timbonade:
Also ich verstehe immer weniger in dem code, ...

Das ist schade, denn ich wollte Dir nur mal eine Lösungsmöglichkeit skizzieren.