BH1750 Light Sensor ライブラリを作ってみた。

アマゾンで安く売られていたので中華製のチップかなと思いつつも駄目元で購入したのだが調べたところ型番だけ見ると日本の有名な会社であるローム社のチップらしい。但し、本物かどうかは不明。(-_-;)

HiLetgo 3個セット BH1750FVI BH1750 GY-302 3V-5V デジタル 光量センサモジュール AVR Arduinoに対応 [並行輸入品]

とりあえずArduinoのライブラリリストで紹介されていた物を使ってみて問題なく動作はしたものの若干気になる部分もあったので新たに作ってみることにした。データシートではイマイチ詳細不明な部分もあったがとりあえず完成。手持ちの照度計との比較ではそれなりに誤差はあるものの十分使えるレベルかと思う。但し、10ルクス以下は高分解能モードでなんとか認識できる程度だ。

で、なんで新たに作ってみることにしたのかと言うと、
1.浮動小数点演算を使っている。
2.コードが若干わかりづらく少し大きめ。
くらいなもので問題ないと言えば問題ないのだが...だいぶ、昔に作った感のあるコードでもあったし、比較的単純なコードという感じでもあったことから、参考にさせて頂いた上で自分の理解を深めるためにも独自のコードを作ってみることにした。不必要なクラスも含まれているが今までに紹介したクラスを改良したものなのでセット物として理解してもらいたい。

【概要】

テンプレート・クラス。IOBUS_TにはPBUSIFクラスを継承したクラスを指定する。規定ではArduino標準のTwoWire(Wire)クラスを利用するインターフェースを使用する。

I2C初期処理を行う。

I2C終了処理を行う。

BH1750のリセット処理を実行する。呼び出し後はPOWER_ONモードに移行する。MTregの値は初期化されないことに注意すべし。

Measurement Time Registerの値を設定する。規定値(BH1750_DEFAULT_MTREG_VALUE) からの+-相対値を指定する。この呼出し後のstart()呼び出しにより実行されることに注意。

計測を開始する。One Timeモードを指定した場合は計測完了まで待ってからリターンし、Continuouslyモードを指定した場合は即座にリターンする。
10ルクス未満を計測する場合は規定値のBH1750_CONTINUOUSLY_H_RESOLUTION_MODE2を指定する必要がある。

Continuouslyモードの計測を停止しPOWER_DOWN(省電力)モードに移行する。One Timeモードでは計測完了後にPOWER_DOWNモードに自動的に移行するのでこの呼出しは必要ではない。

直前の計測値(固定小数点形式)を取得する。小数点以下が必要でなければ4ビット右シフトするだけで良い。四捨五入するには8を足してから右シフトする。オプションとして変換精度値を変更することが出来る。が、役に立つかどうかは不明。詳しくはデータシート参照してほしい。

Continuouslyモードをハンドリングする。戻り値として計測が完了するとtrue、計測中であればfalseが返される。

【サンプル・スケッチ】

【ライブラリ】

【IOインターフェース・クラス】

【TWI実装クラス】

【SPI実装クラス。今回は使っていないので必要ない】