256 RGB Matrix with fastled

OK. I think I have it fixed.

Your data is too big to fit into 64kB so you can't use the usual 16-bit pointers and array indexing. It took a while but I finally found that casting the frames to 'uint_farptr_t' (a.k.a. 'uint32_t') I could store the PROGMEM address in an array. Then, using "pgm_read_dword**_far**" you can fetch each pixel as a dword from a calculated PROGMEM address.

It compiles fine for an Arduino Mega 2560.

/* Arduino 256 RGB LEDs Matrix Animation Frame
   Using WS2812 LED Strips

  Created by Barre
*/

#include <avr/pgmspace.h>  // Needed to store stuff in Flash using PROGMEM
#include "FastLED.h"       // Fastled library to control the LEDs
#include "xmas.h"

// How many leds are connected?
#define NUM_LEDS 256

// Define the Data Pin
const byte DATA_PIN = RX;  // Connected to the data pin of the first LED strip

// Define the trasistor pin
const byte R_PIN = D2;

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

const uint_farptr_t Xitems[77] =
{
  (uint_farptr_t)Xmas001, (uint_farptr_t)Xmas002, (uint_farptr_t)Xmas003, 
  (uint_farptr_t)Xmas004, (uint_farptr_t)Xmas005, (uint_farptr_t)Xmas006, 
  (uint_farptr_t)Xmas007, (uint_farptr_t)Xmas008, (uint_farptr_t)Xmas009, 
  (uint_farptr_t)Xmas010, (uint_farptr_t)Xmas011, (uint_farptr_t)Xmas012, 
  (uint_farptr_t)Xmas013, (uint_farptr_t)Xmas014, (uint_farptr_t)Xmas015, 
  (uint_farptr_t)Xmas016, (uint_farptr_t)Xmas017, (uint_farptr_t)Xmas018, 
  (uint_farptr_t)Xmas019, (uint_farptr_t)Xmas020, (uint_farptr_t)Xmas021, 
  (uint_farptr_t)Xmas022, (uint_farptr_t)Xmas023, (uint_farptr_t)Xmas024, 
  (uint_farptr_t)Xmas025, (uint_farptr_t)Xmas026, (uint_farptr_t)Xmas027, 
  (uint_farptr_t)Xmas028, (uint_farptr_t)Xmas029, (uint_farptr_t)Xmas030, 
  (uint_farptr_t)Xmas031, (uint_farptr_t)Xmas032, (uint_farptr_t)Xmas033, 
  (uint_farptr_t)Xmas034, (uint_farptr_t)Xmas035, (uint_farptr_t)Xmas036, 
  (uint_farptr_t)Xmas037, (uint_farptr_t)Xmas038, (uint_farptr_t)Xmas039, 
  (uint_farptr_t)Xmas040, (uint_farptr_t)Xmas041, (uint_farptr_t)Xmas042, 
  (uint_farptr_t)Xmas043, (uint_farptr_t)Xmas044, (uint_farptr_t)Xmas045, 
  (uint_farptr_t)Xmas046, (uint_farptr_t)Xmas047, (uint_farptr_t)Xmas048, 
  (uint_farptr_t)Xmas049, (uint_farptr_t)Xmas050, (uint_farptr_t)Xmas051, 
  (uint_farptr_t)Xmas052, (uint_farptr_t)Xmas053, (uint_farptr_t)Xmas054, 
  (uint_farptr_t)Xmas055, (uint_farptr_t)Xmas056, (uint_farptr_t)Xmas057, 
  (uint_farptr_t)Xmas058, (uint_farptr_t)Xmas059, (uint_farptr_t)Xmas060, 
  (uint_farptr_t)Xmas061, (uint_farptr_t)Xmas062, (uint_farptr_t)Xmas063, 
  (uint_farptr_t)Xmas064, (uint_farptr_t)Xmas065, (uint_farptr_t)Xmas066, 
  (uint_farptr_t)Xmas067, (uint_farptr_t)Xmas068, (uint_farptr_t)Xmas069, 
  (uint_farptr_t)Xmas070, (uint_farptr_t)Xmas071, (uint_farptr_t)Xmas072, 
  (uint_farptr_t)Xmas073, (uint_farptr_t)Xmas074, (uint_farptr_t)Xmas075, 
  (uint_farptr_t)Xmas076, (uint_farptr_t)Xmas077
};

void setup()
{
  pinMode(R_PIN, OUTPUT);
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS); // Init of the Fastled library
  FastLED.setBrightness(50);
  FastLED.clear();
}

void loop()
{
  //digitalWrite(R_PIN, HIGH); // turn transistor ON

  // LEDMATRIX();
  RUNMATRIX();
}

void RUNMATRIX()
{
  // Frame 1-77
  FastLED.clear();

  for (byte frame = 0; frame < sizeof(Xitems) / sizeof(Xitems[0]); frame++)
  {
    uint_farptr_t ptr = Xitems[frame];
    
    for (long i = 0; i < NUM_LEDS; i++)
    {
      // Each pixel is a 'long' (a.k.a. 'dword')
      leds[i] = pgm_read_dword_far (ptr + (i * sizeof (long)));
    }
    
    FastLED.show();
    delay(400);
  }
}
1 Like