US Blaulicht Umbau.

Timbonade:
.... sorry das ich so unwissend bin.

Wir sind alle unwissend, kommt immer auf das Gebiet an :wink:

Timbonade:
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.

Sind die bereits fertig oder musst du die bauen?

Die platinen sind so gesehen fertig, ich muss nur die LEDs an sich auf löten, aber die platinen müssen so relativ groß ausfallen 50mm x 90mm da 6 x 1Watt Power led gekühlt werden möchten...

Ich muss wie gesagt erst mal die grund sprache lernen.

Könntest du mir erst mal schritt für schritt den code so ein wenig erklähren warum z.B. warum da mehrere zahlen stehen und was die zu sagen haben:

const unsigned int lichtIntervall[anzLeds][anzlichtIntervall] =
{
/* 0 */ {200, 75, 100, 75},

Hallo,

das ist ein 2 dimensionales array.

das wäre ein eindimensionales

const unsigned int lichtIntervall[] =
{
/*  0 */  {200, 75, 100, 75},
}

hinter // oder zwischen /* ... */ sind nur für den Codeleser Kommentare.

Grundlagen lernen ist für dich erstmal das wichtigste überhaupt.

helfen könnte dir ein Buch zu kaufen über Arduino. Von Erik Bartmann oder eben andere.
oder

oder

oder
hier auf der Seite hier ganz oben Learning, Tutorials und Reference, wird oft vernachlässigt.

@Doc: Für ein eindimensionales array hast du relativ viele geschweifte Klammern und meinst sicherlich

const unsigned int lichtIntervall[] = {200, 75, 100, 75};

Mir ist auch nicht klar, ob es Timbonade um den "Sinn" der Zahlen in diesem Sketch, oder um eine Einführung in die Programmiersprache C geht.

Mit kleinen Anpassungen im Code ginge auch meine Variante für eine animierte WerbetrafelÖ

int takt = 9; // SH_CP
int speicher = 8; // ST_CP
int daten = 10; // DS
int dimPin = 6; 
byte a[]={
  0b00000000, //  0   dunkel
  0b00000001, //  1        M
  0b00000011, //  2        ME
  0b00000111, //  3        MET
  0b00010111, //  4      < MET
  0b00100111, //  5     <  MET
  0b01000111, //  6    <   MET
  0b10000111, //  7   <    MET
  0b11110111, //  8   <<<< MET
  0b10001111  //  9  <---- MET
};

void setup(){
pinMode(takt, OUTPUT);
pinMode(speicher, OUTPUT);
pinMode(daten, OUTPUT);
pinMode(dimPin, OUTPUT);
analogWrite(dimPin, 0);
}
void shift595(int index, int t)
{
   digitalWrite(speicher, LOW);
   shiftOut(daten, takt, MSBFIRST, a[index]);
   digitalWrite(speicher, HIGH);
   delay(t);
}

void loop(){
shift595 (1, 200); 
shift595 (2, 200);
shift595 (3, 200);

shift595 (4, 50);
shift595 (5, 50);
shift595 (6, 50);
shift595 (7, 50);
shift595 (3, 50);

shift595 (4, 50);
shift595 (5, 50);
shift595 (6, 50);
shift595 (7, 50);
shift595 (3, 50);

shift595 (4, 50);
shift595 (5, 50);
shift595 (6, 50);
shift595 (7, 50);
shift595 (3, 50);

shift595 (4, 50);
shift595 (5, 50);
shift595 (6, 50);
shift595 (7, 50);
shift595 (3, 50);

shift595 (4, 50);
shift595 (5, 50);
shift595 (6, 50);
shift595 (7, 50);
shift595 (3, 500);

shift595 (9, 200);
shift595 (3, 200);
shift595 (9, 200);
shift595 (3, 200);
shift595 (9, 200);
shift595 (3, 200);

shift595 (0, 500);
}

Allerdings habe ich noch ein 74HC595 Schieberegister genutzt, da ich von der Umgebungshelligkeit abhängig alles dimmen wollte. Davon habe ich allerdings keinen Gebrauch gemacht.
Man könnte auch das Schieberegister weglassen und alles mit digitalWrite, oder noch eleganter lösen, indem man eine Zeile des Arrys in ein Portregister schaufelt. Bei mehr als 8 benötigten Ausgängen dann hat 2 Portregister.
Da ich nur eine begrenzte Anzahl von Kombinationen brauche, habe ich die oben in einem Arry abgelegt. In der Loop wird in jeder Zeile der in void definierte shift595 Befehl abgearbeitet. Als Parameter ist die Zeile im Arry, die das jeweilige Leuchtmuster beeinhaltet und die Zeitdauer, die sie aufgerufen werden soll, hinterlegt. Da der Controller sonst mit nichts weiter beschäftigt ist, habe ich zum "bösen" delay gegriffen :wink:

Hallo,

ja Micha, das war noch vom kürzen vom obigen Bsp. übrig geblieben, leider. Man soll weniger kopieren.
Hätte ich gleich ein eigenes Bsp. getippt, wäre es richtig gewesen.
Danke für die Korrektur.

Hallo.

Mir ist auch nicht klar, ob es Timbonade um den "Sinn" der Zahlen in diesem Sketch, oder um eine Einführung in die Programmiersprache C geht.

mir geht es um beides. Danke für den Buch Tipp und die Links werde mich mal belesen.

Aber wie ich merke muss ich wohl die Programmiersprache C lernen...

Ach ja von wegen pwm blinken und Rundumleuchte symulieren, und dann zu wenig PWM Ansschlüsse an der Arduino habe ich auch eine Lösung gefunden... Wenn die Arduino 4 PWM Ausgänge besitzt, kann ich ja immer 2 Platinen die sich gegenüber liegen über einen Ausgang ansteuern.

Na ja erst mal vielen dank für eure Mühen. Werde mich noch mal melden sobald ich bisschen besser mit C klar komme.

Blaulicht = spezielle Version von Blinklicht --> das habe ich bis zum Erbrechen auf meiner Webseite breitgetreten (allerdings auf Englisch): Basic Effects | Blinkenlight Removing Flicker | Blinkenlight

Hallo,

du lebst auch noch Udo, lange nicht hier gesehen. :slight_smile:

Die ersten vier LEDs blinken, wie ich das von amerikanischen Polizeiautos aus Filmen kenne. Die weiteren bilden ein Lauflicht.

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

const byte anzlichtIntervall = 8, anzLeds = NUM_LEDS;
const unsigned int lichtIntervall[anzLeds][anzlichtIntervall] =
{
  /*  led0 */  {50, 100, 50, 300, 0, 0, 0, 0},
  /*  led1 */  {50, 300, 50, 100, 0, 0, 0, 0},
  /*  led2 */  {50, 300, 50, 100, 0, 0, 0, 0},
  /*  led3 */  {50, 100, 50, 300, 0, 0, 0, 0},
  /*  led4 */  {100, 80, 100,  0, 100,  0, 100,  0},
  /*  led5 */  {100,  0, 100, 80, 100,  0, 100,  0},
  /*  led6 */  {100,  0, 100,  0, 100, 80, 100,  0},
  /*  led7 */  {100,  0, 100,  0, 100,  0, 100, 80},
  /*  led8 */  {100,  0, 100,  0, 100,  0, 100, 80},
  /*  led9 */  {100,  0, 100,  0, 100, 80, 100,  0},
  /* led10 */  {100,  0, 100, 80, 100,  0, 100,  0},
  /* led11 */  {100, 80, 100,  0, 100,  0, 100,  0}
};

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;
    if (lichtIntervall[index][lichtZaehler[index]] > 0) {
      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 */

Ich hoffe, jemand hat Spaß daran :slight_smile:

Hallo, ich habe jetzt erst mal die Hardware bereit gestellt, und vom besitzer erfahren das er gar kein rundum licht unbedingt haben will..

Ich habe jetzt mal einen code geschreiben und würde gerne wissen ob das so funktioniert, und wie ich da noch mehrere Kontakte mit unterscheidlichen zeiten ansteuern kann.

mfg.

byte Kontakt1 = 2;
boolean value = LOW;
unsigned long previousMillis = 0;
unsigned long interval=1000;

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

void loop() 
{
 if(millis()-previousMillis>interval){
  previousMillis=millis();
value=!value;
digitalWrite(Kontakt1, value);  
}
}

Ob das funktioniert, solltest Du schon selbst testen können oder habe ich da was falsch verstanden?

Gruß Tommy.

Ich wollte erst mal wissen ob da grobe Fehler in der programmierung sind.

Nach groben Fehlern sieht es auf den ersten flüchtigen Blick nicht aus.

Programmieren lernen heißt auch probieren, Fehler finde, korrigieren und wieder probieren.
Mit Fragen ob es funktionieren könnte, lernt man nichts. Mut zum Fehler. An der Stelle kann nix passieren.
Wenn an anderer Stelle doch mal was stirbt (und da muss man sich schon Mühe geben) dann ist das halt Lehrgeld.

Gruß Tommy

Ich wollte erst mal wissen ob da grobe Fehler in der programmierung sind.

Das ist doch der BlinkWithoutDelay Sketch.

Wenn du deinen Pin2 ( Kontakt1 ) weder mit GND noch mit 5V oder Vin direkt verbindest, sondern einen Widerstand und eine LED nimmst, solltest du was sehen können.

auch wenn es nicht zu den ursprünglich gestellten Fragen gehört: der IRF540N ist hier vollkommen ungeeignet, da es kein Logic-Level Typ ist. Besser einen IRLZ34 dafür nehmen. Dann sind 2k2 zwischen Pin und Gate des MOSFET VIIIEEELLL zu viel. Das erhöht die Phase, in der der Mosfet im Linear-Betrieb ist unnötig und führt in der Folge zu einer ebenso unnötigen Erwärmung des MOSFET. Typische Werte sind hier eher im Bereich von 10 bis 300 Ohm (höhere Werte = schlechteres Schaltverhalten dafür geringere EMV Abstrahlung). Dafür sollte zusätzlich noch ein 10k Widerstand zwischen Gate und Source des Mosfet.

Hallo, habe es ausprobiert, es blinkt. Doch jetzt meine Frage wie bekomme ich ein Pause zwischen dem blinek, also z.B. 3 mal aufleuchten und längere pause, dann wieder 3 mal aufleuchten, Pause. usw.

Und wie bekomme ich da jetzt mehrere Ausgänge mit unterschiedlichen zeiten hin?

Zu der letzten antwort von wegen IRF540N usw. ich verstehe nur bahnhof. Bitte etwas genauer erklähren wür nicht ganz so versierte. Ich weiß zwar wie ein Transistor/ Mosfet im groben funktioniert aber das mit logic-level und so :o wtf....

wäre nett wenn mir einer helfen könnte.

Ich würde einen von euch bitten, mir einen funktionierenden code zu schreiben, bei dem alle Kanäle von 2 bis 13 über millis blinken, und eine kurze beschreibung welche zahlen ich für blink geschwindigkeit und welche für pausen verändern muss. Ich habe leider etwas Zeitdruck und auch wegen meinem Job momentan keine zeit mich genau mit der Programmiersprache zu befassen. Ich wäre demjenigen der mit das macht sehr dankbar.

mfg

ich kann Dir sowohl den technischen Aufbau als auch das Programm gerne schreiben (denn wie es aussieht, hängst Du bei beiden Sachen) ... aber dann nur als Auftragsarbeit gegen Bezahlung!

Ein Forum ist Hilfe zur Selbsthilfe ... kein Versandkatalog, in dem man sich eine fertige Lösung bestellt.

Hallo,

diese direkte Frage nach Code man kann es sicherlich drehen und wenden wie man möchte. Aber hin und wieder fallen in einem Forum Codestücke ab die man im Laufe der Zeit zu nutzen wissen muss. Vor langer Zeit stand ich vor dem gleichen Problem und bekam Hilfe. Deswegen kann ich dir zufällig was fertiges geben, weil ich es aufgehoben hatte. Lib entpacken, Bsp. anschauen usw. Ist selbsterklärend wie ich finde. Bei wem du dich bedanken musst steht drin. Habe nur 2 "Befehle" ergänzt.

Dein Arduino arbeitet mit 5V. Deswegen werden bestimmte Typen von Mosfets benötigt, die schon mit 5V am Gate sicher durchschalten. Diese Typen nennt man "Logic-Level ...".

LedFolgeBlinker_v2.zip (2.6 KB)