Optimizar codigo para ahorrar memoria Sram para tira de Leds ws2812b

Buenos dias

Tengo un Attiny 85 con 512 Bytes de memoria ram quiero controlar 160 led WS2812b con la libreria Fastled, con la memoria que tengo solo me da para controlar 100 led , me gustaria que me echarais una mano con el codigo pues lo que queria hacer es utilizar PROGMEM con el objetivo de liberar la memoria flash y liberar un poco la SRAM; mis conocimientos de programacion son un poco limitados. Muchas gracias de antemano. Aqui esta el codigo.

#include <FastLED.h>
#define LED_PIN     0
//#define CLOCK_PIN 4 
#define NUM_LEDS    100
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  200
CRGB leds[NUM_LEDS];


void setup() {
   
    delay(1000);
  
    
    LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
//  LEDS.addLeds<LED_TYPE, LED_PIN, CLOCK_PIN COLOR_ORDER>(leds, NUM_LEDS);
    FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  
  FastLED.clear();
  fill_solid(leds, NUM_LEDS, CRGB(255,0,0));
  FastLED.show();
  delay(2000);
  FastLED.clear();
  
  fill_solid(leds, NUM_LEDS, CRGB(0,255,0));
  FastLED.show();
  delay(2000);
  FastLED.clear();

  fill_solid(leds, NUM_LEDS, CRGB(0,0,255));
  FastLED.show();
  delay(2000);
  FastLED.clear();

  for(int i=0;i<NUM_LEDS;i++){
    leds[i].setRGB(255,0,0);
    FastLED.show();
    delay(20);
 }
  FastLED.clear();

    for(int i=0;i<NUM_LEDS;i++){
    leds[i].setRGB(0,255,0);
    FastLED.show();
    delay(20);
 }
  FastLED.clear();

    for(int i=0;i<NUM_LEDS;i++){
    leds[i].setRGB(0,0,255);
    FastLED.show();
    delay(20);
 }
  FastLED.clear();

 for(int i=0;i<NUM_LEDS;i++){
   fill_rainbow(leds,i, 0, 5);
   FastLED.show();
   delay(20);
 }
  FastLED.clear();

 for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(0,0,0);
   leds[i].setRGB(255,0,0);
   FastLED.show();
   delay(20);
 }
  FastLED.clear(); 

   for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(0,0,0);
   leds[i].setRGB(0,255,0);
   FastLED.show();
   delay(20);
 }
  FastLED.clear(); 
 
  for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(0,0,0);
   leds[i].setRGB(0,0,255);
   FastLED.show();
   delay(20);
 }
   FastLED.clear();
  
  for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(255,0,0);
   leds[i].setRGB(255,255,255);
   FastLED.show();
   delay(20);
 }
   FastLED.clear();
  
  for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(0,255,0);
   leds[i].setRGB(255,255,255);
   FastLED.show();
   delay(20);
 } 
 for(int i=0;i<NUM_LEDS;i++){  
   leds[i-3].setRGB(0,0,255);
   leds[i].setRGB(255,255,255);
   FastLED.show();
   delay(20);
 }
 for(int i = 0; i < NUM_LEDS; i++) {
   leds[i-3].setRGB(125,0,125);
   leds[i].setRGB(255,255,255);
   FastLED.show();
   delay(20);
  }
  
 FastLED.clear();

 } // loop

Pero PROGMEM es para guardar datos fijos como si fueran constantes. No tienes en tu código algo que se pueda optimizar de ese modo. Solo hace falta SRAM.

#define NUM_LEDS    100
CRGB leds[NUM_LEDS];

Esto solo requiere SRAM. Asi que no hay solución posible, según veo.
A ver que opinan otros.

Suponendo que tienes un Arduino basado en Atmega328P (Uno, Nano, Pro mini), tienes 2048 bytes de memoria RAM, de los cuales 700 deben estar libres inicialmente para garantizar una ejecución confiable (menos que eso hay riesgo de cuelgue).

Dado a que CRGB es una clase (tiene funciones), y por ende, un "objeto"; cada LED necesita 2 (aquí los punteros de memoria son de 16 bits) + lo que sea que ocupe un "objeto" de estos (en bytes); supongamos que 3 bytes, uno para cada canal rojo, verde y azul.
Entonces tenemos que: 100 * (2 + 3) = 500 bytes. La librería SD consume más que eso.

500 bytes + lo que necesite la librería (no creo que sea mucho) + las variables para millis, micros y delay, con ese código no debería haber problemas.
Optimizar sería del lado de la librería, porque en ese código no hay mucho que hacer...

Pero tiene un Attiny 85!

Exacto un Attinny 85 programado por un ardruino uno por isp , os doy las gracias por vuestras respuesta voy a seguir mirando a ver si puedo reducir la libreria concretamente la clase CRGB , sino intentare cambiar por un microprocesador con mayor sram , un saludo

Es que si CRGB fuera struct y no class, nos quitamos el puntero y nos ahorraríamos 200 bytes de RAM. Creo que FastLED lo único que hace es iterar sobre el vector de LEDs para aplicar el color establecido a cada uno de ellos, si tan solo se pudiera modificar dicha rutina para que acepte CRGB como struct.

Incluso, si se estudia bien, podríamos prescindir de la librería y tomar de ella sólo las rutinas necesarias. Lo digo porque sólo la de aplicar los colores, está escrita en ensamblador para atiempar correctamente los flancos de la línea de datos.
Recuerda que el Attiny85 básicamente no tiene periféricos para comunicación (excepto el "solo-esclavo" SPI que se utiliza para programarlo), entonces todo eso tiene que ser emulado por software (lo que en inglés se como "bit banging").

Prueba esta librería light_WS2812 que puede ser tu solución, no lo se.
Tendras que adaptarte.