2017-01-27 5 views
0

Мой вопрос касается темы, как легко получить доступ к множеству переменных с помощью arduino. Я хотел бы знать, есть ли возможность динамически менять имена переменных в цикле. Мой английский не самый лучший, поэтому позвольте мне объяснить код, с которым я имею дело в настоящий момент.Название динамической переменной Название, Concatenate

У меня есть небольшой термопринтер. Способ печати происходит от Adafruit термопечати-библиотеки

void Adafruit_Thermal::printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem) { 
    ... 
} 

И я создал растровый шрифт, который выглядит следующим образом:

static const uint8_t PROGMEM Char_32[] { 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
}; // Char 032 () 
static const uint8_t PROGMEM Char_33[] { 
    0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00 
}; // Char 033 (!) 
... for each caracter 

Я хотел бы напечатать письмо для письма в этом для петли:

for(j = 0; j <= messageLength - 1; j++){ // Go through each character in the message. 
    int character = message[j]; // reads and stores the ASCII value of the current Character   
    printer.printBitmap(letter_width, letter_height, Char_XX); // i like to print the specific character 
} 

Normaly Я хотел бы взять 2d массив и напечатает, как это:

static const uint8_t PROGMEM letter_data[][8] = 
{ 
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Char 032 () 
    {0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00}, // Char 033 (!) 
    {0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00} // Char 034 (") 
} 

for(j = 0; j <= messageLength - 1; j++){ //Go through each character in the message. 
    int Character = message[j] - 32; // first visible ASCIIcharacter '!' is number 33. reads and stores the ASCII value of the current Character we are dealing with and -32 so the char correspnds to our array. 
    printer.printBitmap(letter_width, letter_height, letter_data[Character]); 
} 

Но мои письма будут намного больше, чем 8x8 пикселей, и мой массив станет большим. Так есть ли возможность обойти это?

+1

Что вы имеете в виду, слишком велико? У вас заканчивается память? – user3853544

+0

Вам нужно 3 вложенных цикла: строка битмапа/символов в сообщении/столбце растрового изображения. – stark

+2

Основываясь на вашем коде, это звучит так: * «изменение имен переменных» * является неправильным описанием вашей проблемы, и ваша проблема больше связана с попыткой управления использованием памяти, особенно в отношении использования стека. – Xirema

ответ

1

Звучит из вашего описания, что у вас проблемы с использованием памяти. Официальная документация Arduino указывает на то, что платы нижнего уровня Arduino имеют 31.5Kb of Flash Memory (32 - 0,5) -или PROGMEM, как указано в вашем коде и до 248Kb (256-8) в других системах.

На основе вашего комментария, если каждый персонаж занимает 1224 байт памяти (или 1.2Kb), вы исчерпаете этот предел в 25 символов в прежней системе (даже не достаточно, чтобы покрыть алфавит и ничего больше!) и 202 символа в последнем.

Так что это зависит от конкретной системы, для которой вы строите, но совершенно очевидно, что при размере символов, которые вы используете, у вас будут проблемы с сохранением всего этого, даже в более крупной системе (поскольку эта емкость памяти будет использоваться совместно с другими структурами аналогичного размера).

Итак, короткий ответ на вашу проблему: вам нужно сжать данные. Мой совет заключался бы в сокращении объема данных, используемых на букву (возможно, сокращение размера по обоим размерам пополам), а затем развернуть его, когда вы пишете на устройство вывода (т. Е. Устройство отображения) во время выполнения.

+0

спасибо за ваш комментарий. Я тоже подумал об этом. на данный момент я использую ATmega2560 с 256k байт (из которых 8k используется для загрузчика). У моего шрифта 101 символ. Я бы ожидал, что останется достаточно свободного места. Если символы не сохраняются в 2D-массиве, загрузка эскиза прекращается. Таким образом, вы, вероятно, правы: эскиз не может скомпилироваться, когда размер массива будет большим, потому что память будет разделяться. – EEPROM

+0

, но мой вопрос в том, есть ли обходной путь без создания меньшего шрифта. его большая работа и разрешение в конечном итоге не будут такими прекрасными. в языках сценариев часто существует возможность добавлять имена переменных. или, может быть, кто-то может подумать о другом решении.Я попытаюсь, если я могу разбить массив на куски. – EEPROM

+0

Это сработало. Я разделил большой массив на четыре меньших массива, и загрузка эскизов прекрасна. – EEPROM

Смежные вопросы