LED Schild

Hallo Forum,

Mein Name ist Timo und ich bin dabei mit WS2811 LEDS ein LED Schild zu bauen, brauche das für meinen 18. Geburtstag in 3 Wochen.

So weit so gut, ich habe das Schild fertig, und es läuft auch mit dem Fast LED Chlorpalette Sketch.

Allerdings ist dieser Sketch nicht so genau das was ich mir für das Schild vorstelle.

Ich möchte, dass das Schild für ca 3 Minuten in nur einer Farbe leuchtet, und dann ein Effekt aus dem Sketch Colorpalettes, kommt, danach wieder 3 Minuten eine Farbe, danach wieder ein Effekt.

Mit welchem Ansatz arbeite ich da am besten? Kenne mich nicht besonders aus mit programmieren, und brauche dieses Schild wie gesagt nur für die Party in 3 Wochen.

Es wäre super, wenn mir da jemand helfen könnte. Ich poste hier unten einfach mal den Sketch von Fast LED, und hoffe das mir jemand sagen kann an welcher Stelle ich darin anfangen muss.

Vielen Dank schonmal,

Timo

Ich vermute ich muss meine Änderungen bei void Change Palette Periodically einfügen, da dieses void ja steuert welcher Effekt gerade drankommt. Allerdings weiß ich nicht, wie ich es hinbekomme, dass jeder zweite Effekt einfach nur eine Farbe für 3 Minuten ist. Außerdem verstehe ich nicht mit welcher 'Zeiteinheit' Change Palette Periodically arbeitet. Ist es möglich, dass so zu ändern, dass das Programm nach dem Prinzip arbeitet 'Von Minute 0 bis 1 myRedWhiteBluePalette_p, Von Minute 1 bis 4 alle Leds in einer Farbe, Von Minute 4 bis 5 ...' und so weiter. Es wäre super, wenn mir dabei jemand helfen könnte.

#include <FastLED.h>

#define LED_PIN     10
#define NUM_LEDS    28
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER RGB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100


CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
 delay( 3000 ); // power-up safety delay
 FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
 FastLED.setBrightness(  BRIGHTNESS );
 
 currentPalette = RainbowColors_p;
 currentBlending = BLEND;
}


void loop()
{
 ChangePalettePeriodically();

 static uint8_t startIndex = 0;
 startIndex = startIndex + 1; /* motion speed */

 FillLEDsFromPaletteColors( startIndex);

 FastLED.show();
 FastLED.delay(1000 / UPDATES_PER_SECOND);
}

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
 uint8_t brightness = 255;
 
 for( int i = 0; i < NUM_LEDS; i++) {
   leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
   colorIndex += 3;
 }
}



void ChangePalettePeriodically()
{
 uint8_t secondHand = (millis() / 1000) % 60;
 static uint8_t lastSecond = 99;
 
 if( lastSecond != secondHand) {
   lastSecond = secondHand;
   if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = BLEND; }
   if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }
   if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = BLEND; }
   if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = BLEND; }
   if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = BLEND; }
   if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }
   if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = BLEND; }
   if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = BLEND; }
   if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = BLEND; }
   if( secondHand == 50)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND;  }
   if( secondHand == 55)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = BLEND; }
 }
}

// This function fills the palette with totally random colors.
void SetupTotallyRandomPalette()
{
 for( int i = 0; i < 16; i++) {
   currentPalette[i] = CHSV( random8(), 255, random8());
 }
}

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
 // 'black out' all 16 palette entries...
 fill_solid( currentPalette, 16, CRGB::Black);
 // and set every fourth one to white.
 currentPalette[0] = CRGB::White;
 currentPalette[4] = CRGB::White;
 currentPalette[8] = CRGB::White;
 currentPalette[12] = CRGB::White;

}

// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{
 CRGB purple = CHSV( HUE_PURPLE, 255, 255);
 CRGB green  = CHSV( HUE_GREEN, 255, 255);
 CRGB black  = CRGB::Black;
 
 currentPalette = CRGBPalette16( 
   green,  green,  black,  black,
   purple, purple, black,  black,
   green,  green,  black,  black,
   purple, purple, black,  black );
}


// This example shows how to set up a static color palette
// which is stored in PROGMEM (flash), which is almost always more 
// plentiful than RAM.  A static PROGMEM palette like this
// takes up 64 bytes of flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
 CRGB::Red,
 CRGB::Gray, // 'white' is too bright compared to red and blue
 CRGB::Blue,
 CRGB::Black,

 CRGB::Red,
 CRGB::Gray,
 CRGB::Blue,
 CRGB::Black,

 CRGB::Red,
 CRGB::Red,
 CRGB::Gray,
 CRGB::Gray,
 CRGB::Blue,
 CRGB::Blue,
 CRGB::Black,
 CRGB::Black
};

Moderator edit:
</mark> <mark>[code]</mark> <mark>

</mark> <mark>[/code]</mark> <mark>
tags added.

hi,

hehe, jetzt kommt eine antwort, für die ich erschlagen werde:

laß Deinen effekt ablaufen, dann setze alle LEDs auf eine beliebige farbe, und schreibe ein
delay(180000);
rein. damit tut sich für 3 minuten nichts, die farbe bleibt also gleich.
dann der nächste effekt, und wieder das delay.

ich duck' mich jetzt mal...

gruß stefan

Eisebaer, Du als Österreicher Spaghetticode vorschlagen ist schon ernüchternd. :wink: :wink: :wink:

Ich gebe Dir aber recht, das einfachste ist das.

@TimoB
Ich kenne Eisebaer schon lange, da kann ich etwas sticheln und er gibt es mir dann zurück. :smiley: :smiley:

Das Beispielprogramm, das der Bibliothek beigelegt ist, gibt eine Anschauung was alles möglich ist. Du mußt die Effekte die Du willst selbst zusammenstellen.

Grüße Uwe


Gar nicht so leicht zu erwischen, so ein galoppierender Eisbär.

Spaghetti - Code ist das nicht. Und da Timo nichts von interaktiv gesagt hat, reicht eine milde Rüge:

@Timo: Wenn du 18 bist und erwachsen, machst du es dann natürlich besser :wink:

hi,

dann will ich mal auflösen, warum ich das so gesagt habe:

prinzipiell ist, meiner meinung nach, nichts gegen delays in einem programm zu sagen, wenn, wie in diesem fall wirklich "nichts dazwischen" reinkommen kann. und jeden erfahrenen programmierer, der es anders macht, tu' ich als überkandidelt ab. meine entscheidung!

ABER:

Dir, timo, als anfänger, und ich meine als einer, der auch weiterprogrammieren und lernen will, sage ich:
mach es mit delays und hol' Dir Dein erfolgserlebnis, danach bau das programm zu lernzwecken um. sieh Dir dazu das blinkwithoutdelay-beispiel in der IDE an, Du wirst das immer wieder brauchen, wenn halt auch nicht zwingend bei dieser sache.

und, uwe, mit spaghetticode hat das nichts zu tun, das solltest doch Du als italiener beurteilen können... 8)

gruß stefan

Danke für die schnelle Antwort erstmal,

habe das ganze jetzt so eingebaut, allerdings leuchten die LEDS jetzt einfach rot - das wars :smiley:

Das war auch schon die ganze Zeit mein Problem in dem Sketch, ich verstehe nicht wie dieser gezeigte Void die Effekte abspielt. Es hat ja etwas mit if secondhand zutun, nur wie arbeitet der da?

