完全に個人的な備忘録

完全に個人的な備忘録。学習コストが高くなってきたので、メモしておかないと…片っ端から忘却の彼方なのです。

Raspberry Pi で温度センサ(STTS751)を読んでみた

Raspberry Pi で温度センサーを読んでみた。温度センサーは色々あるけど、「高精度 12ビット I2C 接続デジタル温度センサ STTS751」を以下から通信販売で購入した。

高精度12ビットI2C接続デジタル温度センサ STTS751: センサ一般 秋月電子通商 電子部品 ネット通販

この時点で、かなり小さいICだという事は認識していた。通常のユニバーサル基板には付かないようだったので、「SOT23変換基板 金フラッシュ (10枚入)」も併せて以下から購入した。

SOT23変換基板 金フラッシュ (10枚入): パーツ一般 秋月電子通商 電子部品 ネット通販

しかし、実物は予想以上に小さかった。勿論、ホームページとかでスケールと写真は確認していたのだが、実際に見ると予想以上だった。

f:id:tarancho:20140119193020j:plain

米粒よりも小さいのだ。しかも、一番ピンの位置の印も見えない…

f:id:tarancho:20140119193215j:plain

良く見たら、確かに一番ピンのところに丸い印が書いてある事が確認できた。

しかし、これを半田付けできるのだろうか。ただでさえ、25~26年ぐらいのブランクがあるのに…

とりあえず、半田付けして結線してみたが…Raspberry Piから認識できない。勿論、予め、Raspberry Pi で I2Cデバイスを有効にしている。

I2Cデバイスを有効にする具体的な手順は、以下を参考にした。

raspberrypi/Raspberry PiでIO制御 - PukiWiki

で、話しを元に戻して、半田付けした基板を良くみたら…

f:id:tarancho:20140119194626j:plain

やってしまった。ICを反対に付けてしまった…
判田を剥して付け直すのは無理と判断して、1番と2番(本当は4番と5番)を判田で短絡している部分を剥して、あとは、結線を変える事にした。Vddのつもりで赤にしたのに、赤がSDAになるわけだ。

f:id:tarancho:20140119200454j:plain

結線を変更してからRaspberry Piでデバイスの認識を確認。

pi@raspberrypi ~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

アドレス0x39が確認できた。続いて以下のデータシートを確認。
http://akizukidenshi.com/download/ds/st/STTS751_CD00252523.pdf
アドレス 0 に温度の整数部分、アドレス 2 の上位4bitに小数点以下が格納されている事が確認できる。

pi@raspberrypi ~ $ sudo i2cget -y 1 0x39 0 b
0x0f
pi@raspberrypi ~ $ sudo i2cget -y 1 0x39 2 b
0x40

上記の値はデータシートを参考に計算すると 15.25℃という事になる。

シェルで一秒単位で温度を表示させてみた。

# !/bin/sh

I2CBUS=1
ADDR="0x39"
i2cdetect  -y $I2CBUS
calcTemperature() {
    # Temperature value high byte
    HI=$(i2cget -y $I2CBUS $ADDR 0 b)
    # Temperature value low byte
    LOW=$(i2cget -y $I2CBUS $ADDR 2 b)

    echo -n "| $HI | $LOW | --> "
    perl -e "print(${HI} + ${LOW} / 16 *0.0625)"
    echo ""
}
while true
do
    calcTemperature
    sleep 1
done

上記の perl 部分はマイナスを考慮していいので awk で、以下のような感じの方が良いかも。

awk '{if ((a = $1 + $2 / 16 * 0.0625) >= 128) a -= 256; print a;}'

そして、実行。

pi@raspberrypi ~ $ sudo sh ./calc_stts751.sh
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
| 0x0c | 0xc0 | --> 12.75
| 0x0c | 0xc0 | --> 12.75
| 0x0c | 0xc0 | --> 12.75
| 0x0c | 0xc0 | --> 12.75
| 0x0c | 0xc0 | --> 12.75
| 0x0d | 0x00 | --> 13
| 0x0d | 0xc0 | --> 13.75
| 0x0e | 0xc0 | --> 14.75
| 0x0f | 0x00 | --> 15
| 0x0f | 0x00 | --> 15
| 0x0f | 0x40 | --> 15.25
| 0x0f | 0x40 | --> 15.25
| 0x0f | 0x80 | --> 15.5
| 0x0f | 0x80 | --> 15.5
| 0x0f | 0x80 | --> 15.5
| 0x0f | 0x80 | --> 15.5

指で温度センサーを触ると、温度が上昇するので、それなりに反応しているようだ。