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接続する