void ChangePalettePeriodically()
{
uint8_t secondHand = (millis() / 1000) % 60;
static uint8_t lastSecond = 99;

if( lastSecond != secondHand) {
lastSecond = secondHand;
if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = BLEND; }
leds[0] = CRGB::Red;
leds[1] = CRGB::Red;
leds[2] = CRGB::Red;
leds[3] = CRGB::Red;
leds[4] = CRGB::Red;
leds[5] = CRGB::Red;
leds[6] = CRGB::Red;
leds[7] = CRGB::Red;
leds[8] = CRGB::Red;
leds[9] = CRGB::Red;
leds[10] = CRGB::Red;
leds[11] = CRGB::Red;
leds[12] = CRGB::Red;
leds[13] = CRGB::Red;
leds[14] = CRGB::Red;
leds[15] = CRGB::Red;
leds[16] = CRGB::Red;
leds[17] = CRGB::Red;
leds[18] = CRGB::Red;
leds[19] = CRGB::Red;
leds[20] = CRGB::Red;
leds[21] = CRGB::Red;
leds[22] = CRGB::Red;
leds[23] = CRGB::Red;
leds[24] = CRGB::Red;
leds[25] = CRGB::Red;
leds[26] = CRGB::Red;
leds[27] = CRGB::Red;
leds[28] = CRGB::Red;

FastLED.show();
delay(1500);
if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; }
if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = BLEND; }
if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = BLEND; }
if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = BLEND; }
if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; }
if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = BLEND; }
if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = BLEND; }
if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = BLEND; }
if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; }
if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = BLEND; }
}
}

  1. Du zeigst nicht das wichtige deines Sketches
  2. void heisst ungültig, und ist das was die Funktion zurückliefert (nichts)
  3. secondhand würde ich mal versuchsweise mit "Sekundenzeiger" übersetzen...
  4. Willst jetzt immer alles Rot haben oder nur manchmal ? Bei manchmal, darst du das auch nur manchmal aufrufen:

mach mal vor deine
leds[0] = CRGB::Red;
Liste ein
if (secondhand > 50) {

und danach eine geschlossene Klammer }

Dann ist es nur noch die letzten 10 Sekunden jeder Minute rot.
Dass das Original sich im Minutentakt wiederholt, liegt an

uint8_t secondHand = (millis() / 1000) % 60;

% liefert den Rest einer Division. Hier werden Sekunden durch 60 geteilt. Der Rest ist eine Zahl 0 .. 59

uint8_t secondHand = (millis() / 1000) % 60;

millis() gibt eine unsigned long Variable zurück, die jede Millissekunde um 1 erhöht wird.
Die wird durch 1000 geteilt und man erhält Sekunden.
%60 erhält man den Rest der division durch 60; praktisch die Sekunden von 0 bis 59.

if( secondHand == 0) ... leds[0] = CRGB::Red; am Anfang wird alles rot

FastLED.show(); Überträgt die Werte an die WS2812

if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; }
nach 10 Sekunden werden die beiden Funktionen aufgerufen. Ich weiß jetzt nicht welche es sind.

Statt leds[0] = CRGB::Red; bis leds[28] = CRGB::Red;

kannst Du folgends schreiben.

for (int i = 0; i<=28; i++) leds = CRGB::Red;
Grüße Uwe
PS @Eisebaer siehst Du, Spaghetticode!!
Ich hatte dir ja schon recht gegeben zur delay() Benutztng

hi,

PS @Eisebaer siehst Du, Spaghetticode!!

klar ist sein code spaghetticode. aber das hat nichts mit meinen delays zu tun. in seinem code ist ja nicht mal ein delay...

gruß stefan

PS.: und es tut mir leid, daß ich Dich italiener genannt habe...

Hat mich schon gewundert, normalerweise bezeichnest Du mich als Alt-Österreicher. :wink: :wink: :wink: :wink:

Halb so schlimm. Bin nicht beleidgt, aber trotzdem Danke für Deine Entschuldigung.

Grüße Uwe

Super, jetzt funktioniert alles wie ich es mir vorstelle! Vielen Dank!

Das Problem war einfach das ich 0 Ahnung vom programmieren habe, und das Prinzip nicht verstehe nachdem der Sketch arbeitet. Aber jetzt läuft es wie es soll