- ベストアンサー
ラズベリーパイで温度を取得する方法
- ラズベリーパイで気温と気圧を取得するために、MM-TXS03というセンサーを使用しています。
- 温度を摂氏に変換する計算方法が正しくないため、正確な温度が取得できていません。
- MM-TXS03の計算式を正しく設定して温度を取得する方法をご教示いただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回答1さんのお礼文にある >符号をつけても外しても16進数の部分を10進数に変換すると同じ値「ced8 -> 52952」となります。 http://news.mynavi.jp/articles/2014/08/19/raspberry-pi3/003.html ここのプログラムの変数定義は short int temp; つまり符号付16bitなので 0xced8 -> -12584 なので 42.5 + (-12584 / 480) = 16.28℃ <エコ暖房ですね! 因みにWindows付属の「電卓」なら 表示>プログラマ 左下の「Word」 <符号付16bit選択 デフォルトはQword 符号付64bit このままで16進10進変換してはいけません <かなりの人がハマる http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/LPS331AP/LPS331APtest.html にあるLPS331AP 日本語マニュアル↓ http://www.ne.jp/asahi/o-family/extdisk/LPS331AP/LPS331AP_DJP.pdf 17/18ページ に詳しい解説があります
その他の回答 (1)
- ahoo_chieokure
- ベストアンサー率52% (34/65)
×ced8 -> 52952 符号無しでなはなく、符号付き整数で計算してください。 ∵そうでないと42.5度以下を示すことができません。
お礼
ahoo_chieokureさん、lumiheartさん、色々と情報をありがとうございました。お二方からの情報を元にもう少しWEBを探って、phpで符号付きの16進数を変換するツールを作って見ました。 符号付き16進数の計算方法が枯れたページのとおりに作ったため、もっちゃりしたモノになりましたが、計算は大丈夫と思います。 本当にありがとうございました。 <?php function sign_hexdec($hex) { # 2進数の「1」を定義 $pl=0b01; # 値を1文字づつ分解 $arr = str_split($hex); if ($arr[0] >= dechex(8)) { # 16進数を2進数に変換 $s = base_convert($hex,16,2); # 0と1を反転 $t = decbin(~bindec($s)); # 32bit表記を16bit表記に切り取り $tt = mb_substr(decbin(bindec($t) + bindec($pl)),16,16); # 16bitにした文字を1文字づつ分解 $bi = str_split($tt); # 10進数の値を初期化 $ans=0; # 桁ごとに2の乗数を掛けて桁の値を掛ける for ($i=0;$i<=15;$i++) { $ans=(pow(2,15-$i)*$bi[$i])+$ans; } $ans = $ans * (-1); } else { $ans=hexdec($hex); } } ?>
補足
回答ありがとうございました。 符号の有り無しについて考えてもいませんでした。 パソコンの関数電卓を使って試算しながらめているのですが、符号をつけても外しても16進数の部分を10進数に変換すると同じ値「ced8 -> 52952」となります。 符号をつけることによりマイナスに値が進むことになり、42.5を加えることにより正常な摂氏を表示すると思うのですが、符号をつけても付けなくても同じ値となります。 すみませんが、もう少し詳しく教えていただけないでしょうか? よろしくお願いいたします。
お礼
コメントありがとうございました。 符号付16Bit選択の意味が良くわかりました。 これを printfで変換しようとしていますが、%dの為、符号なしで変換しているというわけですね。printfを調べていたのですがどうも符号付16bitの方法が探してみましたが見つかりませんでした。 bashで作っているだけに難しいようです。 ちょっと、アプローチの方法を変えてみようと思います。サンプルファイルもgccコンパイルでmainが二つあり、うまくコンパイルできないので使えません。気圧と同じようにbashで出来ればありがたかったのですが、printfが対応していないことにはどうにもなりません(というより探しきれなかっただけかもしれませんが)。 ahoo_chieokureさん、lumiheartさん、ありがとうございました。