2016-12-21 4 views
0

私はアルドゥイーノに新たなんだと、現在私が動的メモリを節約することができるように変数を格納するためにPROGMEMを使用することを学びます。私はPROGMEMを使用して保存するこれらの3つの変数を含む13の変数を持っています。

const unsigned int raw_0[62] PROGMEM = {2600,850,400,500,400,500,450,850,450,850,1350,850,450,450,400,500,400,450,450,400,450,450,450,450,400,450,900,850,900,850,900,450,450,850,900,850,900,850,450,450,900,450,400,450,400,900,450,450,450,400,450,450,450,450,400,450,450,450,450,400,450,}; 
const unsigned int raw_1[60] PROGMEM = {2600,850,450,450,450,450,450,850,450,850,1350,850,500,400,450,400,450,450,450,450,400,450,450,450,400,450,900,850,900,900,850,450,450,850,850,900,900,900,400,450,900,450,450,400,450,850,450,450,450,450,400,450,450,450,450,400,450,450,850,}; 
const unsigned int raw_a[100] PROGMEM = {3500,1700,400,450,450,1250,450,400,450,400,450,400,500,400,450,400,450,400,450,400,450,450,400,400,500,400,450,400,450,1300,400,450,450,400,450,400,450,400,450,400,450,400,500,350,500,400,450,400,450,1300,400,400,500,400,450,400,450,400,450,450,400,450,450,400,450,400,450,400,450,400,450,450,400,450,450,400,450,1250,450,400,450,400,500,400,450,400,450,400,450,400,450,400,450,1300,450,400,450,1250,450,}; 

ここで変数を格納テーブルです - :ここに は私が保管し、私の機能でそれを使用する変数の例のいくつかはあります。 Arduinoのウェブサイトからこのアプローチを学びます。 https://www.arduino.cc/en/Reference/PROGMEM

const unsigned int* const myTable[13] PROGMEM = { 
    raw_0, 
    raw_1, 
    raw_2, 
    raw_3, 
    raw_4, 
    raw_5, 
    raw_6, 
    raw_7, 
    raw_8, 
    raw_9, 
    raw_a, 
    raw_b, 
    raw_c}; 

私の問題は、raw_1やraw_aなどのPROGMEMを使用してこれらの変数を取得するにはどうすればいいですか? これは私がやったことですが、それはうまくいきませんでした: -

unsigned int * ptr = (unsigned int *) pgm_read_word (&myTable [1]); 
irsend.sendRaw(ptr,62,38); 

彼らは、Stringまたはcharデータ型を使用しますが、私の場合、私は配列の整数を使用し、私が見つけた例のほとんど。

答えて

1

ptrもPROGMEMへのポインタなので、値(またはこの場合は値)をpgm_read_wordで読み取る必要があります。 IR libraryは(私はそれが正しいものだ願っています)、すべてのことをサポートしていません。

とにかくsendRaw実装はこれです:

void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz) 
{ 
    // Set IR carrier frequency 
    enableIROut(hz); 

    for (unsigned int i = 0; i < len; i++) { 
     if (i & 1) space(buf[i]) ; 
     else  mark (buf[i]) ; 
    } 

    space(0); // Always end with the LED off 
} 

そして、すべての使用方法は、公開されているので、あなたが同じことを行うには、独自の機能を実装することができます

void mySendRaw (IRsend & dev, const unsigned int buf[], unsigned int len, unsigned int khz) 
{ 
    // Set IR carrier frequency 
    dev.devenableIROut(khz); 

    for (unsigned int i = 0; i < len; i++) { 
     if (i & 1) dev.space(pgm_read_word(buf+i)); 
     else  dev.mark (pgm_read_word(buf+i)); 
    } 

    dev.space(0); // Always end with the LED off 
} 

// And usage: 
mySendRaw(irsend, (const uint16_t*)pgm_read_word(myTable+1), 62, 38); 

配列のサイズがなければなりませんがどこかに保存されているので、次のようなものを使用できます:

byte cmd = 1; 
mySendRaw(irsend, (const uint16_t*)pgm_read_word(myTable+cmd), pgm_read_word(myTableLenghts+cmd), 38); 
+0

それにエラーをコンパイルするときにエラーを受信した方法が、 'ボイドmySendRaw(IRsend&、CONST unsigned int型*、unsigned int型、unsigned int型)' 'uint16_t {別名unsigned int型}' から 'に[-fpermissive] 無効変換の初期化引数2 const unsigned int型は、*」[-fpermissive] – ngeri

+0

私はそれが役立つはず、明示的なキャストを追加しました。 – KIIV

+0

明示的なキャストを追加した後は正常に機能しています。 StackOverflowの制限(私はstackoverflowので初心者だ)ので、私は投票することはできません。どうもありがとう。 – ngeri