3 Stück 8x8 LED Matrix via Array ansteuern

Hallo,

hab ein kleines Verständnisproblem.

Ich habe einen Arduino UNO R3 und an diesem sind 3 (BiColor) 8x8 LED Matrix-Panele angesteckt.
Jedes Panel hat seine eigene Adresse (0x70,0x71,0x72).
Das ansteuern klappt, kann auf allen etwas darstellen.
Bin diesem Tutorial gefolgt:

Jetzt blick ich aber am Schluss nicht wie die eine Bitmap (mouthImg[][24] =) auf drei Panele bekommen haben.
Mein Sketch sieht so weit so aus:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"

Adafruit_BicolorMatrix matrix[4] = Adafruit_BicolorMatrix();

void setup() {
  Serial.begin(9600);
  Serial.println("8x8 LED Matrix Test");

   for(uint8_t i=0; i<3; i++) {
   matrix[i].begin(0x70 + i);
  }
}

static const uint8_t PROGMEM
  test[][24] = {                 
  { B00000000, B00000000, B00000000, 
    B00000000, B00000000, B00000000,
    B01111111, B11111111, B11111110,
    B00000000, B00000000, B00000000,
    B00000000, B00000000, B00000000,
    B00000000, B00000000, B00000000,
    B00000000, B00000000, B00000000,
    B00000000, B00000000, B00000000 },
  };

void loop() {
for(uint8_t i=0;i<3;i++){
  matrix[i+1].clear();
  matrix[i+1].drawBitmap(i * -8, 0, test, 24, 8, LED_GREEN);
  matrix[i+1].writeDisplay();
  delay(500);

  }
}

Als Fehlermeldung kommt folgendes:

Arduino: 1.8.1 (Windows 10), Board: "Arduino/Genuino Uno"

C:\Users\Benno\Desktop\Neuer Ordner (2)\_1\_1.ino: In function 'void loop()':

_1:31: error: no matching function for call to 'Adafruit_BicolorMatrix::drawBitmap(int, int, const uint8_t [1][24], int, int, int)'

   matrix[i+1].drawBitmap(i * -8, 0, test, 24, 8, LED_GREEN);

                                                           ^

C:\Users\Benno\Desktop\Neuer Ordner (2)\_1\_1.ino:31:59: note: candidates are:

In file included from C:\Users\Benno\Desktop\Neuer Ordner (2)\_1\_1.ino:2:0:

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:67:5: note: void Adafruit_GFX::drawBitmap(int16_t, int16_t, const uint8_t*, int16_t, int16_t, uint16_t)

     drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],

     ^

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:67:5: note:   no known conversion for argument 3 from 'const uint8_t [1][24] {aka const unsigned char [1][24]}' to 'const uint8_t* {aka const unsigned char*}'

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:69:5: note: void Adafruit_GFX::drawBitmap(int16_t, int16_t, const uint8_t*, int16_t, int16_t, uint16_t, uint16_t)

     drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],

     ^

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:69:5: note:   candidate expects 7 arguments, 6 provided

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:71:5: note: void Adafruit_GFX::drawBitmap(int16_t, int16_t, uint8_t*, int16_t, int16_t, uint16_t)

     drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,

     ^

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:71:5: note:   no known conversion for argument 3 from 'const uint8_t [1][24] {aka const unsigned char [1][24]}' to 'uint8_t* {aka unsigned char*}'

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:73:5: note: void Adafruit_GFX::drawBitmap(int16_t, int16_t, uint8_t*, int16_t, int16_t, uint16_t, uint16_t)

     drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,

     ^

C:\Users\Benno\Documents\Arduino\libraries\Adafruit-GFX-Library-master/Adafruit_GFX.h:73:5: note:   candidate expects 7 arguments, 6 provided

exit status 1
no matching function for call to 'Adafruit_BicolorMatrix::drawBitmap(int, int, const uint8_t [1][24], int, int, int)'

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Was genau läuft falsch und wie kann ich die LED Panele mit einem Bitmap zum laufen bringen anstatt drei?

Schon mal Danke

Hab mir auch mal den dazugehörigen eingebetteten Code angeschaut.
Ehrlich gesagt sehen meine ungeschulten Augen keine Unstimmigkeiten.
Ich wüsste nicht was ich anders machen müsste.
Hier mal die Adafruit_GFX.h:

#ifndef _ADAFRUIT_GFX_H
#define _ADAFRUIT_GFX_H

#if ARDUINO >= 100
 #include "Arduino.h"
 #include "Print.h"
#else
 #include "WProgram.h"
#endif
#include "gfxfont.h"

class Adafruit_GFX : public Print {

 public:

  Adafruit_GFX(int16_t w, int16_t h); // Constructor

  // This MUST be defined by the subclass:
  virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;

  // TRANSACTION API / CORE DRAW API
  // These MAY be overridden by the subclass to provide device-specific
  // optimized code.  Otherwise 'generic' versions are used.
  virtual void startWrite(void);
  virtual void writePixel(int16_t x, int16_t y, uint16_t color);
  virtual void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
  virtual void writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
  virtual void writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
  virtual void writeLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
  virtual void endWrite(void);

  // CONTROL API
  // These MAY be overridden by the subclass to provide device-specific
  // optimized code.  Otherwise 'generic' versions are used.
  virtual void setRotation(uint8_t r);
  virtual void invertDisplay(boolean i);

