ProgMem

Guten Abend ;),
schnell ein Frage, da ich nicht wirklich schlau draus werde.

Kann ich Daten, die im PROGMEM sind auch direkt dort manipulieren?

Mir scheint mit meinem Code massiv der RAM auszugehen, so das sich der Code schon ganicht mehr kompillieren lässt.
Meine Idee ist das Struct Array im PROGMEM zu speichern. Das würde mir 320Byte + Adressen RAM einsparen

Problem ist es scheint so, als könne ich von dort aus nur Daten auslesen.

#include <WS2812.h>

#define F_CPU 8000000L
#define PIN_DATA_RIGHT 7
#define PIN_DATA_LEFT 11
#define MAX_LEDS 10

int moveSpeed;

int valActRight, valOldRight;
float valMidRight, percentRight;

int valActLeft, valOldLeft;
float valMidLeft, percentLeft;

WS2812 channelRight(MAX_LEDS/2);
WS2812 channelLeft(MAX_LEDS/2);
cRGB ledData[MAX_LEDS];

void setup()
{
  channelRight.setOutput(PIN_DATA_RIGHT);
  channelRight.setColorOrderRGB();
  
  channelLeft.setOutput(PIN_DATA_LEFT);
  channelLeft.setColorOrderRGB();
}

void loop() 
{
  valActRight = analogRead(4);
  valActLeft  = analogRead(2);
  moveSpeed   = map(analogRead(3), 0, 1023, 10, 50); 
  
  //Rechten Kanal einstellen
  percentRight = valMidRight/(valActRight - valMidRight);
  if(percentRight <= 0.45 && percentRight > 0)
  {     
    moveForward(true); 
    setColor(percentRight, true);
  }
  
  //Linken Kanal einstellen
  percentLeft = valMidLeft/(valActLeft - valMidLeft);
  if(percentLeft <= 0.45 && percentLeft > 0)
  {     
    moveForward(false); 
    setColor(percentLeft, false);
  }
  
  //Mittelwert bilden und den alten Wert auf den neuen setzen
  valMidRight = (valActRight + valOldRight)*0.5;
  valOldRight =  valActRight;
  valMidLeft  = (valActLeft + valOldLeft)*0.5;
  valOldLeft  =  valActLeft;
  
  delay(moveSpeed);
}

//Alle Leds auf die Farbe des Vorgängers setzen
void moveForward(boolean right)
{
  if(right == true) { 
    for(int i = MAX_LEDS/2 - 1; i >= 1 ; i--)
    {
      ledData[i].r = ledData[i - 1].r;
      ledData[i].g = ledData[i - 1].g;
      ledData[i].b = ledData[i - 1].b;
    }
  }
  else
  {
    for(int i = MAX_LEDS - 1; i >= MAX_LEDS/2 - 1 ; i--)
    {
      ledData[i].r = ledData[i - 1].r;
      ledData[i].g = ledData[i - 1].g;
      ledData[i].b = ledData[i - 1].b;
    }
  }
}

void showLEDs(boolean right)
{
  if(right == true)
  {
    for(int i = 0; i < MAX_LEDS/2; i++)
    {
      channelRight.set_crgb_at(i, ledData[i]);
    }
  
    channelRight.sync(); //Farben anzeigen
  }
  else
  {
    for(int i = MAX_LEDS/2; i < MAX_LEDS; i++)
    {
      channelLeft.set_crgb_at(i - MAX_LEDS/2, ledData[i]);
    }
  
    channelLeft.sync(); //Farben anzeigen
  }
}

void setColor(float value, boolean right)
{
  int offset = right == true?0:(MAX_LEDS/2);
  
  //Farbe der ersten LED berechnen
  unsigned long rgb = 0x00FFFFFF*(map(value*100, 0, 45, 0, 100)/100.0);
  ledData[offset].r =   rgb&0x000000FF;
  ledData[offset].g = ((rgb&0x0000FF00) >> 8);
  ledData[offset].b = ((rgb&0x00FF0000) >> 16);
    
  //Farbe anzeigen
  showLEDs(right);
}

Hat sich erledigt >.<

Muss mir da was anderes überlegen.

Die Ansteuerung der WS2812 ist sehr zeitkritisch und nur durch Assembler realisierbar. Darum muß der Speicher im RAM sein.
Das Flash ist nur umständlich zu verändern. Das EEprom ist da einfacher aber nicht schnell genug für die Datenübertragung zu den Ws2812 auslesbar.

Grüße Uwe