Speicherprobleme

Ok, hier erst mal ein Test Sketch um ein einzelnes Array auszulesen:

#include <avr/pgmspace.h>

const uint8_t melody_1[] PROGMEM =
{
    0x00, 0x90, 0x2b,
    0x81, 0x3e, 0x90, 
    0x37, 0x32, 0x80, 
    0x2b, 0x00, 0x80, 
    0x37, 0x20, 0xff  
};

void setup() 
{
  Serial.begin(115200);
  delay(300);
  Serial.print(F("RAM: "));
  Serial.println(getFreeRAM());
}

void loop() 
{
  for(int i = 0; i < 15; i++)
    Serial.println(pgm_read_byte_near(&melody_1[i]), HEX);
    
  Serial.println("\n");
  delay(3000);
}

Wichtig ist hier:

pgm_read_byte_near(&melody_1[i])

Besonders das &. Du musst dem Makro die Adresse des Wertes übergeben. Alternativ geht hier auch "melody_1 + i", da Array Variablen Zeiger auf das erste Element sind.

Dann zum jagged Array. Das geht doch ganz einfach. Auch mit pgm_read_byte_near(). Also vergiss was ich vorher gesagt habe:

const byte melody_1[] PROGMEM =
{
    0x00, 0x90, 0x2b,
    0x81, 0x3e, 0x90, 
    0x37, 0x32, 0x80, 
    0x2b, 0x00, 0x80, 
    0x37, 0x20, 0xff  
};

const byte melody_2[] PROGMEM =
{
    0x11, 0x12, 0x13,
    0x14, 0x15, 0x16, 
    0x17, 0x18, 0x19,
};

const byte* melodies[] PROGMEM = { melody_1, melody_2 };

void setup() 
{
  Serial.begin(115200);
  delay(300);
  Serial.print(F("RAM: "));
  Serial.println(getFreeRAM());
}

void loop() 
{
  for(int i = 0; i < 15; i++)
    Serial.println(pgm_read_byte_near(&(melodies[0][i])), HEX);
    
  Serial.println();
  
 for(int i = 0; i < 9; i++)
    Serial.println(pgm_read_byte_near(&(melodies[1][i])), HEX);
    
  Serial.println("\n");
  delay(3000);
}

Eigentlich logisch. Sollte ja auch im Flash nicht anders gehen als ein normales zwei-dimensionales Array. Also einfach mit [1][2]