  // BASIC DRAW API
  // These MAY be overridden by the subclass to provide device-specific
  // optimized code.  Otherwise 'generic' versions are used.
  virtual void
    // It's good to implement those, even if using transaction API
    drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),
    drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),
    fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color),
    fillScreen(uint16_t color),
    // Optional and probably not necessary to change
    drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),
    drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);

  // These exist only with Adafruit_GFX (no subclass overrides)
  void
    drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      uint16_t color),
    fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      int16_t delta, uint16_t color),
    drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
      int16_t w, int16_t h, uint16_t color),
    drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
      int16_t w, int16_t h, uint16_t color, uint16_t bg),
    drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
      int16_t w, int16_t h, uint16_t color),
    drawBitmap(int16_t x, int16_t y, uint8_t *bitmap,
      int16_t w, int16_t h, uint16_t color, uint16_t bg),
    drawXBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
      int16_t w, int16_t h, uint16_t color),
    drawGrayscaleBitmap(int16_t x, int16_t y, const uint8_t bitmap[],
      int16_t w, int16_t h),
    drawGrayscaleBitmap(int16_t x, int16_t y, uint8_t *bitmap,
      int16_t w, int16_t h),
    drawGrayscaleBitmap(int16_t x, int16_t y,
      const uint8_t bitmap[], const uint8_t mask[],
      int16_t w, int16_t h),
    drawGrayscaleBitmap(int16_t x, int16_t y,
      uint8_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y, const uint16_t bitmap[],
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap,
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y,
      const uint16_t bitmap[], const uint8_t mask[],
      int16_t w, int16_t h),
    drawRGBBitmap(int16_t x, int16_t y,
      uint16_t *bitmap, uint8_t *mask, int16_t w, int16_t h),
    drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
      uint16_t bg, uint8_t size),
    setCursor(int16_t x, int16_t y),
    setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),
    setTextSize(uint8_t s),
    setTextWrap(boolean w),
    cp437(boolean x=true),
    setFont(const GFXfont *f = NULL),
    getTextBounds(char *string, int16_t x, int16_t y,
      int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h),
    getTextBounds(const __FlashStringHelper *s, int16_t x, int16_t y,
      int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);

#if ARDUINO >= 100
  virtual size_t write(uint8_t);
#else
  virtual void   write(uint8_t);
#endif

  int16_t height(void) const;
  int16_t width(void) const;

  uint8_t getRotation(void) const;

  // get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
  int16_t getCursorX(void) const;
  int16_t getCursorY(void) const;

 protected:
  void
    charBounds(char c, int16_t *x, int16_t *y,
      int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
  const int16_t
    WIDTH, HEIGHT;   // This is the 'raw' display w/h - never changes
  int16_t
    _width, _height, // Display w/h as modified by current rotation
    cursor_x, cursor_y;
  uint16_t
    textcolor, textbgcolor;
  uint8_t
    textsize,
    rotation;
  boolean
    wrap,   // If set, 'wrap' text at right edge of display
    _cp437; // If set, use correct CP437 charset (default is off)
  GFXfont
    *gfxFont;
};

class Adafruit_GFX_Button {

 public:
  Adafruit_GFX_Button(void);
  // "Classic" initButton() uses center & size
  void initButton(Adafruit_GFX *gfx, int16_t x, int16_t y,
   uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
   uint16_t textcolor, char *label, uint8_t textsize);
  // New/alt initButton() uses upper-left corner & size
  void initButtonUL(Adafruit_GFX *gfx, int16_t x1, int16_t y1,
   uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
   uint16_t textcolor, char *label, uint8_t textsize);
  void drawButton(boolean inverted = false);
  boolean contains(int16_t x, int16_t y);

  void press(boolean p);
  boolean isPressed();
  boolean justPressed();
  boolean justReleased();

 private:
  Adafruit_GFX *_gfx;
  int16_t       _x1, _y1; // Coordinates of top-left corner
  uint16_t      _w, _h;
  uint8_t       _textsize;
  uint16_t      _outlinecolor, _fillcolor, _textcolor;
  char          _label[10];

  boolean currstate, laststate;
};

class GFXcanvas1 : public Adafruit_GFX {
 public:
  GFXcanvas1(uint16_t w, uint16_t h);
  ~GFXcanvas1(void);
  void     drawPixel(int16_t x, int16_t y, uint16_t color),
           fillScreen(uint16_t color);
  uint8_t *getBuffer(void);
 private:
  uint8_t *buffer;
};

class GFXcanvas8 : public Adafruit_GFX {
 public:
  GFXcanvas8(uint16_t w, uint16_t h);
  ~GFXcanvas8(void);
  void     drawPixel(int16_t x, int16_t y, uint16_t color),
           fillScreen(uint16_t color),
           writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);

  uint8_t *getBuffer(void);
 private:
  uint8_t *buffer;
};

class GFXcanvas16 : public Adafruit_GFX {
 public:
  GFXcanvas16(uint16_t w, uint16_t h);
  ~GFXcanvas16(void);
  void      drawPixel(int16_t x, int16_t y, uint16_t color),
            fillScreen(uint16_t color);
  uint16_t *getBuffer(void);
 private:
  uint16_t *buffer;
};

#endif // _ADAFRUIT_GFX_H

Vermutlich scheitert das am PROGMEM für test, das ist nicht kompatibel mit einem Array im SRAM. Entweder Du legst test ins RAM, oder kopierst vor drawBitmap() die anzuzeigende Bitmap ins RAM.

Ganz genau habe ich mir das nicht angeschaut, aber drawBitmap() erwartet u.a. ein eindimensionales uint8_t Array als Bitmap, Du übergibst aber ein zweidimensionales test[][24]. Probier mal mit einem Array mit mehreren Bitmaps:

 matrix[i+1].drawBitmap(i * -8, 0, test[n], 24, 8, LED_GREEN); //[n] ist Nummer der Bitmap im Array