Ahoi,
ich hab ein paar Fragen zu Möglichkeiten, wie ich nen Controller (WeMos D1 mini) vernüftig programmieren könnte bzw. was da als gute Grundlage herhalten könnte. Also vorallem Tipps, wie das elegant möglich wäre.
Ich hab folgendes vor:
Ich habe einen LED Streifen (WS2812b), den ich in einzelne Segmente a 14 Leds unterteilt habe. Aktuell habe ich insgesamt 126 Leds.
Vorgestellt hab ich mir folgendes:
- Gruppenbildung von jeweils 14 LEDs um dort dann jeweils für die Gruppe Farben, Helligkeit und vielleicht sogar Verlaufsfunktionen einstellen zu können
- den Streifen als gesamtes mit einem Befehl anpassen zu können
- das ganze dann über Http Steuern zu können
- Ideal wäre es die einzelnen Farben als Funktion einstellen zu können, also per Link die einzelnen Farben einstellen zu können und nicht nur vorgefertigte Links.
Meine Fragen dazu wären (mindestens):
- Wie gruppier ich die einzelnen Leds so, dass ich da vernüftig drauf zu greifen kann?
Mir würde jetzt entweder ne Schleifenlösung einfallen oder so wie hier: Neopixel: unterschieldiche Anzahl Pixel in unterschiedlichen Farben ansteuern - Deutsch - Arduino Forum - Muss ich die eizelnen Funktionen als Unterfunktionen im großen Sketch per #include reinsetzen, damit ich da einzeln darauf zugreifen kann?
Hab einen ganz coolen Sketch von "bitluni" gefunden mit dem man beim ganzen Streifen schon einmal die Farben ändern könnte:
- Problem ist allerdings, dass er nen RGB Stripe hat und ich einen GBR. Bei einzelnen Farben brauch ich da ja nur die Reihenfolge der Zahlen für die Farben ändern, aber bei bspw. Farbverläufen oder Regenbögen wäre das evtl. was unpraktisch....
Hauptcode gibts im ersten Kommentar war zu lang...
Und dann z.B. die Farbfunktion:
/*
Released under Creative Commons Attribution 4.0
by bitluni 2016
https://creativecommons.org/licenses/by/4.0/
Attribution means you can use it however you like as long you
mention that it's base on my stuff.
I'll be pleased if you'd do it by sharing http://youtube.com/bitlunislab
*/
#include <ESP8266WebServer.h>
#include "LedFunction.h"
const int MAX_LED_COUNT = 124;
class LedStates
{
public:
uint8_t values[MAX_LED_COUNT][3] = {{0}};
int count = 0;
bool dirty = false;
Adafruit_NeoPixel &pixels;
LedFunction *function = 0;
LedStates(Adafruit_NeoPixel &ledPixels)
:pixels(ledPixels)
{
count = pixels.numPixels();
}
void setFunction(LedFunction *newFunction)
{
if(function)
delete function;
function = newFunction;
if(!function)
return;
function->state = this;
}
void setRgb(int i, uint8_t r, uint8_t g, uint8_t b)
{
values[i][0] = r;
values[i][1] = g;
values[i][2] = b;
dirty = true;
}
virtual void render()
{
if(function)
function->render();
}
void setValues(LedStates &to)
{
for(int i = 0; i < count; i++)
for(int j = 0; j < 3; j++)
values[i][j] = to.values[i][j];
setFunction(to.function);
to.function = 0;
dirty = true;
}
void commit()
{
if(!dirty)
return;
for(int i = 0; i < count; i++)
pixels.setPixelColor(i, pixels.Color(values[i][0], values[i][1], values[i][2]));
pixels.show();
dirty = false;
}
void fade(LedStates &to, long f0, long f1)
{
for(int i = 0; i < count; i++)
pixels.setPixelColor(i, pixels.Color((values[i][0] * f0 + to.values[i][0] * f1) >> 16, (values[i][1] * f0 + to.values[i][1] * f1) >> 16, (values[i][2] * f0 + to.values[i][2] * f1) >> 16));
pixels.show();
dirty = true;
}
};
Den gesamten Code mit den anderen Funktionen gäbe es hier: GitHub - bitluni/bitluniHomeAutomation
Da wäre meine Frage, wie man da für die 9 einzelne Elemente jeweils einen Bereich anlegen könnte. Könnte ich dann einfach die Farbfunktion noch 9x anlegen und dann nur in der For Schleife ihn nur zwischen 0 und <14 bzw 14 und <28 usw. zählen lassen? Da wäre meine Frage, wie man das dann einbinden könnte und dann über den Server ansteuern könnte.
Könnte ich bei dem Code auch die Reihenfolge der Farben ändern oder zerbombt das dann alles?![]()
Hoffe das war jetzt nicht viel zu ausführlich und vielen Dank schonmal den ganzen Quatsch gelesen zu haben.
Chris