I2c auslesen und in eine physikalische Größe verwandeln

  • Hallo

    Ich bin noch recht neu hier und unerfahren mit python und habe eine kleines Problem mit einem Drucksensor der über I2C läuft. Wenn ich ihn auslese bekomme ich folgende Beispielwerte geliefert:

    [134 119 100 176]

    Die Beschreibung des Sensors ist hier

    In dieser steht (auf Seite 9) das der Sensor vier bytes ausgibt. Scheinbar ja als dezimalzahlen. Es steht weiterhin das man die beiden ersten bytes in binärer form zusammenfügen soll und dann die ersten beiden Ziffern entfernen soll. Daraus soll dann wieder eine Dezimalzahl werden die in einer Formel den endgültigen Druck (bzw Differenzdruck) ergibt.

    Mein Problem ist, das elegant in Python zu lösen, also diese endgültige Dezimalzahl zu erhalten. Was ist z.B. wenn die Dezimalzahl aus dem zweiten byte binär nicht 8 ziffern hat. Beim zusammenfügen würden sich dann fehler ergeben. Wie kann ich zum Beispiel die umgewandelte dezimalzahl mit nullen auffüllen wenn es weniger als 8 ziffern hat.

    Ich wäre für jede Anregung/Vorschlag dankbar.

  • I2c auslesen und in eine physikalische Größe verwandeln? Schau mal ob du hier fündig wirst!

  • Die Rohwerte sind:

    Code
    >>> first = 134
    >>> second = 119
    >>> pressure = (((first & 0x3F) << 8) | second)
    >>> third = 100
    >>> fourth = 176
    >>> temperature = ((third << 3) | ((fourth >> 5) & 0x07))

    Die Temperatur ist:

    Code
    >>> print temperature * 200 /2048 - 50

    Einmal editiert, zuletzt von Tell (25. Mai 2014 um 22:32)

  • Hallo Philipp,

    das auf Seite 9 Deines Links angegebene Beispiel zeigt doch ganz deutlich, wie es geht:

    Vom ersten Byte werden die beiden häherwertigen Bits ausgeblendet

    Code
    Byte1 := Byte1 ExklusivODER 192

    Dadurch werden die beiden höherwertigen Bits in Byte 1 ausgeblendet.


    Byte 2 und Byte 3 werden dazu addiert.

    Code
    Wert_p := 256 * Byte1 + Byte2

    Dadurch erhältst Du eine Dezimalzahl, die maximal aus 14 Bits besteht.

    Das Gleiche machst Du mit Byte3 und Byte4 wobei Dich nur die ersten 11 Bits interessieren, also so

    Code
    Byte4 := Byte4 ExklusivODER 31
    Wert_t := 8 * Byte3 + Byte4 / 32

    Diese Werte setzt Du in die angegebenen Formel ein und erhältst somit Werte für den Druck und für die Temperatur.

    Gutes Gelingen!

    Andreas

    P.S.: Jetzt musst Du nur noch herausbekommen wie der Operator für ExklusivODER in Python heißt... :thumbs1:

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (25. Mai 2014 um 22:35)

  • Hallo Tell,

    da hast Du Recht ... :wallbash:

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Anbei ein Codesnippet. Du solltest es aber verstehen :rolleyes: ... also frage wenn noch etwas unklar ist.

    Ergebnis:

    Code
    --- Beispielwerte aus der doc
    Binary values: ['00101100', '11001101', '01011100', '11100000']
    Binary word1: 0010110011001101(bin) 11469(dec)
    Binary word2: 0000001011100111(bin) 743(dec)
    --- Deine gelesenen Werte
    Binary values: ['10000110', '01110111', '01100100', '10110000']
    Binary word1: 0000011001110111(bin) 1655(dec)
    Binary word2: 0000001100100101(bin) 805(dec)

  • > Byte1 := Byte1 ExklusivODER 192
    Falsch ! Das setzt die hoechstwertigen Bits wenn sie 0 sind.

    > Byte4 := Byte4 ExklusivODER 31
    Auch falsch ...

    Bits werden mit AND geloescht ! Und zwar steht an der Position der
    unerwuenschten Bits eine 0 und bei den gewuenschten eine 1.

    danke ich zweifelte schon an mir :thumbs1:

    > Byte1 := Byte1 UND 63 kam mir in den Sinn oder anders in C

    > Byte1 := Byte1 UND ~192

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (26. Mai 2014 um 14:36)

  • Hallo Jar,

    das kommt davon, wenn man mit was ganz Anderem beschäftigt ist und dann noch nebenbei versucht, Register geschickt zu maskieren und zu verschieben.

    Ich kann`s normalerweise besser :s - sonst würde ich`s auch bleiben lassen ;).

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Vielen Dank für die ganzen Beiträge. Ich habe den code von framp genommen und inzwischen noch einen zweiten Differenzdrucksensor zum laufen bekommen. Obowhl alles geht muss ich zugeben das ich den Code nicht ganz verstehe. Auch google hat mir da nicht sonderlich weitergeholfen. Könnt ihr eine gute website empfehlen? Danke

  • Mein Code versucht schrittweise zu erklären, wie man zur Lösung kommt. Tell hat das genauso - aber kurz und knapp - beschrieben.

    Diese Seite wie auch diese Seite habe ich eben so quick and dirty ergoogelt. Meine Suchargumente waren binary operations python. Vielleicht findest Du noch besseres. Wenn was bei meinen einzelnen Schritten nicht klar ist - einfach fragen :) ... aber vorher die verlinkten Seiten von mir bitte lesen und verstehen ...

Jetzt mitmachen!

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