屋内環境を手軽にモニタリングする～⑩BME280(代用)から温度/湿度/気圧をJavaで取得する(I2C / Pi4J)～

以前、[こちらの記事](https://qiita.com/s5uishida/items/9c31e6fd9b6eb0fa9c96)で紹介した、環境情報をモニタリングする簡易ツールは、温度、湿度、気圧の各情報を[テキサス・インスツルメンツ社のSensorTag CC2650](http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide)から取得します。ただ、BLE環境センサータグとして、永らく世界的に知られたSensorTag CC2650は[生産中止](http://www.ti.com/tool/CC2650STK)のため、今後、入手が困難になると思われます。そこで、別のセンサーにも対応することにしました。
<font color="Red">
※2020年12月16日現在、SensorTag CC2650の生産中止の記述が見当たりません。以前、そのような記述を見かけたと記憶しているのですが…。なお、上記「テキサス・インスツルメンツ社のSensorTag CC2650」でリンクしたURLのWikiは、2021年1月15日にサポートを終了するそうで、必要なファイルやその他のコンテンツをダウンロードすることをお勧めします、とのことです。
</font>

世間には、温湿度センサーは数多く存在し、どれを選べばよいか正直悩みます。ちょうどその時、[参考になる情報](http://www.kandrsmith.org/RJS/Misc/Hygrometers/calib_many.html)を見付け、結果、Boschの[BME280](https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/)を選択しました。手頃な価格であり、数百円で入手できます。

## BME280センサーとは
このセンサーは、温度、湿度、気圧を測定することができます。なお、温度は気圧の測定値を補正する用途がメインのようですが、折角なので値そのものも利用します。インターフェースはI2CとSPIに対応していますが、ここではI2Cを使います。I2Cアドレスには、`0x76`or`0x77`のいずれかを指定することができます。また、Raspberry Pi 3B or 4BのI2Cバスは、`0`と`1`の二つありますので、Raspberry Pi 3B or 4Bでは、BME280を最大4個、同時に使用することができます。
<img width="700" alt="rainy_bme280_floor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/46b9d3f3-5734-d53a-304f-54d83f334887.png"/>

作成したBME280のJavaライブラリ([bme280-driver](https://github.com/s5uishida/bme280-driver))はGithubで公開しています。OSとセンサーの設定手順も書いておきました。また、このライブラリを組み込んだ環境情報モニタリングの簡易ツールは、[こちらのGithub](https://github.com/s5uishida/rainy)で公開しています。

## Javaライブラリの基本的な使い方
[bme280-driver](https://github.com/s5uishida/bme280-driver)の簡単な使い方を掲載します。以下のサンプルコードでは、I2Cバス=`1`、アドレス=`0x76`を指定しています。

```java
import com.pi4j.io.i2c.I2CBus;

import io.github.s5uishida.iot.device.bme280.driver.BME280Driver;

public class MyBME280 {
    private static final Logger LOG = LoggerFactory.getLogger(MyBME280.class);
    
    public static void main(String[] args) {
        BME280Driver bme280 = null;
        try {
            bme280 = BME280Driver.getInstance(I2CBus.BUS_1, BME280Driver.I2C_ADDRESS_76);
            bme280.open();
            
            while (true) {
                float[] values = bme280.getSensorValues();
                LOG.info("temperature:" + values[0]);
                LOG.info("humidity:" + values[1]);
                LOG.info("pressure:" + values[2]);
                
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            LOG.warn("caught - {}", e.toString());
        } catch (IOException e) {
            LOG.warn("caught - {}", e.toString());
        } finally {
            if (bme280 != null) {
                bme280.close();
            }
        }
    }
}
```
このように使い方はシンプルです。なお、[Pi4J](https://pi4j.com/)というRaspberry PiのGPIOを使用するためのJavaライブラリを使用して作成しました。

## 最後に
このJavaライブラリを組み込んだ簡易ツールには、各センサー値をダッシュボードでモニタリングする機能とJSON形式でMQTTブローカに送信する機能があります。

最後に、簡易ツールは[こちらのGithub](https://github.com/s5uishida/rainy)で公開しています。

## 一連の記事
このシリーズは、以下の記事から構成されます。
1. [動機とコンセプト](https://qiita.com/s5uishida/items/9c31e6fd9b6eb0fa9c96)
2. [Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)](https://qiita.com/s5uishida/items/a4543c9e7fb13b4c7c6e)
　関連するGithubは[こちら](https://github.com/s5uishida/bluetooth-scanner)。
3. [TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)](https://qiita.com/s5uishida/items/79a2de6a7026ef230e9b)
　関連するGithubは[こちら](https://github.com/s5uishida/cc2650-driver)。
4. [MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)](https://qiita.com/s5uishida/items/1759498f8f706c4c3314)
　関連するGithubは[こちら](https://github.com/s5uishida/mh-z19b-driver)。
5. [PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)](https://qiita.com/s5uishida/items/4ae7784aeaf50df1e3d3)
　関連するGithubは[こちら](https://github.com/s5uishida/ppd42ns-driver)。
6. [産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)](https://qiita.com/s5uishida/items/60954d356a3ea1048c61)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy-opcua)。
7. [簡易ツールにまとめる](https://qiita.com/s5uishida/items/c56f1444c6856656b128)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy)。
8. [後記](https://qiita.com/s5uishida/items/d2a888eb2d68e72f32ae)
9. [モーション検知(HC-SR501 / RCWL-0516)をJavaで取得する(GPIO / Pi4J)](https://qiita.com/s5uishida/items/a1a1344a99667e623559)
　関連するGithubは[こちら(HC-SR501)](https://github.com/s5uishida/hc-sr501-driver)と[こちら(RCWL-0516)](https://github.com/s5uishida/rcwl-0516-driver)。
10. **BME280(代用)から温度/湿度/気圧をJavaで取得する(I2C / Pi4J)(今回)**
　関連するGithubは[こちら](https://github.com/s5uishida/bme280-driver)。
11. [BH1750FVI(代用)から照度をJavaで取得する(I2C / Pi4J)](https://qiita.com/s5uishida/items/1a75c46e7d63fa480e34)
　関連するGithubは[こちら](https://github.com/s5uishida/bh1750fvi-driver)。