2016-04-11 18 views
-3

私はArduinoの温度(摂氏)ノードを作成しています。私は私のノードからマスタノード(Arduinoも稼働)を格安RFリンクで送信しているので、温度(浮動小数点数)を空に送信するバイトに変換する必要があります。intをbyteに変換するにはどうすればよいですか?

シンプルなバイトでは255バイトの値で制限されていますが、精度を0.5に設定すると、それ以上に十分な天気が得られることがわかります。それは摂氏0度に設定されているときに、私はConvertFromFloatで60

float ConvertFromByte(byte b) 
{ 
    // todo 
} 

byte ConvertFromFloat(float f) 
{ 
    // todo 
} 

= [-30、97]にバイト値を

を範囲を設定している私は、最も近い0.5に丸めるする必要があります変換の方法を適用します。 ConvertFromByteは、最後のビットまででなければなりませんが、逆になります。

どうすればこの問題を解決できますか?

+0

基本的な伝送プロトコルが必要なようですね。サイズ、データ、チェックサム。 – Lundin

答えて

1

いいえ、私はいつも特定のvに丸める方法を尋ねられます名詞とキャストを入力する方法。

温度値-30に等しいバイト値0から始まり、温度値97度に等しいバイト値255を持ち、すべてのバイト値が0.5℃刻みで温度値をインクリメントすると仮定すると、最大値は実際にはCurrentTemp = LowestTemp +(ByteVal * IncrementTemp)= -30 +(255 * 0.5)= 97.5度になり、これがあなたの方程式になります。従って:

const int LowestTemp  -30 
const float MaxTemp  97.5 
const float IncrementTemp 0.5 
bool retry_flag; 


float ConvertFromByte(byte b) 
{ 
    /*returns CurrentTemp*/ 

    return ((float)(LowestTemp + (b*IncrementTemp))); 
} 

byte ConvertFromFloat(float f) 
{ 
    /*returns ByteVal*/ 
    float CurrentTemp = (int)(f/IncrementTemp); 
    CurrentTemp *= IncrementTemp; 
    if((CurrentTemp<LowestTemp)||(CurrentTemp>MaxTemp)) retry_flag = 1; 
    return ((byte)((CurrentTemp - LowestTemp)/IncrementTemp)); 
} 

丸めの方法はhereを発見し、第一、増分だけ数を割る整数に丸め、その後、再び増加を掛ける方法を利用することができます。

型キャストの方法は、単に(キャスト)を書き込むことによって、タイプキャストであることが値xを語っている、上記をxは。ここでは、には、CurrentTempを直近の整数に素早く丸める小数点が含まれていないという事実を使用します。

RFで渡す値を使用する前に、再試行フラグが設定されているかどうかを確認する必要があります。エラーは発生しませんが、渡された値は完全に間違っています。

1

すでに希望の温度範囲が分かっているので、0から255の値をその範囲にスケーリングするだけです。

浮動小数点[-30..97]から積分[0..255]を半階段で取得するには、数値に30を加え、2を掛け、端数を切り捨て、両者に制限を適用する必要があります側面(負の数がゼロになる、255以上の数値が255になる)

float temp; 
float x = temp+30; 
if (x < 0) return 0; // Apply lower limit 
x *= 2; 
return x > 255 ? 255 : (byte)x; // Apply upper limit and truncate 

は、[-30..97フロートfloatに値を変換し、2で除算する[0 255]積分から取得するには、 30を引く:

float res = ((float)x)/2 - 30; 
関連する問題