New Need Help Reducing Code Size

Hi, I'm really new to this kinda stuff and I have this sample code that I need to reduce the Global variable from 3328 bytes (162%) to 2048 bytes maximum. I'm still learning all this coding stuff, but I'm using an Elegoo Uno R3, and I'm running about 580 WS2812b Neopixel Leds. If you have any questions please ask, and ill try and answer them to the best of my ability! :grinning:

Mello.ino (7.95 KB)

(deleted)

If you want to store the color of each pixel then you need 580 x 3 = 1740 bytes. That's already consuming 85% of your RAM leaving not much for the rest.

Now you have two options:

  • Don't store the color of each led. You might be able to reuse memory (led's with same color or calculating on the fly)
  • Use a micro with more RAM

Instead of 24 bit 8:8:8 colour, you could try one of the sixteen bit schemes, like 5:8:3 or 5:6:5

Any table consisting of consecutive integers is redundant, as a lookup can be a simple calculation.

 const uint16_t XYTable[] = {
     0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  
...

After this declaration, XYTable[i] == i unless the array bounds are exceeded.

Such a table shouldn't be in RAM anyway (I can't see the code)

//Sample Pattern for V2 Mello Head with 558 LEDs using WS2812b by @jotamakuro
#include "FastLED.h"

// Params for width and height
const uint8_t kMatrixWidth = 54;
const uint8_t kMatrixHeight = 13;

#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
CRGB leds[ NUM_LEDS ];
#define LAST_VISIBLE_LED 558
uint16_t XY (uint16_t x, uint16_t y) {
  // any out of bounds address maps to the first hidden pixel
  if ( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) {
    return (LAST_VISIBLE_LED + 1);
  }

  const uint16_t XYTable[] = {
     0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,
    54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107,
   108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161,
   162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
   216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269,
   270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323,
   324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
   378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431,
   432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485,
   486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
   540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593,
   594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647
  };

  uint16_t i = (y * kMatrixWidth) + x;
  uint16_t j = XYTable[i];
  return j;
}
// Increment the global hue value for functions that use it
byte cycleHue = 0;
byte cycleHueCount = 0;
void hueCycle(byte incr) {
    cycleHueCount = 0;
    cycleHue+=incr;
}


// #define NUM_LEDS 558 

// CRGB leds[NUM_LEDS];

#define PIN 9 

int myCounter = 0;
int myCounter2 = 0;
int myCounter3 = 0;

void setup()
{
  FastLED.addLeds<WS2811, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}


void loop() {
  FastLED.setBrightness(50);
    //myLights();
    slantBars();
   
  // AllRunningLights();
  // FastLED.setBrightness(50);
  // FlashLights();
  
}

void slantBars() {

  static byte slantPos = 0;

  // startup tasks
  // if (effectInit == false) {
  //   effectInit = true;
  //   effectDelay = 5;
  // }

  for (byte x = 0; x < kMatrixWidth; x++) {
    for (byte y = 0; y < kMatrixHeight; y++) {
      leds[XY(x, y)] = CHSV(cycleHue, 255, quadwave8(x * 32 + y * 32 + slantPos));
    }
  }

  slantPos -= 4;

}

void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
  int Position=0;
    
  for(int i=0; i<NUM_LEDS*3; i++)
  {
      if(myCounter<6) {
      
      Position++; //  = 0; //Position + Rate;
      for(int i=0; i<NUM_LEDS; i++) {
        // sine wave, 3 offset waves make a rainbow!
        //float level = sin(i+Position) * 127 + 128;
        setPixel(i,127,127,127);
        float level = sin(i+Position) * 127 + 128;
        setPixel(i,((sin(i+Position) * 127 + 128)/255)*red,
                   ((sin(i+Position) * 127 + 128)/255)*green,
                   ((sin(i+Position) * 127 + 128)/255)*blue);
      
      }
      
      showStrip();
      myCounter = myCounter + 1;
    } 
    else { 
      myCounter = 0;
      return; }
  }
}

void AllRunningLights() {

while(myCounter3<5) {
  RunningLights(0x00,0x80,0xff, 10);
  RunningLights(0xEE,0x00,0xEE, 10);
  RunningLights(0xff,0xff,0xff, 10);
  RunningLights(0xff,0x70,0x00, 10);
  RunningLights(0xff,0x10,0x10, 10);
  RunningLights(0x26,0xff,0x00, 10);
  myCounter3 = myCounter3 + 1;

     } 
      myCounter3 = 0;
      return;

}

void myLights() {
  fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 128, 255) ); //1

     showStrip();

}


void FlashLights() {

    while(myCounter2<10) {
  
     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 128, 255) ); //1

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 238, 0, 238) ); //2

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 255, 255, 255) ); //3

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 255, 112, 0) ); //4

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 255, 16, 16) ); //5

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 38, 255, 0) ); //6

     showStrip();
     delay(100);

     fill_solid( &(leds[0]), 558 /*number of leds*/, CRGB( 0, 0, 0) );

     showStrip();
     delay(40);

      myCounter2 = myCounter2 + 1;

     } 
      myCounter2 = 0;
      return;
   
}

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}