最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
前回はRaspberry Pi 3でRubyでslackに通知を送るところまでやりました。今回は環境センサBME280を使って温度、湿度、気圧を取得してみます。
BME280 とは
ボッシュ社の環境センサで温度、湿度、気圧の3つの環境情報の値を同時に測定できます。
BME280単体のセンサモジュールとしても販売されていますが、今回はスイッチサイエンスさんから発売されている RPZ-IR-Sensor という赤外線 + 環境センサ ホームIoT 拡張ボードを使います。
この拡張ボードはBME280だけでなく、LED(緑、青、白、黄色)、赤外線LED、赤外線受光器、タクトスイッチx2、照度センサ(TSL2561)なども一緒になっているんです。しかも、2×20の40ピンで直接 Rasberry Pi のGPIO端子とつなげてしまえばブレッドボードを使った複雑な配線も不要です。
ただし、ピンヘッダとの接続のための半田処理が必要なので電子工作の経験がある人向けだと思います。
何年かぶりに半田ごてを握りました。
ちなみに、同時に購入していた0.3mmφの糸ハンダで最初やったんですがやっぱり半田が足りてなくて接触不良でうまく行きませんでしたので、改めて1.6mmφの半田でやり直したのが上の写真です。
BME280をラズパイに認識させる
BME280 は I2C を使ってRaspberry Piとデータのやり取りをしますので、raspi-config で 5 Interfacing > P5 I2C
から I2Cを有効にします。
1 2 |
$ sudo raspi-config |
設定後 reboot が必要です。
再起動が終わったら I2C でBME280を認識できているか確認しましょう。
ここでは i2c-tools というパッケージに含まれるツールを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo apt-get install i2c-tools $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77 |
今回使用したセンサは 0x77 にアサインされているそうなので、 ちゃんと77が表示されていますね。
引数の 1
ですが、RaspberryPi の種類によっては 0
だったりします。
もし 1
でうまく行かず次のようなエラーが出る場合は 0
を試してみてください。
1 2 |
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory |
それか ls /dev/i2c-*
を実行して確認してもいいでしょう。
BME280からデータを読み込む
では実際にデータを読み取ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ sudo i2cdump -y 1 0x77 No size specified (using byte-data access) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 80: 98 90 89 2b 76 04 da 06 92 6d 2a 68 32 00 0a 96 ???+v????m*h2.?? 90: 99 d6 d0 0b 61 22 b5 ff f9 ff 0c 30 20 d1 88 13 ????a"?.?.?0 ??? a0: 00 00 71 00 00 00 00 00 00 00 00 00 33 00 00 c0 ..q.........3..? b0: 00 54 00 00 00 00 60 02 00 01 ff ff 1f 60 03 00 .T....`?.?..?`?. c0: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00 ................ d0: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 `............... e0: 00 6a 01 00 13 2f 03 1e 09 41 00 ff ff ff ff ff .j?.?/???A...... f0: ff 00 00 00 00 00 00 80 00 00 80 00 00 80 00 80 .......?..?..?.? |
うん、なにがなにやらわかりません。
pythonスクリプトで取得してみる
なので、pythonのスクリプトを使って読み込んでみます。
今回は スイッチサイエンスさんが公開されているスクリプトを使って試してみます。
1 2 3 4 5 6 7 8 9 10 |
$ cd ~ $ git clone https://github.com/SWITCHSCIENCE/BME280 $ cd BME280/Python27 $ vi bme280_sample.py > i2c_address が 0x76 になっているので 0x77 に変更します。 $ python bme280_sample.py Traceback (most recent call last): File "bme280_sample.py", line 3, in <module> from smbus2 import SMBus ImportError: No module named smbus2 |
おっと、smbus2モジュールが必要なようです。
1 2 |
$ sudo pip install smbus2 |
あらためてデータ取得してみましょう。
1 2 3 4 5 |
$ python bme280_sample.py temp : 31.36 ℃ pressure : 1002.45 hPa hum : 63.32 % |
お、取得できましたね。
何度か繰り返してみて更新されるか試してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ python bme280_sample.py temp : 31.41 ℃ pressure : 1002.50 hPa hum : 62.90 % $ python bme280_sample.py temp : 31.42 ℃ pressure : 1002.52 hPa hum : 62.91 % $ python bme280_sample.py temp : 32.94 ℃ pressure : 1002.46 hPa hum : 63.97 % $ python bme280_sample.py temp : 33.15 ℃ pressure : 1002.46 hPa hum : 64.55 % $ python bme280_sample.py temp : 33.38 ℃ pressure : 1002.51 hPa hum : 65.39 % |
センサのところを指で触ってたら温度が上昇しました。
うまいぐあいにデータが取得できるようになりました。
次回はrubyを使ってBME280からデータを読み込んでslackに通知してみます。