アプリ版:「スタンプのみでお礼する」機能のリリースについて

ラズベリーパイで温度を取得しようとしています。
センサーはMM-TXS03でサンハヤトさんから購入しました。気圧と温度が両方取得できるセンサーでLPS331APの仕様となっています。

shで取得しようと思っているのですが、データは一応拾っているのですが、摂氏に仕様と計算させても、どうしてもおかしな温度になってしまします。ちなみに、気圧はほぼ合っていると思います。

計算方法をご存じの方、ぜひ教えてください。よろしくお願いいたします。

手動で値を取得した場合
$sudo i2cset -y 1 0x5d 0x20 0x90
$sudo i2cget -y 1 0x5d 0x2b
0xd8
$sudo i2cget -y 1 0x5d 0x2c
0xce
$sudo i2cset -y 1 0x5d 0x20 0x00

値の計算
ced8 -> 52952 (16進数 -> 10進数)
42.5+(52952÷480.0)=152.816666667
152度だと、計測場所は体感18度程度なのでかなりかけ離れていると思います。
実際の計算式は下記のとおりです。
#!/bin/bash
### set active mode
sudo i2cset -y 1 0x5d 0x20 0x90

PressOut_TH=`i2cget -y 1 0x5d 0x2b`
PressOut_TL=`i2cget -y 1 0x5d 0x2c`

RawDatTemp=`echo "0x${PressOut_TL:2:2}${PressOut_TH:2:2}"`
RawDatTM=`printf %d $RawDatTemp`
echo "scale=2;42.5+($RawDatTM/480.0)" |bc

### set power down
sudo i2cset -y 1 0x5d 0x20 0x00

---- EOF ----
下記ページを参考に作って見ました。
http://news.mynavi.jp/articles/2014/08/19/raspbe …
http://news.mynavi.jp/articles/2014/08/19/raspbe …

よろしくお願いいたします。

A 回答 (2件)

×ced8 -> 52952


符号無しでなはなく、符号付き整数で計算してください。
∵そうでないと42.5度以下を示すことができません。

この回答への補足

回答ありがとうございました。
符号の有り無しについて考えてもいませんでした。
パソコンの関数電卓を使って試算しながらめているのですが、符号をつけても外しても16進数の部分を10進数に変換すると同じ値「ced8 -> 52952」となります。
符号をつけることによりマイナスに値が進むことになり、42.5を加えることにより正常な摂氏を表示すると思うのですが、符号をつけても付けなくても同じ値となります。
すみませんが、もう少し詳しく教えていただけないでしょうか?
よろしくお願いいたします。

補足日時:2014/12/29 00:15
    • good
    • 0
この回答へのお礼

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);
}
}
?>

お礼日時:2015/01/03 03:45

回答1さんのお礼文にある


>符号をつけても外しても16進数の部分を10進数に変換すると同じ値「ced8 -> 52952」となります。

http://news.mynavi.jp/articles/2014/08/19/raspbe …
ここのプログラムの変数定義は
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/ …
にあるLPS331AP 日本語マニュアル↓
http://www.ne.jp/asahi/o-family/extdisk/LPS331AP …
17/18ページ
に詳しい解説があります
    • good
    • 0
この回答へのお礼

コメントありがとうございました。
符号付16Bit選択の意味が良くわかりました。

これを printfで変換しようとしていますが、%dの為、符号なしで変換しているというわけですね。printfを調べていたのですがどうも符号付16bitの方法が探してみましたが見つかりませんでした。
bashで作っているだけに難しいようです。
ちょっと、アプローチの方法を変えてみようと思います。サンプルファイルもgccコンパイルでmainが二つあり、うまくコンパイルできないので使えません。気圧と同じようにbashで出来ればありがたかったのですが、printfが対応していないことにはどうにもなりません(というより探しきれなかっただけかもしれませんが)。
ahoo_chieokureさん、lumiheartさん、ありがとうございました。

お礼日時:2014/12/31 01:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!