Portál AbcLinuxu, 29. dubna 2024 16:12


Dotaz: Jak dostat data z I2C zařízení BH1750 přes USB-I2C převodník v Pythonu?

jiri.one avatar 4.4.2020 19:42 jiri.one | skóre: 19 | blog: Jiriho blog
Jak dostat data z I2C zařízení BH1750 přes USB-I2C převodník v Pythonu?
Přečteno: 246×
Odpovědět | Admin
Zdar,

mám tato zařízení:

USB-I2C převodník: https://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm

GY-30 I2C modul: https://5.imimg.com/data5/TY/AK/MY-1833510/gy-30-bh1750-intensity-digital-light-sensor-module.pdf

A modul GY-30 je se snímačem okolního osvětlení BH1750: https://www.mylms.cz/wp-content/uploads/2017/07/bh1750-datasheet.pdf

Potřeboval bych z toho BH1750 vyčítat Luxy. Cílem je, abych si pak napsal SW, který mi bude automaticky regulovat podsvícení monitoru.

S převodníkem komunikovat umím, přes pyserial na něm umím zhasnout tu kontrolní LEDku a nebo si nechat zobrazit jeho verzi.

Co u ale neumím, to je určit správnou sekvenci bytů (bajtů), aby mi ten BH1750 poslal ty Luxy. Mám to testovně napsané nějak takto:

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()

Zkoušel jsem různé posloupnosti, samozřejmě nejdřív ten BH1750 přes 0x01 zapnout, resetovat a tak dále. Ale ono se to k němu prostě nějak asi nedostane, vůbec to nereaguje, zkoušel jsem i jiné adresy, na všech adresách ale stejná odezva. Něco jakoby vyčtu, ale je to třeba jen číslo 255 a bohužel to Luxy opravdu nejsou.

Umí s tím někdo a byl by mi ochoten pomoci? Buď samozřejmě takhle přes fórum a nebo klidně sdílení přes ssh a nebo nějaká session.

Díky za případné reakce.

Jiří

www.jiri.one - Můj blog o Linuxu, hrách, životě, ...

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jendа avatar 4.4.2020 20:09 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak dostat data z I2C zařízení BH1750 přes USB-I2C převodník v Pythonu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Připojit logický analyzér (můj oblíbený Saleae klon za $7 z Ali) a podívat se. Bez toho se to bude ladit složitě.
Já to s tou denacifikací Slovenska myslel vážně.
Řešení 1× (jiri.one (tazatel))
jiri.one avatar 5.4.2020 14:12 jiri.one | skóre: 19 | blog: Jiriho blog
Rozbalit Rozbalit vše Re: Jak dostat data z I2C zařízení BH1750 přes USB-I2C převodník v Pythonu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tady je finální řešení:
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))
www.jiri.one - Můj blog o Linuxu, hrách, životě, ...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.