Два варианта настройки символов для max7219. Какой выгоднее?

Код №1:

#define pin_din A0
#define pin_cs A1
#define pin_clk A2

#include <LedControl.h>  //Подключаем библиотеку LedControl.h
LedControl lc = LedControl(pin_din, pin_clk, pin_cs, 1);
// Массив с закодированными символами для надписей.
/*byte bukvy[8] =
{
  B01110111,    //  А - 0
  B00011111,    //  Ь - 1
  B01001110,    //  С - 2
  B00111101,    //  d - 3
  B01001111,    //  Е - 4
  B01000111,    //  F - 5
  B01011110,    //  G - 6
  B00110111,    //  Н - 7  
};*/
#define A B01110111
#define b B00011111
#define C B01001110
#define d B00111101
#define E B01001111
#define F B01000111
#define G B01011110
#define H B00110111  

  
  

void setup() 
{
  lc.shutdown(0, false); //Выводим из спящего режима
  lc.setIntensity(0,2); //Установить яркость дисплея на 2.
  lc.clearDisplay(0);    //Очистить дисплей
  delay (1000);
}

void loop() 
{
  /*lc.setRow(0, 7 , bukvy[0]);
  lc.setRow(0, 6 , bukvy[1]);
  lc.setRow(0, 5 , bukvy[2]);
  lc.setRow(0, 4 , bukvy[3]);
  lc.setRow(0, 3 , bukvy[4]);
  lc.setRow(0, 2 , bukvy[5]);
  lc.setRow(0, 1 , bukvy[6]);
  lc.setRow(0, 0 , bukvy[7]);*/
  
  lc.setRow(0, 7 , A);
  lc.setRow(0, 6 , b);
  lc.setRow(0, 5 , C);
  lc.setRow(0, 4 , d);
  lc.setRow(0, 3 , E);
  lc.setRow(0, 2 , F);
  lc.setRow(0, 1 , G);
  lc.setRow(0, 0 , H);
}

Код №2:

#define pin_din A0
#define pin_cs A1
#define pin_clk A2

#include <LedControl.h>  //Подключаем библиотеку LedControl.h
LedControl lc = LedControl(pin_din, pin_clk, pin_cs, 1);
// Массив с закодированными символами для надписей.
byte bukvy[8] =
{
  B01110111,    //  А - 0
  B00011111,    //  Ь - 1
  B01001110,    //  С - 2
  B00111101,    //  d - 3
  B01001111,    //  Е - 4
  B01000111,    //  F - 5
  B01011110,    //  G - 6
  B00110111,    //  Н - 7  
};

/*#define A B01110111
#define b B00011111
#define C B01001110
#define d B00111101
#define E B01001111
#define F B01000111
#define G B01011110
#define H B00110111*/

  
  
void setup() 
{
  lc.shutdown(0, false); //Выводим из спящего режима
  lc.setIntensity(0,2); //Установить яркость дисплея на 2.
  lc.clearDisplay(0);    //Очистить дисплей
  delay (1000);
}

void loop() 
{
  lc.setRow(0, 7 , bukvy[0]);
  lc.setRow(0, 6 , bukvy[1]);
  lc.setRow(0, 5 , bukvy[2]);
  lc.setRow(0, 4 , bukvy[3]);
  lc.setRow(0, 3 , bukvy[4]);
  lc.setRow(0, 2 , bukvy[5]);
  lc.setRow(0, 1 , bukvy[6]);
  lc.setRow(0, 0 , bukvy[7]);
  
  /*lc.setRow(0, 7 , A);
  lc.setRow(0, 6 , b);
  lc.setRow(0, 5 , C);
  lc.setRow(0, 4 , d);
  lc.setRow(0, 3 , E);
  lc.setRow(0, 2 , F);
  lc.setRow(0, 1 , G);
  lc.setRow(0, 0 , H);*/
}

Оба кода срабатывают одинаково, при компиляции выясняется, что объем использованной памяти (памяти устройства и динамической) одинаков. Скорость выполнения “на глаз“ одинаковая. Есть какие-либо преимущества у того или иного подхода?

Заранее спасибо!

Зависит от того, что Вы собираетесь с этим делать.

Например, если Вы собираетесь перебирать буквы в цикле, то с массивом Вы это сделаете легко, а с макросами … всё равно придётся массив колхозить или цикл в большую портянку разворачивать.

