Pointer - PROGMEM Array in PROGMEM Array

Hallo liebe Community,

auf meiner LED Matrix gibt es ein Array über das man die jeweilige LED finden kann, dies liegt im Progmem. Darüber läuft unter anderem die Laufschrift.

Jetzt möchte ich auch Bitmaps anzeigen und das ganze sollte einfach auf eine andere Matrix portierbar sein. Ich habe versucht die entsprechende LEDs, die leuchten sollen in ein neues Array zu laden.

Leider quittiert mir der NodeMCU das ganze mit dem Wert 225, anstatt 20 wie es im Array steht.

const byte matrix[13][12] PROGMEM = {
  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
  {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12},
  {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35},
  {47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36},
  {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59},
  {71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60},
  {72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83},
  {95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84},
  {96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107},
  {119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108},
  {120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131},
  {143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132},
  {144, 145, 146, 147}
};

const byte* foobar[] = {&matrix[1][3]};

void setup() {
Serial.begin(9600);
Serial.println("Ausgabe sollte 20 sein - Ergebnis: ");
Serial.println(pgm_read_byte(&foobar[0]));
}

void loop() {
  // put your main code here, to run repeatedly:
}

Kann mir jemand bitte einen Denkanstoss geben?

Vielen Dank für Eure Hilfe :)!

Liebe Grüße,
Björn

const byte* foobar[] = {&matrix[1][3]};
const byte* foobar {&matrix[1][3]};

Hallo combie,

vielen Dank für deine Antwort :)!

Mit einem Eintrag "&matrix[1][3]" klappt es perfekt danke.

Wenn ich jetzt aber mehrere LEDs aus der Matrix auswählen will klappt es nicht mehr, da ich laut Fehlermeldung nur ein Element angegeben darf.

Wie geht das ganze mit mehreren? z.B. &matrix[1][3], &matrix[2][3], &matrix[2][4], &matrix[2][6], &matrix[2][7].

So geht es nicht:

const byte* foobar[] PROGMEM {&matrix[1][3], &matrix[2][3], &matrix[2][4], &matrix[2][6], &matrix[2][7]};

Liebe Grüße,
Björn

Langweilig…

So geht es nicht:

Doch, genau so!

  template<typename ArrayType, size_t count> 
    constexpr size_t arrayCount(const ArrayType (&)[count])
    {
      return count;
    }


const byte matrix[13][12] PROGMEM =
{
  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
  {23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12},
  {24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35},
  {47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36},
  {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59},
  {71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60},
  {72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83},
  {95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84},
  {96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107},
  {119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108},
  {120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131},
  {143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132},
  {144, 145, 146, 147}
};

const byte* foobar[] PROGMEM {&matrix[1][3], &matrix[2][3], &matrix[2][4], &matrix[2][6], &matrix[2][7]};


void setup()
{
  Serial.begin(9600);
  for(unsigned i=0;i<arrayCount(foobar);i++)Serial.println(pgm_read_byte(pgm_read_ptr(i+foobar)));
}

void loop()
{
  // put your main code here, to run repeatedly:
}

Tipp:
Umgang mit Pointern und PROGMEM lernen.

Nochmal vielen, vielen Dank für deine Hilfe combie :)!

Ich werde deinen Tipp beherzigen und mich nochmal genauer in die Materie einlesen.

Liebe Grüße,
Björn

wozu für sowas überhaupt ein Array?

Das kannst mit einer Funktion auch ermitteln
"gerade" Reihen sind aufsteigend, ungerade Reihen sind absteigend.

aus einer 16x16 Matrix nur als Ideenlieferant:

// calculate x and y coordinates from for a given position
// position 0 is 0,0
coordinateType position2coordinate(byte position)
{
  coordinateType result;
  byte row = position / 16;
  result.y = row;
  if (row % 2)
    result.x = 15 - position % 16;     //even rows in my s-Grid
  else
    result.x = position % 16;          //odd rows in my s-Grid
  return result;
}

Hallo noiasca,

danke für deinen Denkanstoß - und btw. cooler Baubericht :)!

Ich werde versuche mich von meinem Matrix-Array zu lösen und versuchen die Bitmaps durch Berechnung richtig zu setzen - werde dann berichten.

Liebe Grüße,
Björn