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);
}