Raspberry piにLM75ADを接続して温度データを得る方法
■ Raspberry Pi のI2C機能の有効化
以前の記事『Raspberry piにi2c LCD接続する』の通り機能の有効化をまず行なっておく。
■ 接続回路図

Raspberry Pi GPIOポートのピン割付は『RPi Low-level peripherals』に書かれている通り。
なお、今回はLM75ADのI2Cアドレスを0x48として使っている。(A2はグランドに落としている)
■ コマンドシェル(シェルスクリプト)での操作
アドレスの確認。確かに0x48に接続されていることがわかる。
$ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
生データの表示
$ i2cget -y 1 0x48 0 w 0xa017
換算した温度データの表示
$ i2cget -y 1 0x48 0 w | awk '{print(("0x"substr($1,5,2)substr($1,3,1))*0.0625)}'
23.5
換算方法は『LM75 temperature logger on the Raspberry pi』のスクリプトをそのままコピーしている。
この方法では、「負数」の処理を行っていないため、氷点下の温度の場合に125℃以上と表示される。
■ Perlでの処理
#!/usr/bin/perl
use strict;
use warnings;
use Device::I2C;
use Fcntl;
my $i2cDev = Device::I2C->new('/dev/i2c-1', O_RDWR);
$i2cDev->selectDevice(0x48);
my $data = $i2cDev->readWordData(0);
# 取り出された生データ(16進数)を表示
printf("raw data = %X\n", $data);
#取り出されたデータは、LM75 Temperature Registerの割り付けで
# $data = D2 D1 D0 X X X X X D10 D9 D8 D7 D6 D5 D4 D3
#となっている
# これを、 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 の並びに変えるため
# ビットシフトの演算を行う。
# 得られた値は、0.125℃単位である。
my $temp = ( ( $data & 0xff) << 3 ) | ( ( $data & 0xf000 ) >> 13 );
printf("11bit temperature data = %X\n", $temp);
# 負数の場合の処理
if($temp & 0x0400){
$temp = (~$temp & 0x03ff); # 1の補数
$temp += 1; # 2の補数
$temp *= -1;
}
printf("calculated temperaure = %f\n", $temp * 0.125);
■ 関連記事
・I2C温度センサーLM75ADをPIC12F1822で使う
・Raspberry piにi2c LCD接続する
