Arduino Icon Library - PullRequest
       4

Arduino Icon Library

0 голосов
/ 14 ноября 2018

Я работаю над проектом Arduino и хочу отображать значки на панели NeoMatrix 8x8.

Первоначально я пошел в направлении, основанном на наследовании, и запросил некоторый вклад в Arduino Stack Exchange , где мне посоветовали пойти другим путем, и задать свой вопрос в другом месте, относится ли он к C ++ больше, чем в Arduino.

Вместо того, чтобы полагаться на наследование, мне было рекомендовано хранить свои значки в 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 голосов
/ 15 ноября 2018

Если вы хотите, чтобы данные RGB находились в PROGMEM, поскольку это не собственный тип, обрабатываемый функциями pgm_read_XXX, просто прочитайте их с помощью memcpy_P():

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

Если это дает сбой, возможно, существует проблема со значением currentPixel, которое вы прочитали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...