稼働中

Raspberry Pi Pico(s_12)BH1750FVI 用モジュール

BH1750FVI BH1750c.py

BH1750FVI GY-302モジュールはデジタル環境光センサー(照度センサー)です。
※詳細はBH1750FVIのデータシートを参照ください。
Raspberry Pi PicoでBH1750FVIセンサーモジュールを使う自作の’BH1750c.py’を作成しました。記事d_15を元に作成しています。使い方だけを記載します。’BH1750c.py’は末尾にあります。

使い方

■ ファイル転送
Raspberry Pi Picoへ’BH1750c.py’を送った後でimportして使います。
※BH1750c.pyの末尾に、使用例(BH1750c_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘BH1750c’をimportすると「S_Mode、L_Meas、D_Reset、P_On、P_Down、」のメソッドが使えるようになります。
BH1750(num=1,sda=10,slave=0x23)で初期化します。
num:I2C0、I2C1の番号です。デフォルトは1(I2C1)
sda:SDAのGPIO番号です。デフォルトは10(GP10)
slave:BH1750FVIのスレーブアドレスです。
デフォルトは0x23(ADDR=’L’) ADDR=’H’なら0x5cを使います。
(01)S_Mode(con=’O’,res=’H’)
測定のモードを設定します。
連続 Continue(‘C’) 単 Onetime(‘O’)
Resolution High(‘H’) High2(‘S’) Low(‘L’)
それぞれの文字を与えます。
(02)L_Meas()
測定した16bitデータ(r_data)と計算後照度(lux)をリスト[r_data,lux]データで返します。
(03)P_Down()
パワーダウンします。
(04)P_On()
パワーオンします。
(05)D_Reset()
照度データのレジスタをリセットします。

使用例

BH1750FVIで照度を測定します。


BH1750c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
from BH1750c import BH1750
# BH1750FVI digital Ambient Light Sensor I2C
#ADDR='L'35(0x23) ADDR='H' 92(0x5c)
## exapmle -----------------------
a=BH1750(1,10,0x23)#num=1,sda=10,slave=0x23

a.S_Mode('O','H')
lx=a.L_Meas()
print('Lux= %6.1f lx' % lx[1] )
print('16bit-data=',lx[0])

a.D_Reset()
lx=a.L_Meas()
print('Lux= %6.1f lx' % lx[1] )

#a.P_Down
a.P_On()
a.D_Reset()
lx=a.L_Meas()
print('Lux= %6.1f lx' % lx[1] )

実行結果

実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
Lux=  874.2 lx                      # 照度
16bit-data= b'\x04\x19'             # 16bitデータ
Lux=  874.2 lx      # OneTime測定後はPower Downのためリセットされていない
Lux=    0.0 lx      # PowerOn後のリセット

BH1750FVIモジュール用


BH1750c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
#BH1750FVI digital Ambient Light Sensor I2C
#ADDR='L'35(0x23) ADDR='H' 92(0x5c)
class BH1750:
    def __init__(self,num=1,sda=10,slave=0x23):
        self.addr=slave    # 0x50(80)~0x57(87)
        self.i2c=I2C(num, scl=Pin(sda+1), sda=Pin(sda), freq=100_000)
    # Power Down
    def P_Down(self):
        #mesure mode set
        buf=bytearray(1)
        buf[0]=0x00                #opecode  reset 0x07
        self.i2c.writeto(self.addr,buf)
    # Power On
    def P_On(self):
        #mesure mode set
        buf=bytearray(1)
        buf[0]=0x01                #opecode  reset 0x07
        self.i2c.writeto(self.addr,buf)
    # Reset
    def D_Reset(self):
        #mesure mode set
        buf=bytearray(1)
        buf[0]=0x07                #opecode  reset 0x07
        self.i2c.writeto(self.addr,buf)

    # Mode Setting
    # Continue('C') Onetime('O') High-1lx('H') High2-0.5lx('S') Low-4lx('L')
    def S_Mode(self,con='O',res='H'):
        global mode
        mode=[con,res]      #[Measure Mode,Resolution Mode]
        if mode[0]=='C':
            #Continuously
            if mode[1]=='H':
                wtime=200            
                opecode=0x10 #H-Resolution,Continuously
            if mode[1]=='S':
                wtime=200           
                opecode=0x11 #H-Resolution2,Continuously
            if mode[1]=='L':
                wtime=50            
                opecode=0x13 #L-Resolution,Continuously
           
        if mode[0]=='O':
            #One Time
            if mode[1]=='H':
                wtime=200
                opecode=0x20 #H-Resolution,One Time
            if mode[1]=='S':
                wtime=200
                opecode=0x21 #H-Resolution2,One Time
            if mode[1]=='L':
                wtime=50
                opecode=0x23 #L-Resolution,One Time
        # measure mode set
        buf=bytearray(1)
        buf[0]=opecode
        self.i2c.writeto(self.addr,buf)
        time.sleep_ms(wtime)

    # lux measure
    def L_Meas(self):
        # H,L 2byte read data
        r_data=self.i2c.readfrom(self.addr,2)
        H_byte=r_data[0]
        L_byte=r_data[1]

        # caluculate 
        d_lux=H_byte << 8 | L_byte
        #print('d_lux=',d_lux)

        # high2-mode 0.5 lx/bit
        if mode[1]=='S':    
            d_lux=d_lux >>1
            #print('d_lux=',d_lux)
        lux=d_lux/1.2    
        return r_data,lux