I2C auslesen funktioniert nicht

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich kann leider meinen NTC Temperatursensor welches an einem I2C (PCF8591) hängt nicht auslesen.

    Infos zu meinem Setup:

    cat /etc/os-release

    PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"

    NAME="Raspbian GNU/Linux"

    VERSION_ID="10"

    VERSION="10 (buster)"

    VERSION_CODENAME=buster

    ID=raspbian

    ID_LIKE=debian

    HOME_URL="http://www.raspbian.org/"

    SUPPORT_URL="http://www.raspbian.org/RaspbianForums"

    BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

    i2cdetect -y 1

    0 1 2 3 4 5 6 7 8 9 a b c d e f

    00: -- -- -- -- -- -- -- -- -- -- -- -- --

    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --

    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    70: -- -- -- -- -- -- -- --


    Mein Code:


    Mein Output:

    AIN0 = 255

    AIN1 = 255

    AIN2 = 255

    AIN3 = 255

    Meine Erwartung wäre, dass bei einen der Pins (da wo der NTC angeschlossen ist) eine andere Zahl als 255 stehen würde.

    Ich bin nach diesem Tutorial gegangen: http://www.netzmafia.de/skripten/hardw…/RasPi_I2C.html

    Ich bin noch relativ neu im Thema Raspberry Pi und Python

    Was mach ich falsch oder wo kann der Fehler liegen.:wallbash::@

    Danke schonmal im Vorraus!

    Viele Grüße

    Alex

  • Versuch zuerst mal die analogen Eingänge mit einem Kabel auf High oder Low zu ziehen. Wenn das geht, liegt das Problem nicht am code, sondern and Sensor oder Kabelei.

  • a1ex Anmerkungen zum Code: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

    Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. Dieses komische `setup()` verschwindet also ganz.

    Namen sollten nicht kryptisch abgekürzt werden. Wenn man `channel` meint, dann sollte man nicht nur `chn` schreiben. Dann kann man sich auch den Kommentar sparen der dem Leser sagt das `chn` für `channel` steht.

    In `read()` kann man ``elif`` verwenden, denn `channel` kann ja nur *einen* der Werte haben, auf die dort getestet wird. Wobei man sich das bei dem vorhandenen Muster auch sparen kann, denn das geschriebene Byte lässt sich hier aus `channel` sehr einfach berechnen.

    Die schlechte/falsche Ausnahmebehandlung sollte da erst einmal komplett raus. `Exception` allgemein mit Ausgeben und dann ignorieren zu behandeln ist hier falsch. Falls man tatsächlich an der Stelle *bestimmte* Ausnahmen tatsächlich einfach komplett ignorieren kann, was ich nicht glaube, sollte man auch nur diese Ausnahmen so behandeln und nicht einfach *alle*. Das schliesst ja auch Programmierfehler wie Tippfehler bei Namen mit ein.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Man kann das ganze auch erst mal in der shell und Multimeter testen.

    sudo /usr/sbin/i2cget -y 1 0x48 0x40

    bzw. bis 43 ...

    sudo /usr/sbin/i2cget -y 1 0x48 0x43

    fred0815 Danke für den Tipp, folgendes ist das Ergebnis:

    sudo /usr/sbin/i2cget -y 1 0x48 0x40 => 0xff

    sudo /usr/sbin/i2cget -y 1 0x48 0x41 => 0xff

    sudo /usr/sbin/i2cget -y 1 0x48 0x42 => 0xff

    sudo /usr/sbin/i2cget -y 1 0x48 0x43 => 0xff


    __blackjack__ Danke für die Kritik am Coding und das Beispiel. Hatte das Beispiel kopiert und einfach mal laufen lassen.

    Das Ergebnis ist folgende:

    AIN0 = 255

    AIN1 = 255

    AIN2 = 255

    AIN3 = 255

    AIN0 = 255

    AIN1 = 255

    AIN2 = 255

    AIN3 = 255

    ....


    RTFM (geiler Name8o -> Name ist hier auch schon direkt Programm)

    Lässt sich das ausschalten?

  • Das auto-increment ist irrelevant, wie man auch am Code sehen kann. Es sorgt lediglich dafuer, dass man nur einmal eine Channel-ID anwaehlt, und dann den und die folgenden Kanaele auslesen kann, ohne das man vorher wieder die ID angibt. Das spart ein paar Bus-Zyklen in zeitkritischen Anwendungen. Man sieht aber an deinem Code, dass du jedes mal die ID vorher explizit schreibst. Ist also egal, ob das an ist oder aus.

    Den Versuch, mal die Eingaenge auf GND zu ziehen - genau den hast du nicht gemacht, oder?

Jetzt mitmachen!

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