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