Ambilight DIY Problem

Hallo erstmal,
ich habe mir mit dem Arduino UNO, ein Amblight für meinen 55 zoll Fernseher gebaut.
Das Problem ist nun das es ca. 150 einzelne LEDs sind die von Prismatik angesteuert werden, dies führt dazu das, das Programm langsamer die Farben ändert und mit dem Bild gar nicht mehr hinterherkommt.

Nun zu meiner Frage: ist es möglich nur jede 2. LED auf dem streifen anzusteuern (WS2812b) damit ich quasi nur die hälfte an LEDS mit Prismatik ansteuer, möchte mir nicht unbedingt einen neunen Streifen kaufen.

P.S den Code für den Arduino hab ich verlinkt, wenn wer weiß was ich im Code änder muss bitte schreiben.

Danke im Vorraus!

MfG,
Thomas

LEDstream_FastLED.ino (1.09 KB)

Fixer Gedanke:

  1. Anzahl der LEDs anpassen, also NUM_LEDS auf 25
  2. ganz unten im Programm, in der for-Schleife: nicht die i. Stelle, sondern (2i). Stelle auf dem Array ändern.... also _leds[2i].r = Serial.read();_

Woher kommen diese Timingprobleme?
150 WS2812 sind in ca 250µS programmiert ( 187,5µS für die Datenübertragung und 50µS für den Reset).
Auch wenn Du nur jedes 2. WS2812 ansteuerrst dauert die Datenübertragung gleich lang. Ok, es ändert sich das Einlesen der Daten, weil nur halbsoviele Werte geändert werden müssen.
Ok die serielle Schnittstelle ist das Nadelöhr, vor allem auch deshalb weil Du für 3 RGB Werte immens viele Byte lesen mußt.

Dein Sketch:

#include "FastLED.h"
#define NUM_LEDS 50
#define DATA_PIN 4
#define serialRate 500000
static const uint8_t prefix[] = {'A', 'd', 'a'};

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
      FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
      Serial.begin(serialRate);
      Serial.print("Ada\n");
}

void loop() { 
      for(int i = 0; i < sizeof(prefix); ++i){
            while (!Serial.available());
            if(prefix[i] != Serial.read()) 
            return;
      }
      while(Serial.available() < 3);
      int highByte = Serial.read();
      int lowByte  = Serial.read();
      int checksum = Serial.read();
      if (checksum != (highByte ^ lowByte ^ 0x55)){
            return;}

      uint16_t ledCount = ((highByte & 0x00FF) << 8 | (lowByte & 0x00FF) ) + 1;
      if (ledCount > NUM_LEDS){
            ledCount = NUM_LEDS;}
            
      for (int i = 0; i < ledCount; i++){
            while(Serial.available() < 3);
            leds[i].r = Serial.read();
            leds[i].g = Serial.read();
            leds[i].b = Serial.read();}
            FastLED.show();
}

Am Anfang wird auf A, d oder a gewartet.
Dann 3 Werte gelesen solange nicht endlich 3 Byte im Buffer sind aber zwischenzeitlich der Buffer ausgelesen.
Dann 3 BYte für jede LED ausgelesen wieder mit der unsinnigen While Schleife.
Da kommt irgendwas an, abhängig wie schnell sich der Eingangsbuffer füllt.

While wartet nicht bis die Bedingung war ist und führt dann die Funktionen in den geschwungenen Klammern aus. While wiederholt die Schleife solange die Bedingung wahr ist.

Grüße Uwe

Du solltest FastLed.show() nicht nach dem Empfang eines jeden RGB Wertes aufrufen,
sondern erst nachdem alle empfangen wurden.

Auf Grund der grottigen Formattierung habe ich ein drangeklatschtes '}' übersehen,
ziehe meinen Kommentar zurück.