我正在开发一个Arduino项目,我想在NeoMatrix 8x8面板上显示图标。
最初,我朝着依赖继承的方向发展,并要求在Arduino Stack Exchange上进行一些输入,建议我走另一条路线,并在其他地方问我的问题,它与C ++的关系是否比Arduino更重要。 / p>
建议不要依赖继承,而是将图标存储在PROGMEM中,并让程序从那里构建图标。
我尽了最大的努力来尝试这种方法,但是我并不放心,所以我想进一步了解一下!
据我所知,存储在PROGMEM中的字节数组作为指针读取,需要使用 ppm_read_byte 访问。
我不确定如何处理RGB结构。当我尝试从PROGMEM中读取它时,它将导致我的程序崩溃。因此,我将其从PROGMEM中删除,该图标正确显示。我的字节数组在PROGMEM中,但没有颜色。
我知道我对需要处理的指针的知识严重缺乏...
另外,这个想法是要有图标的集合,所以我应该将所有图标(字节数组和颜色)存储在头文件中吗?那会不会肿呢?
在此先感谢您的见解!
header.h
typedef struct {
byte r;
byte g;
byte b;
} RGB;
const byte PROGMEM WifiIcon[8][8] = {
{1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 2, 2, 2, 2, 1, 1},
{1, 2, 1, 1, 1, 1, 2, 1},
{2, 1, 2, 2, 2, 2, 1, 2},
{1, 2, 1, 1, 1, 1, 2, 1},
{1, 1, 1, 2, 2, 1, 1, 1},
{1, 1, 2, 1, 1, 2, 1, 1},
{0, 0, 0, 1, 1, 0, 0, 0}
};
const RGB WifiIconColors[3] = {
{0, 0, 0},
{0, 0, 0},
{0, 200, 61}
};
ESP8266Neomatrix.ino
#include "header.h"
void printIcon(int startPosition, const byte (&icon)[8][8], const RGB (&colors)[3]){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
byte currentPixel = pgm_read_byte(&icon[i][j]);
const RGB currentColor = colors[currentPixel];
byte red = currentColor.r;
byte green = currentColor.g;
byte blue = currentColor.b;
matrix.setPixelColor(startPosition++, red, green, blue);
}
}
}
https://gist.github.com/Nate1661/0eea9200e9d1c86187c2acf205ba3602
答案 0 :(得分:0)
如果您希望RGB数据驻留在PROGMEM中,由于它不是pgm_read_XXX
函数处理的本机类型,只需使用memcpy_P()
进行读取:
RGB currentColor;
memcpy_P(¤tColor, colors + currentPixel, sizeof(RGB));
如果崩溃,则可能是您读取的currentPixel
值存在问题。