Raspberry Pi – I2Cで温度、気圧を測定する
温度湿度大気圧を測定できるセンサーを購入し、使ってみたその2が完成している。
目標
Amazon Alexa 用に温湿度大気圧を参照できるデバイスを作るために、とりあえず Terminal で測定値を見られるようにする。
流れ
・使用する機器
・Pi から測定値を見られない機器
・Pi で i2c を使えるようにする
・物を作る
・動作確認
・測定値を表示
・実行結果
・おまけ情報
使用する機器
・センサーは秋月電子で購入
HDC1000 : 温度、湿度
AELPS331: 大気圧、温度
Raspberry Pi 2 : 3でも同じかと
数年前に買ったので、両方とも売っていなかった。
誰か私に買ってくれればそれを使うのだが!
Pi から測定値をみられない機器
HDC1000 は Pi からプロトコル上参照できないので使えない。残念。
・SHT31使用 高精度温湿度センサモジュールキット を買えば直接使えるらしい。
Pi で i2c を使えるようにする
以下のコマンドを実行し有効にする。
sudo raspi-config
物を作る
回路図がややこしいが単にAE-LPS331とコネクタを繋ぐだけ。
HDC1000は使えないが、PIC32で使えるようにしたので、以下の回路図になっている。
Pi とつなぐ CN4 のピンアサインはPiと同じなので1-10本だけ使う。
1番Pinが3.3Vなので、センサーの電源にはこれを使う。
動作確認
センサーがきちんとつながっているか確認する。
2つとも動作している。
pi@raspberrypi:~/FW042 $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- 5c -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
測定値を表示
PHP を使うがインストールされていないので、以下のコマンドで入れる。
sudo apt-get install php7.0 php7.0-php
以下のプログラムを実行。他の種類のセンサーでもちょっと変えれば動くはず。
<?php function signed16hexdec($hex) { $dec = hexdec($hex); if( $dec & 0x8000 ) { $dec = (~($dec -1) & 0xFFFF) * -1; } return $dec; } exec('i2cset -y 1 0x5c 0x20 0x90 b'); // boot & transmit 1s function AELPS331_presser() { $num1 = hexdec(exec('i2cget -y 1 0x5c 0x2A b')); $num2 = hexdec(exec('i2cget -y 1 0x5c 0x29 b')); $num3 = hexdec(exec('i2cget -y 1 0x5c 0x28 b')); $num4 = (($num1 << 16) + ($num2 << 8) + $num3) / 4096.0; return $num4; } function AELPS331_temp() { $str2 = exec('i2cget -y 1 0x5c 0x2C b'); $str1 = exec('i2cget -y 1 0x5c 0x2B b'); $str3 = str_replace('0x', '', $str2 . $str1); $num1 = signed16hexdec($str3); $num2 = 42.5 + ($num1 / 480.0); return $num2; } while(1) { sleep(1); $num = AELPS331_presser(); echo sprintf("%6.1f hPa\n", $num); $num = AELPS331_temp(); echo sprintf("%6.1f c\n", $num); } ?>
実行結果
1秒おきに温度と気圧を表示する。
pi@raspberrypi:~/FW042 $ sudo php AE-LPS331.php
997.3 hPa
23.5 c
997.3 hPa
23.5 c
おまけ情報
標準で Repeated Start Condition に対応していないため、
/etc/modprobe.d/i2c.confというファイルを作成し,下記の内容を書き込む 。
ptions i2c_bcm2708 combined=1
これを設定していないと動かないデバイスがおおい。