BH1750FVIのモジュールが安価に入手できたので使い方を調べてみました。
BH1750の英語のデータシートはネットで入手できます。BH1750はすでにディスコンになっていて、後継のチップはBH1721FVCなどになるようです。BH1721FVCのデータシートは日本語のものがロームのサイトにありました。仕様が一部変更されているようです。
BH1750のデフォルトのI2Cアドレスは0x23で通常はContinuously H-Resolution Modeの0x10を書くと、その後2バイトづつデータ読めます。
値(Lux)はデフォルトでは
((buff[0] << 8) | buff[1]) / 1.2
この場合0.83ステップでのデータになります。ほとんど整数値に近いので
((buff[0] << 8) | buff[1]) * 5 / 6
と整数演算しても良いかもしれません。
これより細かいステップでデータを取得したい場合はMtregを使う必要があります。Mtregは31から254でデフォルトが69となります。
例えば254の場合は
(((buff[0] << 8) | buff[1]) * 69) / (1.2 * 254)
で0.23ステップになります。
またH-Resolution Mode2(0x11)ではこれの半分のステップになります。
読み取れるデータはこうなっていて
例えばbuff[0] = 0,buff[1] = 1の場合
2の-1乗は0.5なので
(0.5 * 69) / (1.2 * 254) = 0.11
となります。
2の0乗は1ってこと忘れてました。^ ^;
Mtregを小さくすれば100000Luxまで測れるようですが、逆に大きくすると上限は小さくなります。Mode2でMtregが254の場合7417がMAXなので、5000以上になる場合は通常モードやMtregを小さくして計測するのが良いです。
7400付近でさちってます。
H-Resolution Mode2でMtreg=254にしてmrubyスクリプトで20秒おきにデータを拾ってThingSpeakに投げてみました。
最初に試した時にはいきなり小さい値が出てきたりして安定しませんでした。
蟹さんとI2Cバスリピーター(PCA9515AD)を挟んでつないでいたのですが、直接つないだら正常に動くようになりました。
蟹さんのJTAGピンをGPIOにしてBITBANGでI2Cしているのですが、このピンは内部でpull-up(75K)されていているのが原因で、動作が変な気がします。
0.11ステップでとれてるようなのですが、データが滑らかになっていません。
pull-up抵抗を調整したりデバイスを増やしてみたりしていたところ、挙動が変わりました。謎です。
mrubyスクリプトはまずOne TimeのL-Resolution Modeでデータを取得して、1000以下の場合はH-Resolution Mode2で再取得するようにしました。
BH1750はModeやResolutionを動的に変えると変な動きになるので、変えない方が良さそうです。暗い方を細かく取りたい場合はHigh Mode2でMtregを大きくして、明るい方を上限まで取りたい場合はLow ModeでMtregを小さくするとよいでしょう。
蟹さんのmrubyはfloatが使えないので100倍の整数演算で計算して文字列にして小数点を付けてます。
入手したモジュールはGY-302と呼ばれているもののようです。
回路はこんなになってるようです。
このチップのVCCの標準は3.0Vで3.3Vではありません。3.3Vでも動きますが。またこのモジュールにはI2Cのレベル変換がないので、5Vで使うのは規定範囲から外れます。