Можно придумать ещё десяток примеров как в пользу одного, так и другого. Поэтому вопрос в том виде, как Вы его задали, не имеет разумного ответа.

С цифрами, для вывода чисел, по-любому массив удобнее, но опять же … от внешних обстоятельств зависит (например, при жёстком дефиците того или иного ресурса, приходится иногда принимать неочевидные решения).

В большинстве случаев второй вариант позволяет писать более короткий код.

Спасибо. Но тут такое: если использовать дефайны, то в строках для вывода символов достаточно просто указать букву, которую надо ввести. А в случае использования массива каждый раз надо с ним справляться, какая буква какому индексу соответствует. Ладно их 5-10, а у меня в одном из проектов их 40 штук (все возможные варианты, которые не запомнишь), скакать по скетчу вверх-вниз немного влом. Оттого я эту тему и запостил.

Конкретно в моих “проектах“ пока (хи-хи) в циклах перебирать нужды нет. Просто выбрасываю на индикатор те или иные показатели.

Даже когда вы “выбрасываете показатели”, использовать циклы будет удобнее каждый раз, когда у вас в “показателе” более одного символа

Указывать каждый раз конкретную букву - это в корне неверный подход. Вместо этого вам нужно читать очередной символ из строки и его обрабатывать. И делать это в цикле.

Опять неправильно. Нужно написать метод, который сам будет выбирать из массива нужный элемент по коду символа.

1 лайк

Используй enum для задания «именованного индекса», если тебе именно так хочется.

Хмм… Вот тут, если можно, поподробнее. Ведь строка, например, 41-я - собственно и есть выбор элемента по коду символа (lc.setRow(0, 7 , bukvy[0]);). А для этого, чтобы вспомнить, какой код у конкретного символа, надо каждый лезть в массив. Если же обозначить все символы через #define, то достаточно вместо “bukvy[0]” просто подставить символ.

const uint8_t PROGMEM digitToSegment[] = {
    // XABCDEFG
    0b01111110, // 0
    0b00110000, // 1
    0b01101101, // 2
    0b01111001, // 3
    0b00110011, // 4
    0b01011011, // 5
    0b01011111, // 6
    0b01110000, // 7
    0b01111111, // 8
    0b01111011, // 9
    0b01110111, // A
    0b00011111, // b
    0b01001110, // C
    0b00111101, // d
    0b01001111, // E
    0b01000111  // F
};

Индексы от 0 до 15 выводят соответствующий символ. Если не хотите выяснять индексы букв, для них можете задать дефайны

1.

Очень сомневаюсь! Ну, просто очень!

Например, напишите вывод числа. Самого обыкновенного числа. Примерно так:

uinsigned votltage = analogRead(0);
//
// Вывод votltage на экран
//
...

а потом поговорим.

Сделайте и увидите в чём есть нужда, а в чём нет. Из того, что Вы пишете коллегам, я пока сделал вывод, что Вы не понимаете как именно Вы “выбрасываете показатели”.

2.

Я Вам уже писал, что можно привести ещё кучу примеров, так что не цепляйтесь за один просто потому, что я его привёл.

1 лайк

Ну так в одном из приведенных скетчей я дефайнами и воспользовался.

Нет, я не про это. Я примерно про такое

#define numA 10
#define numB 11
.............................
#define numF 15

И их использовать в качестве индексов для массива

digitToSegment[numA]

Короче!
Если отвечать на вопрос из заголовка темы «Какой выгоднее?», то очевидно выгоднее дефайны (по памяти). Всё. ))))

А ко всему остальному ТС сам дойдёт, когда конкретную задачу будет решать. Не убедим его сейчас ни в чём, я это отчётливо вижу.

1 лайк

Сомнительно, сильно зависит от интенсивности использования ))

Где ты «интенсивность использования» в первом сообщении увидел?))

Так это не рабочий проект. Но такое делается именно для “интенсивного использования” - вывод-то на экран обычно идет постоянно )

Вот я и говорю:

Если выполнит мою просьбу

то и убеждать не придётся, сам поймёт. А не выполнит, тогда да - убеждать в чём-то бесполезно.

1 лайк

Сделал. Со свободного пина читаю. Естественно, пин болтается. Неравномерно скачет значение (особенно, если его пальцем лапать). И?