稼働中

マイクロビット(e_13)BH1750FVI 環境光センサー(照度センサー)

GY-302モジュール 環境光センサー(照度センサー)

BH1750FVI照度センサーを搭載したGY-302モジュールを使ってみようと思います。
以下がGY-302モジュールの外観です。環境光センサーBH1750(ローム)が搭載されています。BH1750側を受光面にします。

GY-202外観1 GY-202外観2

データシートをみると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)にしました。

BH175接続例
※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の記事を参照して下さい。接続は以下のようにしました。
Cdsを追加した接続図
※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の抵抗値の軸を対数にするとほぼ直線になりました。
照度-CdS相関図

まとめ

micro:bitで環境光センサーBH1750FVIのGY-302モジュールを使ってみました。接続も簡単で照度が測れます。
測定値が思った以上に正確でびっくりしました。I2Cデバイスの使い方の練習にもなったと思います。