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

@agmue Ich bräuchte nochmal Hilfe. Ich habe mich nun dazu entschieden meine Häuser einzeln mit einem Attiny 85 anzusteuern. Diesen kann ich irgendwie nur mit der Adafruit_Neopixel Bibliothek beschreiben.

Ich habe deinen Lösungsvorschlag für 2 WS2812 LEDs mit unterschiedlichen Blinkzeiten versucht auf die Adafruit_Neopixel umzuschreiben. Leider komme ich nicht weiter, was das festlegen der Ausgangsfarben angeht. Diese stehen noch in der if Anweisung und müssten wohl vermutlich in einem Array angelegt werden.

#include <Adafruit_NeoPixel.h> 

#define PIN         6
#define NUMPIXELS   2
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define BRIGHTNESS 50


void setup() {
    pixels.begin();
     pixels.setBrightness(50);  
}

void loop() {
  uint32_t jetzt = millis();
  static uint32_t vorhin[NUMPIXELS] = {0,0}; 
  const uint32_t zeit[NUMPIXELS] = {1000,500};
  static bool ANaus[NUMPIXELS]; 
  bool neu = false;

  if (jetzt - vorhin >= zeit)
  { 
    if (ANaus){
       pixels.setPixelColor(1, pixels.Color(100,0,0));
       pixels.setPixelColor(0, pixels.Color(0,100,0));
        pixels.show();
    }
      else{
       pixels.setPixelColor(1, pixels.Color(0,0,0));
       pixels.setPixelColor(0, pixels.Color(0,0,0));
          pixels.show();
      }
      vorhin = jetzt; 
      ANaus = !ANaus;
      neu = true;    
}}

Warum das denn ?
Das macht dein Vorhaben aber ziemlich Aufwändig. Für jedes Haus einen ATtiny ?

ja kommt mir einfacher vor, da ich das Haus einzeln programmieren kann ohne alle Häuser in einem großen unübersichtlichen Code zu haben und die Datenleitung verlegen zu müssen

Ok, letztendlich ist das eine Frage der Struktur deines Sketches.
Auch den kann man übersichtlich gestalten, z.B. für jedes Haus eine Funktion o.ä.
Und die Verkabelung wirdnicht aufwändiger dadurch.
Aufwändig ist es mit einem ATtiny für jedes Haus.

Aber deine Entscheidung.

Das paßt nicht zusammen :roll_eyes:

weiß ich es ist Pin 0 aber ich wollte es erstmal am Arduino testen

Da gibt eine ganze Menge von, Du meinst vermutlich den UNO.

Probiere mal dies:

#include <Adafruit_NeoPixel.h>

#define PIN         6
#define NUMPIXELS   2
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define BRIGHTNESS 50

void setup() {
  pixels.begin();
  pixels.setBrightness(50);
  pixels.show();
}

void loop() {
  if(haus(0) || haus(1)) pixels.show();
}

bool haus(byte zimmer)
{
  uint32_t jetzt = millis();
  static uint32_t vorhin[NUMPIXELS] = {0, 0};
  const uint32_t zeit[NUMPIXELS] = {1000, 500};
  static bool ANaus[NUMPIXELS] = {false, false};
  const uint32_t farbe[NUMPIXELS] = {pixels.Color(0, 100, 0), pixels.Color(100, 0, 0)};
  bool neu = false;

  if (jetzt - vorhin[zimmer] >= zeit[zimmer])
  {
    if (ANaus[zimmer]) {
      pixels.setPixelColor(zimmer, farbe[zimmer]);
    }
    else {
      pixels.setPixelColor(zimmer, pixels.Color(0, 0, 0));
    }
    vorhin[zimmer] = jetzt;
    ANaus[zimmer] = !ANaus[zimmer];
    neu = true;
  }
  return neu;
}

Blinkt es, wie Du möchtest?

vielen Dank! Ja so klappt es. Das hilft mir sehr. Hätte warsch. noch lange gebraucht um die Anweisungen rauszufinden :slight_smile:

es funktioniert top auch auf dem Attiny :slight_smile:

Freut mich!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.