0

我有以下代码,但它有问题。它可以编译,但 NeoPixel 矩阵上没有任何反应。我已经加载了一个链测试以验证硬件是否正常工作。通过一些手动调试,我发现包含PixelArt art = PixelArt(matrix);触发问题的行。如果我将其注释掉,我会按预期从光矩阵中发出一束橙色光。把它放回去只会导致黑暗。

包括那一行会引起问题怎么办?我是 C++ 新手,这让我很难受。

对于某些代码上下文,我计划包含更多模式,每个模式都有一系列子模式。PixelArt 将展示不同的像素艺术图片作为其子模式。其他模式将包括不同的动画模式。不同的模式都应该共享对同一个矩阵对象的引用。

#include <Adafruit_NeoMatrix.h>
#include <gamma.h>

#define MODE_PIN 2
#define SUB_MODE_PIN 3

#define MATRIX_PIN 9
#define MATRIX_COLUMNS 16
#define MATRIX_ROWS 16
#define MATRIX_NUM_PIXELS (MATRIX_COLUMNS * MATRIX_ROWS)

class Mode {
  public:
    Mode(Adafruit_NeoMatrix &neomatrix) : matrix{&neomatrix} {}
    virtual void toggleSubMode() = 0;
    virtual void update(uint64_t timestamp) = 0;
  protected:
    Adafruit_NeoMatrix * const matrix;
};

class PixelArt : public Mode {
  public:
    PixelArt(Adafruit_NeoMatrix &neomatrix):Mode(neomatrix) {}
    void toggleSubMode();
    void update(uint64_t timestamp);
};

void PixelArt::toggleSubMode() {
  // Stubbed.
}

// Green: 0x80c000
// Brown: 0xc04000
// Tan:   0xffa040
uint32_t link[16][16] = { [REDACTED FOR BREVITY] };

void PixelArt::update(uint64_t timestamp) {
  matrix->clear();

  for (uint16_t row = 0; row < 16; row++) {
    for (uint16_t column = 0; column < 16; column++) {
      matrix->setPassThruColor(link[row][column]);
      matrix->drawPixel(column, row, 0);
      matrix->setPassThruColor();
    }
  }

  matrix->show();
}

//

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
  MATRIX_COLUMNS,
  MATRIX_ROWS,
  MATRIX_PIN,
  NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_COLUMNS | NEO_MATRIX_ZIGZAG,
  NEO_GRB | NEO_KHZ800
);

PixelArt art = PixelArt(matrix);

void setup() {
  matrix.begin();
  matrix.show();
  matrix.setBrightness(30); // Max ~80
}

uint8_t mode = 0;

void loop() {
//  art.update(millis());

  matrix.fillScreen(matrix.Color(255, 127, 0));
  matrix.show();
}
4

1 回答 1

1

我的建议是,因为代码在微控制器上运行,它可能会耗尽内存。特别是如果目标板是 Arduino Uno 或类似的,动态内存很小。编译后,对编译时变量进行内存使用计算。运行时变量和函数调用可能会超出可用内存。

为 Arduino Uno 编译,编译器计算PixelArt对象的 1204 字节 (58%) 动态内存使用量。没有它是 168 字节 (8%)。

尝试降低继承和函数调用级别。

于 2020-08-22T10:19:54.927 回答