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]