屋内環境を手軽にモニタリングする～⑪BH1750FVI(代用)から照度を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>

今回、新たな照度センサーとして、ROHMの[BH1750FVI](https://www.mouser.com/datasheet/2/348/bh1750fvi-e-186247.pdf)を選択しました。手頃な価格であり、数百円で入手できます。

## BH1750FVIセンサーとは
このセンサーは、照度を測定することができます。インターフェースはI2Cで、I2Cアドレスには、`0x23`or`0x5c`のいずれかを指定することができます。また、Raspberry Pi 3B or 4BのI2Cバスは、`0`と`1`の二つありますので、Raspberry Pi 3B or 4Bでは、BH1750FVIを最大4個、同時に使用することができます。
<img width="700" alt="rainy_bh1750fvi_floor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/bebbe2f8-3bb1-2620-cc7d-b3e0ce99f5aa.png"/>

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

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

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

import io.github.s5uishida.iot.device.bh1750fvi.driver.BH1750FVIDriver;

public class MyBH1750FVI {
    private static final Logger LOG = LoggerFactory.getLogger(MyBH1750FVI.class);
    
    public static void main(String[] args) {
        BH1750FVIDriver bh1750fvi = null;
        try {
            bh1750fvi = BH1750FVIDriver.getInstance(I2CBus.BUS_1, BH1750FVIDriver.I2C_ADDRESS_23);
            bh1750fvi.open();
                
            while (true) {
                float value = bh1750fvi.getOptical();
                LOG.info("optical:" + value);
                    
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            LOG.warn("caught - {}", e.toString());
        } catch (IOException e) {
            LOG.warn("caught - {}", e.toString());
        } finally {
            if (bh1750fvi != null) {
                bh1750fvi.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)](https://qiita.com/s5uishida/items/cb791d015dba41202e90)
　関連するGithubは[こちら](https://github.com/s5uishida/bme280-driver)。
11. **BH1750FVI(代用)から照度をJavaで取得する(I2C / Pi4J)(今回)**
　関連するGithubは[こちら](https://github.com/s5uishida/bh1750fvi-driver)。