WS2182b Arduino Steuerung Modelbahn

Wäre das auch für FastLED notwendig/sinnvoll/empfehlenswert?

imho ja, aber ist es bei FAST Led nicht etwas anders ... da gibts ja ein Fastled Objekt dem man dan mehrere Pins added oder? ich glaub da müsstest halt nur den Pin dem Konstruktor als Parameter übergeben.
Beispiel in "MultipleStripsInOneArray"

Müssen muß man nicht, da das Feld leds auf mehrere Datenpins aufgeteilt weren kann:

  FastLED.addLeds<LED_TYPE, DATA_PIN_1, COLOR_ORDER>(leds, 0, ZIMMER_STREIFEN_1);
  FastLED.addLeds<LED_TYPE, DATA_PIN_2, COLOR_ORDER>(leds, ZIMMER_STREIFEN_1, ZIMMER_STREIFEN_2);
  FastLED.show();            // Turn OFF all pixels ASAP

Im Sinne von "Ein Programm, das tut was es soll, ist ein gutes Programm!" bin ich zufrieden, nur weiß ich nicht, wie es durch die OOP-Brille aussieht.

Im Zusammenhang:

#include "FastLED.h"

const int ZIMMER_STREIFEN_1 = 9;
const int ZIMMER_STREIFEN_2 = 8;
const int ALLEZIMMER = ZIMMER_STREIFEN_1 + ZIMMER_STREIFEN_2;
CRGB leds[ALLEZIMMER];

class TV {
  private:
    byte state = 1;                // 0 Effect off, 1 Effect on
    unsigned long previousMillis;  // used for timekeeping
    uint16_t on = 200;             // intervall
    CRGB colorOn = 0xAAFF44;
    CRGB colorOff = 0x000000;
    int8_t actual = 0;
    uint16_t rnd = 5;              // the higher the less changes
    const byte fernseher;                 // fernseher pixel of this group

  public:
    TV(byte fernseher):
      fernseher(fernseher)
    {}

    void setInterval(uint16_t _on)  // modify on/off times during runtime
    {
      on = _on;
    }

    void setRandom(uint16_t _rnd)   // frequency of changes
    {
      rnd = _rnd;
    }

    void setState(byte _state)            // 0 switch off Effect; 1 Switch on effect;
    {
      state = _state;
      if (state == 0)
      {
        leds[fernseher] = colorOff;
      }
    }

    void setColor(uint32_t newColorOn, uint32_t newColorOff = 0x000000)
    {
      colorOn = newColorOn;
      colorOff = newColorOff;
    }

    void update()
    {
      if (state)
      {
        uint32_t currentMillis = millis();
        if (currentMillis - previousMillis >= on) {
          previousMillis = currentMillis;  // save the last time we changed some LED
          if (random(rnd) == 0)
          {
            leds[fernseher].r = random(255);
            leds[fernseher].g = random(255);
            leds[fernseher].b = random(63);
          }
          FastLED.show();
        }
      }
    }
};

class House {
  private:
    byte state = 1;                // 0 Effect off, 1 Effect on
    unsigned long previousMillis;  // used for timekeeping
    uint16_t on = 200;             // intervall
    CRGB colorOn = 0xFFAA44;
    CRGB colorOff = 0x000000;
    int8_t actual = 0;
    uint16_t rnd = 10;             // the higher the less changes
    const byte first;              // first pixel of this group
    const byte num;               // how many leds

  public:
    House(byte first, byte num):
      first(first),
      num(num)
    {}

    void setInterval(uint16_t _on)  // modify on/off times during runtime
    {
      on = _on;
    }

    void setRandom(uint16_t _rnd)   // frequency of changes
    {
      rnd = _rnd;
    }

    void setState(byte _state)            // 0 switch off Effect; 1 Switch on effect;
    {
      state = _state;
      if (state == 0)
      {
        for (int i = 0; i < num; i++)
          leds[first + i] = colorOff;
      }
    }

    void setColor(uint32_t newColorOn, uint32_t newColorOff = 0x000000)
    {
      colorOn = newColorOn;
      colorOff = newColorOff;
    }

    void update()
    {
      if (state)
      {
        uint32_t currentMillis = millis();
        if (currentMillis - previousMillis >= on) {
          previousMillis = currentMillis;  // save the last time we changed some LED
          if (random(rnd) == 0)
          {
            if (leds[first + actual] == colorOff)
              leds[first + actual] = colorOn;
            else
              leds[first + actual] = colorOff;
          }
          actual++;
          if (actual >= num) actual = 0;
          FastLED.show();
        }
      }
    }
};

House house[]
{
  // strip,start, used pixels
  { 0, 3},  // house starting at pixel 0, with 3 rooms/LED
  { 3, 6},  // house starting at pixel 1, with 6 rooms/LEDs
  { 9, 4},  // house starting at pixel 7, with 4 rooms/LEDs
            // 13 für TV
  {14, 3}   // house starting at pixel 12, with 3 rooms/LEDs
};

TV tv[]
{
  // Fernseher
  {13}
};

#define LED_TYPE   WS2812
#define COLOR_ORDER   GRB
#define DATA_PIN_1     14
#define DATA_PIN_2     12

void setup() {
  Serial.begin(115200);
  Serial.println(F("\nStart"));
  randomSeed(A7);
  FastLED.addLeds<LED_TYPE, DATA_PIN_1, COLOR_ORDER>(leds, 0, ZIMMER_STREIFEN_1);
  FastLED.addLeds<LED_TYPE, DATA_PIN_2, COLOR_ORDER>(leds, ZIMMER_STREIFEN_1, ZIMMER_STREIFEN_2);
  FastLED.show();            // Turn OFF all pixels ASAP
  FastLED.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
  house[0].setInterval(300);       // speed of changes
  house[0].setRandom(10);          // frequence of changes
  //house[0].setState(0);          // switch off
  house[1].setColor(0xFFFFFF);     // cold white
  house[2].setColor(0xFFFF33);     // white
}

void loop() {
  for (auto &i : house) i.update();
  for (auto &i : tv) i.update();
}

aso, wenn das eh außerhalb geht, dann passt das schon.
Die #defines würde ich ablösen gegen const/constexpr soweit möglich (damit ich halt was zum rummosern hab... ^^).
Und da ich sehe dass du einige uint32_t auf CRGB geändert hast ... ist ok, aber machs durchgängig auch in den setColor Parametern.

man könnte noch die Gemeinsamkeiten der Klassen suchen und dann entweder vererben oder wohl besser eine Komposition machen... insbesondere im Himblick auf Schweißern, Blaulicht, etc. Irgendwo hab ich ein Muster für Normale LEDs, ... muss ich mal suchen.

Alles nur Vorschläge. Müssen ist das keins :wink:

@agmue @noiasca Danke euch nochmals vielmals für eure Hilfe und Erklärungen. Ich werde das Programm erstmal übernehmen, muss mich aber glaube ich trotzdem noch in die Programmiersprache einarbeiten. Alles Andere würde glaube ich erstmal nur eure Nerven und Zeit strapazieren. Viele Begriffe klingen für mich noch sehr fremd. Dennoch Danke und euch eine gute Restwoche :slight_smile:

Frage, wenn Du Stichworte benötigst.

Danke für die Rückmeldung :slightly_smiling_face:

1 Like