Python3 如何通过 USB-I2C 模块从 I2C 设备 BH1750 获取数据?
How to get data from I2C device BH1750 over USB-I2C module in Python3?
我是 Linux 用户并且我有这些设备:
USB-I2C转换器:
https://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm
GY-30 I2C模块:
https://5.imimg.com/data5/TY/AK/MY-1833510/gy-30-bh1750-intensity-digital-light-sensor-module.pdf
GY-30搭配BH1750环境光传感器:
https://www.mylms.cz/wp-content/uploads/2017/07/bh1750-datasheet.pdf
我需要通过 Python3 中的虚拟串行端口从 BH1750 读取 Luxs,但我不确定该怎么做。
我以这样的方式结束:
import serial
ser = serial.Serial(port="/dev/ttyUSB0",
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0.500,
)
ser.flushInput()
ser.flushOutput()
ser.write(bytearray([0x55, 0x23, 0x11, 0x01]))
test = ser.read()
但我不确定,什么是正确的字节。我将 GY-30 直接连接到 USB-I2C。
感谢您最终的帮助...
智日
有最终解决方案:
import serial
import time
ser = serial.Serial(port="/dev/ttyUSB0",
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0.500,
)
ser.flushInput()
ser.flushOutput()
ADDR_BASE = 0x23 # nebo 0x5c pokud je ADDR pin HIGH
ADDR_READ = ADDR_BASE << 1 | 1
ADDR_WRITE = ADDR_BASE << 1
CMD_WRITE_1B = 0x53
CMD_READ_MULT = 0x54
LUX_RESOLUTION_1X = 0x10
LUX_RESOLUTION_4X = 0x13
# nastavení senzoru
ser.write(bytearray([CMD_WRITE_1B, ADDR_WRITE, LUX_RESOLUTION_1X]))
while True:
time.sleep(1)
# požádám převodník o 2 B
ser.write(bytearray([CMD_READ_MULT, ADDR_READ, 0x02]))
# přečtu je
raw = ser.read(2)
# interpretace bytů podle datasheetu
lx = (raw[1] << 8 | raw[0]) / 1.2
print("--> %.d lx" %(lx))
我是 Linux 用户并且我有这些设备:
USB-I2C转换器:
https://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm
GY-30 I2C模块:
https://5.imimg.com/data5/TY/AK/MY-1833510/gy-30-bh1750-intensity-digital-light-sensor-module.pdf
GY-30搭配BH1750环境光传感器:
https://www.mylms.cz/wp-content/uploads/2017/07/bh1750-datasheet.pdf
我需要通过 Python3 中的虚拟串行端口从 BH1750 读取 Luxs,但我不确定该怎么做。 我以这样的方式结束:
import serial
ser = serial.Serial(port="/dev/ttyUSB0",
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0.500,
)
ser.flushInput()
ser.flushOutput()
ser.write(bytearray([0x55, 0x23, 0x11, 0x01]))
test = ser.read()
但我不确定,什么是正确的字节。我将 GY-30 直接连接到 USB-I2C。
感谢您最终的帮助...
智日
有最终解决方案:
import serial
import time
ser = serial.Serial(port="/dev/ttyUSB0",
baudrate=19200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0.500,
)
ser.flushInput()
ser.flushOutput()
ADDR_BASE = 0x23 # nebo 0x5c pokud je ADDR pin HIGH
ADDR_READ = ADDR_BASE << 1 | 1
ADDR_WRITE = ADDR_BASE << 1
CMD_WRITE_1B = 0x53
CMD_READ_MULT = 0x54
LUX_RESOLUTION_1X = 0x10
LUX_RESOLUTION_4X = 0x13
# nastavení senzoru
ser.write(bytearray([CMD_WRITE_1B, ADDR_WRITE, LUX_RESOLUTION_1X]))
while True:
time.sleep(1)
# požádám převodník o 2 B
ser.write(bytearray([CMD_READ_MULT, ADDR_READ, 0x02]))
# přečtu je
raw = ser.read(2)
# interpretace bytů podle datasheetu
lx = (raw[1] << 8 | raw[0]) / 1.2
print("--> %.d lx" %(lx))