Projekt Krippenbeleuchtung

Also

Ich hab jetzt bei LED1 die Farben auf Orange und Gelb gesetzt und dadurch eine hübschen Flacker Effekt

Mein Ziel ist nun noch die Funktion LED1 (also das Flackern) und LED2 (das zweite Flackern) getrennt mal an und aus zu gehen lassen.

Beispiel: LED1 geht an und bleibt so zwischen 30sec und 2 Minuten an. Unabhängig davon macht das LED2 auch-Optimal wenn das unregelkmäsig wäre

Trotz allem würden mich noch einige Dinge aus dem Sketch interssieren

 if (millis() - alt1Millis >= 200) {
    alt1Millis = millis();

Das sind Variablen nehm ich an (Integer) Wo kommen den die Werte her die drin sind? und warum ist "millis" nicht deklariert

 if (flag1) {
      leds1[0] = CRGB::Orange;
      leds1[1] = CRGB::Yellow;
    } else {
      leds1[0] = CRGB::Yellow;
      leds1[1] = CRGB::Orange;
    }

Ich würde sagen if-then-else: auch hier fehlt mir flag1?

flag1 = !flag1;
    updateLeds = true;

versteh ich nicht: was wird mit flag1 gemacht?

Der Block 2 ist das gleiche für den anderen Stripe

if (updateLeds) {
    FastLED.show();

hier wird die Aktion ausgelößt nehm ich an.. aber warum ?

LG

Ich glaube, Du bist spätestens jetzt an dem Punkt angelangt, an dem Du Dich mit den Grundlagen der Programmierung speziell in C/C++ beschäftigen musst, um die Hinweise, die Du bekommst verstehen zu können.
Auch einige Grundlagen des Arduino könnten sinnvoll sein.

Gruß Tommy

vor 20 Jahren hab ich recht viel Fortran und diverse OS script Programme programiert

normalerweise reicht das immer.

Ich gug mal was ich rausbekomme

LG

C/C++ weicht etwas von Fortran ab :wink:

Gruß Tommy

Hi

Etwas Hilfestellung:

millis() ist ein Arduino-interner Wert, Der die Anzahl Millisekunden seit Start zurück gibt.
Die Abfrage ist quasi:
if (aktuelle Uhrzeit - gemerkte Start-Uhrzeit >= Wartezeit){
mache was
gemerkte Startzeit += Wartezeit (ohne Verschleppen der laufenden Zeit, dafür muß aber die Abarbeitung kürzer als die Wartezeit sein)
gemerkte Startzeit = millis() (auf die aktuelle Zeit setzen, ab hier läuft wieder die Wartezeit, ggf. mit etwas 'Versatz')
}

'flag1' wird wohl am Anfang deklariert und stellt ein Flag/eine Flagge/einen Merker dar.
Damit wird sich nur gemerkt, daß irgend eine Routine an der Anzeige was geändert hat.

flag1= !flag1;
negiere 'flag1' - macht auf 0->1, auf 1->0

Weshalb 'updateLeds' gesetzt wird - kA, sollte auch direkt mit dem Flag machbar sein, aber egal.
Wenn 'updateLeds' gesetzt ist, wird der Befehl ausgeführt, damit alle LEDs Ihre neuen Werte bekommen - hier werden erst die LEDs auf die eingestellte Farbe gesetzt.

Ein Blick in die FastLED.h kann Dich ggf. die enthaltenen Aufruf-Varianten erkennen lassen.
Nicht wirklich schön (QB45 hatte Da eine schönere Hilfe ... Win98 oder so), aber wohl so gewollt.

Hoffe, konnte Dir etwas unter die Arme greifen - viel Spaß in der wohl arduinoreduzierten Weihnachtszeit - nicht, daß die Frau noch argwönisch wird :wink:

MfG

Muemmi:
Und meine Frau gugt schon böse..

Packe sie in Decke und Kissen und stelle einen Schmalzfilm an, dann hast Du Ruhe zum Programmieren.

postmaster-ino:
Etwas Hilfestellung:

Gute Hilfestellung! Darf ich Dich als meinen persönlichen Sketcherklärer engagieren, ich bin da nicht so gut. Die Stelle ist aber undotiert.

Beschreibung zu millis().

uint32_t alt1Millis, alt2Millis;
bool updateLeds, flag1, flag2;

Hier werden die Variablen festgelegt. Die IDE setzt globale Variablen auf den Anfangswert 0 oder false. Wenn es für Dich gewohnter ist, kannst Du auch einen Anfangswert festlegen:

uint32_t alt1Millis=0, alt2Millis=0;
bool updateLeds=false, flag1=false, flag2=false;

postmaster-ino:
Weshalb 'updateLeds' gesetzt wird - kA ...

Das ist auch ein Merker, der gesetzt wird, wenn die LEDs neue Werte bekommen sollen. Schicke nur neue Daten an die LEDs, wenn sich irgendwo die Farbe ändern soll. Da FastLED.show(); wegen der zeitkritischen Ansteuerung der IC in den WS2812-Lichtpunkten blockierend sein muß, sollte man das nur machen, wenn notwendig. Bei diesem Beispielsketch mit vier Lichtpunkten ist das eher nebensächlich, habe ich mir aber halt so als blockadearme Programmierung angewöhnt.

Vordefinierte Farben aus der FastLed-Doku.

Hi

Undotiert ... klingt irgendwie nicht nach mächtig schnell wachsendem Reichtum ...
Ich würde auch Sachspenden nehmen ... noch wäre Zeit, stelle gleich erst das Bäumchen auf :wink: (Wink mit dem Zaunpfahl gg)

Denke, wenn Du (oder sonst wer) Seinen/Ihren Sketch hier rein stellt und 'egal wer' darin irgendwo nicht durchblickt, werden sich hier eine ganze Menge helfende User finden, Die Das auch machen werden - für's gleiche Geld !! :wink:

Das 'updateLeds' ein Merker ist, ist soweit klar - da Dieser aber, meinem Verständnis nach, einen äquivalenten Wert zum flag hat (Beide ändern sich immer nur gleichzeitig bzw wird updateLeds gesetzt, wenn flag1 rückgesetzt wird).
Somit sollte sich gleiche Funktionalität ergeben, wenn zum Aktualisieren der LEDs das flag1 geprüft wird und in beim .show() rückgesetzt würde.

Denke mir aber, daß irgendwo noch was Anderes mit Beiden passiert bzw. updateLeds wohl auch auf Flag2 reagiert und somit als ODER-Flag dient ... oder so.

MfG

Morgen....

Hat nicht geklappt mit der Decke.... Musste mit gucken!

Schau es mir gleich mal...

Und für alle!

Frohe Weihnachten!!

Muemmi:
Hat nicht geklappt mit der Decke.... Musste mit gucken!

Blöd gelaufen, kann ja aber auch schön sein ;D

Asche auf mein Haupt, ich habe updateLeds = false; vergessen und in #76 nachgetragen! Wird der Sinn klarer?

Den Pseudozufall macht random();.

Wenn man die Wartezeit zu per Zufall gefüllten Variablen macht, blinkt es zufällig:

#include "FastLED.h"
#define NUM_LEDS 2
#define DATA_PIN1    2
#define DATA_PIN2    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  96

CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
const uint32_t WARTEZEITMIN = 30000, WARTEZEITMAX = 120000;
uint32_t alt1Millis, alt2Millis, wartezeit1, wartezeit2;
bool updateLeds, flag1, flag2;

void setup() {
  FastLED.addLeds<LED_TYPE, DATA_PIN1, COLOR_ORDER>(leds1, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN2, COLOR_ORDER>(leds2, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.setBrightness(BRIGHTNESS);// global brightness
  FastLED.show();
  randomSeed(analogRead(A3));  // Eingang A3 als Elektronenfänger, da darf nicht angeschlossen sein!
}

void loop() {
  if (millis() - alt1Millis >= wartezeit1) {
    alt1Millis = millis();
    wartezeit1 = random(WARTEZEITMIN, WARTEZEITMAX);
    if (flag1) {
      leds1[0] = CRGB::Green;
      leds1[1] = CRGB::Red;
    } else {
      leds1[0] = CRGB::Red;
      leds1[1] = CRGB::Green;
    }
    flag1 = !flag1;
    updateLeds = true;
  }
  if (millis() - alt2Millis >= wartezeit2) {
    alt2Millis = millis();
    wartezeit2 = random(WARTEZEITMIN, WARTEZEITMAX);
    if (flag2) {
      leds2[0] = CRGB::Aqua;
      leds2[1] = CRGB::Gold;
    } else {
      leds2[0] = CRGB::Blue;
      leds2[1] = CRGB::Aquamarine;
    }
    flag2 = !flag2;
    updateLeds = true;
  }
  if (updateLeds) {
    updateLeds = false;
    FastLED.show();
  }
}

@Tommy.. du wirst mich hassen !

Das mit den Wartezeiten its im Prinzip zwar genau das ich brauche.

ABERRRRR...

an der falschen Stelle!

void loop() {
  if (millis() - alt1Millis >= 200) {
    alt1Millis = millis();
    if (flag1) {
      leds1[0] = CRGB::Orange;
      leds1[1] = CRGB::Yellow;
    } else {
      leds1[0] = CRGB::Yellow;
      leds1[1] = CRGB::Orange;
    }
    flag1 = !flag1;
    updateLeds = true;
  }

Diese Funktion hat ja die beiden LEDs im linken Turm (der Krippe) zu einem schönen flackern gebracht. Das gleiche wird dann parallel für den anderen Turm (rechts) realisiert.

Diese beiden Funktionen möchte ich dann mit den Random Funktion unabhängig voneinander an und aus machen

Also Turm links an (flackern) ... irgendwann wieder aus und das gleiche mit dem anderen Turm zeitlich aber unabhängig

LG

Muemmi:
@Tommy.. du wirst mich hassen !

Warum ich?

Muemmi:
Diese beiden Funktionen möchte ich dann mit den Random Funktion unabhängig voneinander an und aus machen

Also Turm links an (flackern) ... irgendwann wieder aus und das gleiche mit dem anderen Turm zeitlich aber unabhängig auf beiden Seiten.

Der Sketch von agmue flackert doch unabhängig.

Gruß Tommy

Tommy56:
Warum ich?

Er hat halt Dich ins Herz geschlossen, da kann ich nichts machen ::slight_smile:

Is ja juut

Hatte verwechselt... aber ehrlich mit Bart ist ja auch sympathisch

Wie bekommt man hier rein .. direkt nicht als Anhang

PS: klar flackert es aber nicht so schön wie bei dem ersten Sketch

Erst als Anhang und im 2. Schritt den Link zum Anhang als Bild.

Gruß Tommy

Edit: FastLED hat auch eigene Zufallsfunktionen. Evtl. flackert es mit denen schöner.

Hier ein Bild:

Man kann sehen, das links es orange und rechts leicht rötlich ist.

links gelb/orange flackern
rechts rot/orange flackern

Jetzt fehlt nur noch das die beiden Funktionen sich unregelmäßig unabhängig aus und einschalten

LG

Weil Weihnachten ist, agmues Code um eine Wartephase ergänzt (ungetestet).

#include "FastLED.h"
#define NUM_LEDS 2
#define DATA_PIN1    2
#define DATA_PIN2    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  96

CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
const uint32_t WARTEZEITMIN = 30000, WARTEZEITMAX = 120000;
uint32_t alt1Millis, alt2Millis, wartezeit1, wartezeit2;
bool updateLeds
uint8_t flag1, flag2;

void setup() {
  FastLED.addLeds<LED_TYPE, DATA_PIN1, COLOR_ORDER>(leds1, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN2, COLOR_ORDER>(leds2, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.setBrightness(BRIGHTNESS);// global brightness
  FastLED.show();
  randomSeed(analogRead(A3));  // Eingang A3 als Elektronenfänger, da darf nicht angeschlossen sein!
}

void loop() {
  if (millis() - alt1Millis >= wartezeit1) {
    alt1Millis = millis();
    wartezeit1 = random(WARTEZEITMIN, WARTEZEITMAX);
    if (flag1 == 0) {
      leds1[0] = CRGB::Green;
      leds1[1] = CRGB::Red;
    } else if (flag1 == 1){
      leds1[0] = CRGB::Red;
      leds1[1] = CRGB::Green;
    }
    else {
      leds1[0] = CRGB::BLACK;
      leds1[1] = CRGB::BLACK;
    }
    flag1++;
    if (flag1 > 2) flag1 = 0;
    updateLeds = true;
  }
  if (millis() - alt2Millis >= wartezeit2) {
    alt2Millis = millis();
    wartezeit2 = random(WARTEZEITMIN, WARTEZEITMAX);
    if (flag2 == 0) {
      leds2[0] = CRGB::Aqua;
      leds2[1] = CRGB::Gold;
    } else if (flag2 == 1) {
      leds2[0] = CRGB::Blue;
      leds2[1] = CRGB::Aquamarine;
    }
    else {
      leds2[0] = CRGB::BLACK;
      leds2[1] = CRGB::BLACK;
    }
    flag2++;
    if (flag2 > 2) flag2 = 0;
    updateLeds = true;
  }
  if (updateLeds) {
    updateLeds = false;
    FastLED.show();
  }
}

Gruß Tommy

@Tommy.....

Fast Super ! ich weis.. ich bin ein KK!

Der Sketch läuft prima.. ich musste nur noch ein Semikolon setzen und BLACK kennt er nicht, aber mir Black läuft es.

er macht sich an und aus unregelmäsig.

Das Flackern, was ich wohl in meinem aktuellen Skecht habe ist leider weg.

Dieser wird ja durch diesen Teil erzeugt

void loop() {
  if (millis() - alt1Millis >= 150) {
    alt1Millis = millis();
    if (flag1) {
      leds1[0] = CRGB::Orange;
      leds1[1] = CRGB::Yellow;
    } else {
      leds1[0] = CRGB::Yellow;
      leds1[1] = CRGB::Orange;
    }
    flag1 = !flag1;
    updateLeds = true;
  }
  if (millis() - alt2Millis >= 200) {
    alt2Millis = millis();
    if (flag2) {
      leds2[0] = CRGB::Yellow;
      leds2[1] = CRGB::Red;
    } else {
      leds2[0] = CRGB::Red;
      leds2[1] = CRGB::Yellow;
    }
    flag2 = !flag2;
    updateLeds = true;
  }
  if (updateLeds) {
    FastLED.show();

Ich versuche jetzt mal diesen Teil in deine IF Then Else Schleife einzubauen

LG

boahhhhhhhhh

Versuch Eins ist jämmlich in die Hose gegangen!

Er läßt sich zwar fehlerlos kompelieren aber "Black" ist die Haupt-Funktion SMILLLLEEEE

sprich alles bleibt aus

Anmerkung: Hab erst mal nur ein Gebäude

#include "FastLED.h"
#define NUM_LEDS 2
#define DATA_PIN1    2
#define DATA_PIN2    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  96

CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
const uint32_t WARTEZEITMIN = 30000, WARTEZEITMAX = 120000;
uint32_t alt1Millis, alt2Millis, wartezeit1, wartezeit2;
bool updateLeds;
uint8_t flag1, flag2;

void setup() {
  FastLED.addLeds<LED_TYPE, DATA_PIN1, COLOR_ORDER>(leds1, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN2, COLOR_ORDER>(leds2, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.setBrightness(BRIGHTNESS);// global brightness
  FastLED.show();
  randomSeed(analogRead(A3));  // Eingang A3 als Elektronenfänger, da darf nicht angeschlossen sein!
}

void loop() {
  if (millis() - alt1Millis >= wartezeit1) {
    alt1Millis = millis();
    wartezeit1 = random(WARTEZEITMIN, WARTEZEITMAX);

    // Funktion Flackern

    if (millis() - alt1Millis >= 150) {
    alt1Millis = millis();
    
    if (flag1 == 0) {
      leds1[0] = CRGB::Orange;
      leds1[1] = CRGB::Yellow;
    }  
     else if (flag1 == 1){
      leds1[0] = CRGB::Yellow;
      leds1[1] = CRGB::Orange;
    }
    else {
      leds1[0] = CRGB::Black;
      leds1[1] = CRGB::Black;
    }
    flag1++;
    if (flag1 > 2) flag1 = 0;
    updateLeds = true;
  }
 



  if (updateLeds) {
    updateLeds = false;
    FastLED.show();
  }
  }
}

hmmmmm

ich hab mal eine zusätzliche Variable eingefügt "Alt2MillisF"

jetzt mault mich der Kompiler an

mit

Krippe_Final_V11:31: error: 'alt1MillisF' was not declared in this scope

     if (millis() - alt1MillisF >= 150) {

                    ^

exit status 1
'alt1MillisF' does not name a type

das ist der ganze Sketch

#include "FastLED.h"
#define NUM_LEDS 2
#define DATA_PIN1    2
#define DATA_PIN2    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  96

CRGB leds1[NUM_LEDS];
CRGB leds2[NUM_LEDS];
const uint32_t WARTEZEITMIN = 30000, WARTEZEITMAX = 120000;
uint32_t alt1Millis, alt2Millis, wartezeit1, wartezeit2; alt1MillisF;
bool updateLeds;
uint8_t flag1, flag2;

void setup() {
  FastLED.addLeds<LED_TYPE, DATA_PIN1, COLOR_ORDER>(leds1, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN2, COLOR_ORDER>(leds2, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
  FastLED.setBrightness(BRIGHTNESS);// global brightness
  FastLED.show();
  randomSeed(analogRead(A3));  // Eingang A3 als Elektronenfänger, da darf nicht angeschlossen sein!
}

void loop() {
  if (millis() - alt1Millis >= wartezeit1) {
    alt1Millis = millis();
    wartezeit1 = random(WARTEZEITMIN, WARTEZEITMAX);

    // Funktion Flackern

    if (millis() - alt1MillisF >= 150) {
    alt1MillisF = millis();
    
    if (flag1 == 0) {
      leds1[0] = CRGB::Orange;
      leds1[1] = CRGB::Yellow;
    }  
     else if (flag1 == 1){
      leds1[0] = CRGB::Yellow;
      leds1[1] = CRGB::Orange;
    }
    else {
      leds1[0] = CRGB::Black;
      leds1[1] = CRGB::Black;
    }
    flag1++;
    if (flag1 > 2) flag1 = 0;
    updateLeds = true;
  }
 



  if (updateLeds) {
    updateLeds = false;
    FastLED.show();
  }
  }
}

Ich schrieb ja: ungetestet.
Gib mal flag1 aus.

Außerdem ist das nicht mein Code, der ist verändert.
Ok, mach mal.

Gruß Tommy