Arduino图标库

时间:2018-11-14 20:51:09

标签: c++ arduino

我正在开发一个Arduino项目,我想在NeoMatrix 8x8面板上显示图标。

最初,我朝着依赖继承的方向发展,并要求在Arduino Stack Exchange上进行一些输入,建议我走另一条路线,并在其他地方问我的问题,它与C ++的关系是否比Arduino更重要。 / p>

建议不要依赖继承,而是将图标存储在PROGMEM中,并让程序从那里构建图标。

我尽了最大的努力来尝试这种方法,但是我并不放心,所以我想进一步了解一下!

  • 这个想法是让字节数组组成一个8x8图标。
  • 值为0-2,每个值代表RGB结构数组中设置的颜色。

据我所知,存储在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

1 个答案:

答案 0 :(得分:0)

如果您希望RGB数据驻留在PROGMEM中,由于它不是pgm_read_XXX函数处理的本机类型,只需使用memcpy_P()进行读取:

RGB currentColor;
memcpy_P(&currentColor, colors + currentPixel, sizeof(RGB));

如果崩溃,则可能是您读取的currentPixel值存在问题。