2016-12-26 13 views
0

私はgemma用のarduinoコードを取得しようとしています。ネオピクセルで、5310バイトのメモリが小さいので、プログラムにもっと多くのものを入れることができます。
現在、私は以下のコードのサイズを縮小/山車を削除しようとしています:浮動小数点数を削除するか、コード関数の実際のファイルサイズを縮小するには? (Arduino)

void gradient(Color c1, Color c2, float time) { 
    for (float i = 0; i < time; i += 0.001) { 
    Color result(0, 0, 0); 
    result.Red = c1.Red * (1 - (i/time)) + c2.Red * (i/time); 
    result.Green = c1.Green * (1 - (i/time)) + c2.Green * (i/time); 
    result.Blue = c1.Blue * (1 - (i/time)) + c2.Blue * (i/time); 
    for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue); 
    pixels.show(); 
    delay(1); 
    } 
} 

私は30バイトで、それを軽減するために管理:

void gradient(Color c1, Color c2, float time) { 
    float stepsize = 0.01; // Stepsize in seconds 
    float lambda; 
    int maxiter = (int) (time/ stepsize); 
    Color result(0, 0, 0); 
    for (int i = 0; i <= maxiter; i++) { 
    lambda = (float) i/maxiter; 
    result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda); 
    result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda); 
    result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda); 
    for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue); 
    pixels.show(); 
    delay(stepsize * 1000); // delay in milliseconds 
    } 
} 

しかし、それを作るためにはまだしようとしています小さい。
Colorオブジェクトは、Red、Green、Blueという3つのintを持つオブジェクトに過ぎません。このコードの使用例は、次のようになります。

gradient(Color(255, 0, 0), Color(0, 255, 0), 2); 

2秒間に亘って赤から緑の勾配があります。
ありがとうございます!

+0

'stepsize'を1回だけ使うようです。その1つの使用を0.01fに置き換えてみてください(最後のfはdoubleの代わりに浮動小数点定数を示します)。数バイトを節約するかもしれません。 – GandhiGandhi

+0

完全なコードを投稿してください。 – per1234

答えて

0

あなたが引くことができた場合は、「遅延()」までのすべてのコードのうち、100バイトサイズのライブラリを含めないように見えますか? idk tbhですが、私のテストでは100バイトのメモリを節約するために提案された変更がここにあります:

void gradient(Color c1, Color c2, float time) { 
    float stepsize = 0.01; // Stepsize in seconds 
    float lambda; 
    int maxiter = (int) (time/ stepsize); 
    Color result(0, 0, 0); 
    for (int i = 0; i <= maxiter; i++) { 
    lambda = (float) i/maxiter; 
    result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda); 
    result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda); 
    result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda); 
    for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue); 
    pixels.show(); 
    //delay(stepsize * 1000); // delay in milliseconds 

    long lastTime=millis(); 
    long delayTime = stepsize * 1000; 
    while(millis()-lastTime<delayTime){} 
    } 
} 
0

- 最初に、カラーオブジェクトは3つの符号なし文字(0-255)を取る必要があります。そこにintを入れる理由はありません。 (アルドゥイーノのバイトタイプ)

- 第2に、あなたは時間をどのように実装しているのかよく分かりませんが、一般的にarduinoではミリ秒単位で作業しています。さらに、あなたの他の実装を見ることなく、私はその時間が時間のセグメントであると推測しています。あなたの遅れに基づいて、私はあなたが短いものとして時刻を送ることができると推測するつもりです(必要ならばx1000) 32秒、ミリ秒単位)

void gradient(Color c1, Color c2, short time) { 
    short maxiter = (short) (time/ 10); 
    Color result(0, 0, 0); 
    for (int i = 0; i <= maxiter; i++) { 
    result.Red = (c1.Red * (maxiter-i) + c2.Red * i)/maxiter; 
    result.Green = (c1.Green* (maxiter-i) + c2.Green* i)/maxiter; 
    result.Blue = (c1.Blue* (maxiter-i) + c2.Blue* i)/maxiter; 
    for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue); 
    pixels.show(); 
    delay(10); // delay in milliseconds 
    } 
} 
+0

テストでは、これのどれも何もしなかった:/ –

関連する問題