Keine 0 im Wert des Array bei Definition mit const

Hallo,

mit einer LED Matrix möchte ich eine Kerze simulieren. Das ganze nach dem Beispiel: Overview | Animated Flame Pendant | Adafruit Learning System
Dazu habe ich auch die Bilder einer Include Datei als Variable hinterlegt. Hier ein Ausschnitt:

const byte PROGMEM img[] = {0,0,12,38,0,0,0,0,0,72,158,3,0,0,0,0,145,226,49,0,0,0,22,211,239,113,0,0,0,64,247,238,179,0,0,0,118,255,236,221,13,0,1,166,255,232,231,32,0,5,188,253,225,239,40,0,11,208,227,191,241,41,0,14,205,169,122,212,40,0,16,169,94,49,153,36,0,14,113,34,5,89,27,0,8,53,8,0,37,15,0,2,12,0,0,7,4,0,0,0,0,0,0,0,0,
...

Wenn ich das Array img in meinem Test Script Ausgebe werden alle Werte mit 0 übersprungen. Diese brauche ich jedoch da die LED an der stelle aus sein soll.
Hier das Script

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_IS31FL3731.h>
#include "data.h"

#define I2C_ADDR 0x74       // I2C address of Charlieplex matrix
String stringOne, stringTwo, stringThree;

Adafruit_IS31FL3731_Wing matrix = Adafruit_IS31FL3731_Wing();
int i;


void setup() {
  matrix.begin();
  matrix.setRotation(2);
  debug("S6");
}


void loop() {
  uint8_t  x, y;
  int color;

  for (uint8_t x=0; x<15; x++) {   
    for (uint8_t y=0; y<7; y++) { 
        color = img[i++];
        matrix.clear();  // debug
        matrix.setCursor(0,0);  // debug
        matrix.print(color);  // debug
        delay(100);  // debug
//          matrix.drawPixel(x, y, color); 
        if (i == sizeof(img)) i = 0;
    } 
  }
}

void debug(String text){
  delay(500);
  for (int8_t x=0; x>=-32; x--) {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print(text);
    delay(100);
    matrix.clear();
  }
}

Wenn ich das Array direkt im loop definiere Bsp:

void loop() {
  uint8_t  x, y;
  int i, color;
  byte img[] = {0,0,12,38,0,0,0,0,0,72,158,3,0,0,0,0,145,226,49,0,0,0,22,211,239,113,0,0,0,64,247,238,179,0,0,0,118,...

dann funktioniert es und die 0er werden ausgegeben.

Ich bin ratlos :confused: und für alle Tipps dankbar.

Nur einfach PROGMEM hinschreiben reicht nicht. Du brauchst spezielle Makros um das auszulesen:

color = pgm_read_byte(&img[i++]);

oder:

color = pgm_read_byte(img + i);
i++;

Man übergibt die Adresse und bekommt die Daten zurück

So wie du das machst denkt der Compiler das steht im RAM. Und dann liest du irgendwelchen Quatsch aus.

Super danke, genau das war es :slight_smile: jetzt läufts :slight_smile: