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
@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
Frage, wenn Du Stichworte benötigst.
Danke für die Rückmeldung
@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
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
es funktioniert top auch auf dem Attiny
Freut mich!
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.