I2C Flow Sensor auslesen und wert in variabel ablegen

  • Ein grosses Hallo an alle Mitglieder dieser Gruppe:)

    Ich versuche seit etwa 16h:conf: einen Flow Sensor (i2c) auszulesen und den Ausgabewert dezimal in einer variabel abzulegen. ich arbeite mit der Library pigpio und konnte eine Verbindung zum Device aufbauen8) dieser liefert mir auch diverse werte wie (2, bytearray(b’-\x01’)) nach dem ich den Durchfluss beim Sensor erhöhe erhalt ich z. B. (2, bytearray(b’-\x91’)) oder (2, bytearray(b’-/\x1f’)) oder.... (2, bytearray(b’-\xc0,’)) wie kann ich diese werte verstehen? ich erkenne das es sich um das hexadezimal System handelt aber was, sagen die anderen Veränderungen aus? Geschweige wie kann ich nun diese werte in eine einfache Dezimale variabel einpflegen? (Python3) ich bin noch blutiger Anfänger und bin froh um jede Hilfeee:daumendreh2:

    Ich danke Euch im Voraus:danke_ATDE: und hey DANKE, dass ich mich bei Euch im Forum anmelden durfte:thumbup::thumbup::thumbup:

    Code
    import pigpio
    pi = pigpio.pi()
    h = pi.i2c_open(1, 0x29)
    x = pi.i2c_read_device(h, 2)
    pi.i2c_close(h)
    print(x)

    Datenblatt Sensor: HAFBSF0200C2AX3

    Über einen :thumbup: freue ich mich;)

  • I2C Flow Sensor auslesen und wert in variabel ablegen? Schau mal ob du hier fündig wirst!

  • Zitat

    (2, bytearray(b’-/\x1f’))

    Kann nicht sein, beim lesen bekommst du ein Tuple (x) zurück, das die Größe der gelesenen Daten in Bytes enthält (2) und die tatsächlichen Bytes in Form eines Byte Arrays. Der von dir angegebene enthält aber 3 Bytes. Du musst uns schon Fakten liefern... Außerdem ist es im Datenblatt doch ziemlich gut beschrieben, was du zurück bekommst (eine 16-bit Zahl, deren ersten 2 Bytes Bit 00 sind). Das du bei den ersten zwei Lesezugriffen die eindeutige device ID und keinen Wert bekommst, hast du bedacht?

  • Na gut, im Schnelldurchlauf:

    Python
    import pigpio
    pi = pigpio.pi()
    device = pi.i2c_open(1, 0x29)
    count, data = pi.i2c_read_device(device, 2)
    pi.i2c_close(device)
    value = int.from_bytes(data, "big")
    print(value)

    Erklärung:

    Die einzelnen Bytes (1 Byte = 8 Bit) des bytearrays kannst du dir ausgeben lassen:

    Code
    >>> data = bytearray(b"-\xc0")
    >>> bin(data[0])
    '0b101101'
    >>> bin(data[1])
    '0b11000000'
    Code
    0b101101   = 00101101
    0b11000000 = 11000000
    
    Zusammen also:
    
    0010110111000000

    => die ersten 2 Bit entsprechen 00, wie im Datenblatt prophezeit.

    Weiter in der Python-Shell:

    Python
    >>> 0b0010110111000000
    11712
    >>> int.from_bytes(data, "big")
    11712

    Passt also.

  • Kann nicht sein, beim lesen bekommst du ein Tuple (x) zurück, das die Größe der gelesenen Daten in Bytes enthält (2) und die tatsächlichen Bytes in Form eines Byte Arrays. Der von dir angegebene enthält aber 3 Bytes. Du musst uns schon Fakten liefern... Außerdem ist es im Datenblatt doch ziemlich gut beschrieben, was du zurück bekommst (eine 16-bit Zahl, deren ersten 2 Bytes Bit 00 sind). Das du bei den ersten zwei Lesezugriffen die eindeutige device ID und keinen Wert bekommst, hast du bedacht?

    Zitat

    (2, bytearray(b’-/\x1f’))

    Komischerweise gab er das so aus. (Bild) :rolleyes:

    Wow danke für die schnelle Hilfe:bravo2: Es geht! :danke_ATDE:
    Und danke für das Erklären des Programms:thumbup::thumbup:

    das Datenblatt hatte ich noch nicht konsultiert, da ich dachte, ich muss nur irgendwie die Hexadezimalzahl ausschneiden und umrechnen… dann habe ich die werte, die ich mithilfe der Formel im Datenblatt umrechne. Na-ja war ein falscher Ansatz.:no_sad:

    Über einen :thumbup: freue ich mich;)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!