2017-01-27 22 views
0

私の質問は、arduinoで多くの変数に簡単にアクセスする方法のトピックを扱います。ループ内で変数名を動的に変更する可能性があるかどうかを知りたい。私の英語は最高ではないので、私が現時点で扱っているコードについて説明しましょう。動的変数名のビルド、連結

私は小さなサーマルプリンタを持っています。印刷方法は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ループ:

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私は2次元配列を取るだろうし、このように印刷します:

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のドキュメントによれば、アルダーダイヤーボードの下端は31.5Kb of Flash Memory(32 - 0.5) - PROGMEMで、他のシステムでは最大248Kb(256 - 8)です。

あなたのコメントに基づいて、1文字ごとに1224バイトのメモリ(または1.2Kb)が使用された場合は、以前のシステムで25文字でこの制限が使い果たされます。 )、後者は202文字です。

これは正確なシステムに依存しますが、使用している文字のサイズでは、大きなシステムであってもすべてを保持することに問題があることは明らかですこのメモリ容量は他の同様のサイズの構造と共有されるため)。

あなたの問題に対する簡単な答え:データを圧縮する必要があります。私の助言は、レターごとに使用されているデータの量を減らすこと(おそらく両方の次元を半分に縮小する)であり、実行時に出力デバイス(すなわち表示デバイス)に書き込むときにそれを拡張することです。

+0

ご意見ありがとうございます。私はそれも考えました。現時点で私は256kバイトのATmega2560を使用しています(そのうちの8kはブートローダに使用されています)。私のフォントは101文字です。十分なスペースが残っていると思います。文字が2D配列に格納されていない場合、スケッチは正常にアップロードされます。あなたはおそらく正しいでしょう:メモリが共有されるため、配列のサイズが大きくなるとスケッチはコンパイルできません。 – EEPROM

+0

しかし、私の質問は、小さなフォントを作成せずに回避策がある場合です。その多くの仕事と決断は最終的にはうまくいかないでしょう。スクリプト言語では、変数名を連結する可能性がしばしばあります。誰かが他の解決策を考えるかもしれない。私はアレイを塊に分けることができるかどうか試してみる。 – EEPROM

+0

それは働いた。大きな配列を4つの小さな配列に分割し、スケッチのアップロードをうまく行いました。 – EEPROM