Eigentlich wollte ich das hier an meinen bestehenden Thread hängen, aber da ich im Internet sehr wenig über dieses spezielle Problem gefunden habe, dachte ich, dass es so besser gefunden werden kann.
Ich versuche momentan für ein LED Strip Lauflicht einen "Schweif" zu erzeugen.
Bspl.: laufender balken hat 10 Leds, der Scheif soll auch 10 LEDs lang sein.
Dabei soll die aktuelle Farbe pro Pixel um 1/10 gedimmt werden.
Da es keine feste Farbe ist, sonder die Farbe geändert werden kann, muss ich die gedimmte Farbe für jeden Pixel neu berechnen.
Ich habe bis jetzt das hier. bei einzelnen Farben funktioniert es aber bei Fade oder Color Flow flasht der Balken nur.
pickColor(colrType); // Get Color for strip
cycle();
void Cycle(){
uint16_t i, j, k;
thisMillis=millis();
if(thisMillis - prevMillisCYCLE >= intervalCYCLE){
for(i = 0; i< strip.numPixels(); i++){ // all pixel off
strip.setPixelColor(i, 0, 0, 0);
}
if(colrType == 7){ //Switch Case Rainbow!
for(j = 0; j < ((strip.numPixels()/10)+1); j++){
strip.setPixelColor(pixelPos-j, Wheel2(((i * 256 / strip.numPixels()) + j) & 255));
}
for(k = 0; k <= ((strip.numPixels()/10)+1); k++){ // draw tail
pixelColor = colorDimm(pixelColor, ((strip.numPixels()/10)+1), k+1);
strip.setPixelColor(pixelPos-((strip.numPixels()/10)+1)-k, Wheel2(((i * 256 / strip.numPixels()) + j) & 255));
}
}
else{
for(j = 0; j < ((strip.numPixels()/10)+1); j++){ // draw bar
strip.setPixelColor(pixelPos-j, pixelColor);
}
for(k = 0; k <= ((strip.numPixels()/10)+1); k++) { // draw tail
pixelColor = colorDimm(pixelColor, ((strip.numPixels()/10)+1), k+1);
strip.setPixelColor(pixelPos-((strip.numPixels()/10)+1)-k, pixelColor);
}
}
strip.show();
pixelPos++; // shift pixel
if(pixelPos == PIXEL_COUNT+(strip.numPixels()/15)+1) // reset pixel position (running a vew frames out of the strip)
pixelPos = 0;
prevMillisCYCLE = thisMillis;
}
}
uint32_t colorDimm(uint32_t colorValue, long lenght, long pixel){
uint8_t red = (colorValue & 0x00FF0000) >> 16;
uint8_t green = (colorValue & 0x0000FF00) >> 8;
uint8_t blue = (colorValue & 0x000000FF);
double prozent = 100 / lenght;
red = red - red * ((prozent * pixel) / 100);
green = green - green * ((prozent * pixel) / 100);
blue = blue - blue * ((prozent * pixel) / 100);
colorValue = strip.Color(red,green,blue);
return colorValue;
}
void pickColor(int c) {
switch(c){
case 0: { // RED
pixelColor = strip.Color(255, 0, 0);
}
break;
case 1: { // GREEN
pixelColor = strip.Color(0, 255, 0);
}
break;
case 2: { // BLUE
pixelColor = strip.Color(0, 0, 255);
}
break;
case 3: { // WHITE
pixelColor = strip.Color(255, 255, 255);
}
break;
case 4: { // FADE IN/OUT SINGLE COLOR
thisMillisFade=millis();
if(thisMillisFade - prevMillisFade >= intervalFadeIO){
FadeInOut(255, 0, 0);
if(fade == 512){
fade = 0;
}
prevMillisFade = thisMillisFade;
}
}
break;
case 5: { // FADE IN/OUT
thisMillisFadeIO=millis();
if(thisMillisFadeIO - prevMillisFadeIO >= intervalFadeIO){
FadeColors(fadeColor);
FadeInOut(fadeR, fadeG, fadeB);
if(fade == 512){
fade = 0;
fadeColor++;
}
if(fadeColor > 5) // Begrenzung der wechselnden Farben im Switch Case von FadeColors()!
fadeColor = 0;
prevMillisFadeIO = thisMillisFadeIO;
}
}
break;
case 6: { // COLOR FADE
thisMillisCFlow=millis();
if(thisMillisCFlow - prevMillisCFlow >= intervalCFlow){
Wheel(color);
color++;
prevMillisCFlow = thisMillisCFlow;
}
}
break;
case 7: { // RAINBOW
thisMillisRainbow=millis();
if(thisMillisRainbow - prevMillisRainbow >= intervalRainbow){
if(j < 256){
j++;
}
else
j = 0;
prevMillisRainbow = thisMillisRainbow;
}
}
break;
case 8: { // Black/off
pixelColor = strip.Color(0, 0, 0);
}
break;
}
}