感測器簡介
BH1750 Pin Configuration
電路圖
程式列表
Python - BH1750.py
"""
Micropython BH1750 ambient light sensor driver.
"""
import utime
class BH1750():
# Define some constants from the datasheet
POWER_DOWN = 0x00 # No active state
POWER_ON = 0x01 # Power on
RESET = 0x07 # Reset data register value
# modes
# Start measurement at 4lx resolution. Time typically 16ms.
CONTINUOUS_LOW_RES_MODE = 0x13
# Start measurement at 1lx resolution. Time typically 120ms
CONTINUOUS_HIGH_RES_MODE_1 = 0x10
# Start measurement at 0.5lx resolution. Time typically 120ms
CONTINUOUS_HIGH_RES_MODE_2 = 0x11
# Start measurement at 1lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_HIGH_RES_MODE_1 = 0x20
# Start measurement at 0.5lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_HIGH_RES_MODE_2 = 0x21
# Start measurement at 1lx resolution. Time typically 120ms
# Device is automatically set to Power Down after measurement.
ONE_TIME_LOW_RES_MODE = 0x23
""" Implement BH1750 communication. """
# default addr=0x23 if addr pin floating or pulled to ground
# addr=0x5c if addr pin pulled high
def __init__(self, bus, addr=0x23):
self.bus = bus
self.addr = addr
self.power_down()
self.reset()
def _set_mode(self, mode):
"""Set sensor mode."""
self.bus.send(mode,self.addr)
def power_down(self):
"""Turn sensor off."""
self._set_mode(self.POWER_DOWN)
def power_on(self):
"""Turn sensor on."""
self._set_mode(self.POWER_ON)
def reset(self):
"""Reset sensor, turn on first if required."""
self.power_on() #It has to be powered on before resetting
self._set_mode(self.RESET)
def cont_low_res(self):
self._set_mode(self.CONTINUOUS_LOW_RES_MODE)
def cont_high_res(self):
self._set_mode(self.CONTINUOUS_HIGH_RES_MODE_1)
def cont_high_res2(self):
self._set_mode(self.CONTINUOUS_HIGH_RES_MODE_2)
def oneshot_low_res(self):
self._set_mode(self.ONE_TIME_LOW_RES_MODE)
def oneshot_high_res(self):
self._set_mode(self.ONE_TIME_HIGH_RES_MODE_1)
def oneshot_high_res2(self):
self._set_mode(self.ONE_TIME_HIGH_RES_MODE_2)
def luminance(self, mode):
"""Sample luminance (in lux), using specified sensor mode."""
data = bytearray(2)
# continuous modes
if mode & 0x10 and mode != self.mode:
self._set_mode(mode)
# one shot modes
if mode & 0x20:
self._set_mode(mode)
# earlier measurements return previous reading
utime.sleep_ms(24 if mode in (0x13, 0x23) else 180)
self.bus.recv(data,self.addr) # 讀取2個位元組
factor = 2.0 if mode in (0x11, 0x21) else 1.0
#print("%x,%x"%(data[0],data[1])) #Debug
return ((data[0]<<8 | data[1]) / (1.2 * factor))
Python - ePy-Lite_BH1750.py
"""
Filename: epy_BH1750.py
ePy BH1750
--------------
3V3 VCC
GND GND
P17_SCL0 SCL
P18_SDA0 SDA
ADDR
"""
from micropython import const
from machine import Switch #獲取按鍵KEY庫
from machine import I2C
import utime
import BH1750
i2c_0 = None
addrBH1750 = const(0x23) # BH1750 Device ID address for slave target
level = 0
# Start Function
if __name__=="__main__":
# Declaration I2C
i2c_0 = I2C(0,I2C.MASTER,baudrate=400000) #創建頻率為400kHz的I2C外設,選擇要使用的外設I2C 0
sensor = BH1750.BH1750(i2c_0 )
KeyA = Switch('keya') #創建按鍵A
print("Start light measurement.")
try:
while True:
level = sensor.luminance(sensor.ONE_TIME_HIGH_RES_MODE_1)
print("Light Level :%d lx"%(level))
utime.sleep(1)
if KeyA.value() == True: #如果按鍵A被按下
break
except:
pass
i2c_0 .deinit()
print("Exit light measurement.")
執行結果