マイクロビット(e_13)BH1750FVI 環境光センサー(照度センサー)
GY-302モジュール 環境光センサー(照度センサー)
BH1750FVI照度センサーを搭載したGY-302モジュールを使ってみようと思います。
以下がGY-302モジュールの外観です。環境光センサーBH1750(ローム)が搭載されています。BH1750側を受光面にします。
データシートをみると3.0Vで動作するので、micro:bitから電源供給できます。端子ADDRの接続状態でスレーブアドレスを変更できます。’L’で0x23(35)、’H’で0x5c(92)です。I2C通信で接続します。
照度データは2バイトの16ビットになります。
測定モードが(Continuously、One Time)×(resolution H、H2、L)の6つあります。以下ではOne Timeの resolution-Hを使います。詳細はデータシートを参照してください。
接続例
接続は以下の図のようにしました。micro:bitのクロック信号SCL(Pin19)、データ信号SDA(Pin20)とGY-302モジュールのSCL、SDAと接続します。GY-302モジュールのADDRはGNDに接続してスレーブアドレスを0x23(35)にしました。
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
以下は実体接続の写真です。
スクリプト
スクリプトは以下のようにしました。
from microbit import *
# BH1750FVI GY-302 ADDR=L 0b010011=0x23(35) ADDR=H 0b1011100=0x5c(92)
addr=0x23 # I2C スレーブアドレス
#onetime_H-resolution mode180ms
H_mode=0x20 # オペコード 測定の推奨モード H-resolution
#onetime_L-resolution mode180ms24msec
L_mode=0x23 # オペコード
#mesure mode set 測定モードの設定
buf=bytearray(1)
buf[0]=H_mode
i2c.write(addr,buf)
sleep(500) # データシートでは180msec以上に
#H,L 2byte read data 16bitデータ H,L
r_data=i2c.read(addr,2)
H_byte=r_data[0] # High byte データ
L_byte=r_data[1] # Low byte データ
# caluculate
d_lux=H_byte << 8 | L_byte # High byte を8bitシフトして16bitデータにする
lux=d_lux/1.2 # 照度計算 1.2で割る
#print(r_data, hex(H_byte),hex(L_byte),bin(d_lux),d_lux,lux)
print('Lux= %6.1f lx' % lux ) # 結果表示
実行結果です。デスクスタンド下の照度を測定しました。(ThonnyのShellに表示されます)
ずいぶん昔に買ったMINOLTA T-10の照度計を探して来ました。測定すると1061 lx でした。非常に近い値でびっくりしました。
>>> %Run 1127_bh1750_lux_b.py
Lux= 1094.1 lx
Cdsと比較
BH1750FVIのGY-302モジュールで照度を測定しCdsの抵抗値と比較してみます。Cdsの抵抗測定はe_04の記事を参照して下さい。接続は以下のようにしました。
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
スクリプトは以下のようにしました。
from microbit import *
# power supply mv z
Vs=3200 #実測した供給電圧
# 比例換算の関数
def u_map(value,a_min,a_max, b_min,b_max):
y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
return y
display.off()
pin1.set_pull(pin1.NO_PULL)
# BH1750FVI GY-302 ADDR=L 0b010011=0x23(35) ADDR=H 0b1011100=0x5c(92)
addr=0x23
#onetime_H-resolution mode180ms
H_mode=0x20
#onetime_L-resolution mode180ms24msec
L_mode=0x23
for i in range(60):
# cds ohm mesure
r_v1 = pin1.read_analog()
sleep(100)
v1=u_map(r_v1, 0, 1024, 0, Vs) # 電源電圧と比例計算して算出
#cds_ohm
cds=(Vs*1000)/v1-1000 # Cdsの抵抗値を算出
cds=cds/1000 # kohm
#mesure mode set
buf=bytearray(1)
buf[0]=H_mode
i2c.write(addr,buf)
sleep(500)
#H,L 2byte read data
r_data=i2c.read(addr,2)
H_byte=r_data[0]
L_byte=r_data[1]
# caluculate
d_lux=H_byte << 8 | L_byte
lux=d_lux/1.2
#print(r_data, hex(H_byte),hex(L_byte),bin(d_lux),d_lux,lux)
print(i,'cds %7.2f kΩ ' % cds, 'Lux=%6.1f lx' % lux ) # 結果表示
sleep(1000)
実行結果です。(ThonnyのShellに表示されます)
>>> %Run 1128_bh1750_cds_b2.py
0 cds 77.69 kΩ Lux= 1.7 lx
1 cds 62.94 kΩ Lux= 3.3 lx
2 cds 45.50 kΩ Lux= 4.2 lx
3 cds 25.92 kΩ Lux= 8.3 lx
4 cds 16.05 kΩ Lux= 15.0 lx
5 cds 11.79 kΩ Lux= 25.0 lx
.
.
58 cds 0.18 kΩ Lux=25210.8 lx
59 cds 0.17 kΩ Lux=27093.3 lx
データを表計算ソフトで散布図にしました。BH1750の照度とCdsの抵抗値の軸を対数にするとほぼ直線になりました。
まとめ
micro:bitで環境光センサーBH1750FVIのGY-302モジュールを使ってみました。接続も簡単で照度が測れます。
測定値が思った以上に正確でびっくりしました。I2Cデバイスの使い方の練習にもなったと思います。