Raspberry Pi/Python I2C Problem

Seit gestern zickt meine selbstgebaute Wetterstation rum, die besteht aus einem Raspberry Pi mit paar Adafruit Sensoren.
Die lief jetzt seit einigen Monaten fast fehlerfrei, aber seit gestern schlägt der Verbindungsaufbau zu den Sensoren fehl.
Das bei meinem Code, aber auch wenn ich den Sample Code starte, mich irritiert aber auch dass verhalten vom I2C.

Erst einmal meine Fehlermeldung


pi3g_read register: Remote I/O error
pi3g_read data: Remote I/O error
initialize BME68X: Remote I/O error
Traceback (most recent call last):
  File "/home/pi/weather-station-iot/weather-station-python/weatherstation.py",                                                                                                                                                                                                                                              line 8, in <module>
    values = sensors.readValues()
  File "/home/pi/weather-station-iot/weather-station-python/sensors.py", line 21                                                                                                                                                                                                                                             , in readValues
    bme68x = BME68X(i2c, handleValueCallback)
  File "/home/pi/weather-station-iot/weather-station-python/sensors_bme68x.py",                                                                                                                                                                                                                                              line 22, in __init__
    self.sensor = bme68x.BME68X(0x77, 0)
SystemError: <class 'bme68x.BME68X'> returned NULL without setting an error

starte ich es direkt noch ein mal wechselt der Fehler auch mal zu


Traceback (most recent call last):
  File "/home/pi/weather-station-iot/weather-station-python/weatherstation.py", line 8, in <module>
    values = sensors.readValues()
  File "/home/pi/weather-station-iot/weather-station-python/sensors.py", line 19, in readValues
    bme280 = BME280(i2c, handleValueCallback)
  File "/home/pi/weather-station-iot/weather-station-python/sensors_bme280.py", line 12, in __init__
    self.bme280 = adafruit_bme280.Adafruit_BME280_I2C(self.i2c, 0x76)
  File "/usr/local/lib/python3.9/dist-packages/adafruit_bme280/basic.py", line 371, in __init__
    super().__init__()
  File "/usr/local/lib/python3.9/dist-packages/adafruit_bme280/basic.py", line 102, in __init__
    self._read_coefficients()
  File "/usr/local/lib/python3.9/dist-packages/adafruit_bme280/basic.py", line 283, in _read_coefficients
    coeff = self._read_register(0x88, 24)  # BME280_REGISTER_DIG_T1
  File "/usr/local/lib/python3.9/dist-packages/adafruit_bme280/basic.py", line 375, in _read_register
    i2c.write(bytes([register & 0xFF]))
  File "/usr/local/lib/python3.9/dist-packages/adafruit_bus_device/i2c_device.py", line 84, in write
    self.i2c.writeto(self.device_address, buf, start=start, end=end)
  File "/usr/local/lib/python3.9/dist-packages/busio.py", line 165, in writeto
    return self._i2c.writeto(address, memoryview(buffer)[start:end], stop=stop)
  File "/usr/local/lib/python3.9/dist-packages/adafruit_blinka/microcontroller/generic_linux/i2c.py", line 49, in writeto
    self._i2c_bus.write_bytes(address, buffer[start:end])
  File "/usr/local/lib/python3.9/dist-packages/Adafruit_PureIO/smbus.py", line 314, in write_bytes
    self._device.write(buf)
OSError: [Errno 121] Remote I/O error

Und hier ist das komische Verhalten, initial findet er auf einmal nichts und direkt danach ausgeführt findet er auf einmal die Sensoren

pi@raspberrypi:~/weather-station-iot/weather-station-python $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi:~/weather-station-iot/weather-station-python $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 77

Kannst du direkt auf der Leitung prüfen, was da los ist? (Logic analyzer oder ein anderes I2C-Device, das passiv mitlesen kann?)

Okay, ohne jetzt den Quelltext zu kennen bzw. weitere Details zu erfragen.

Ich sitze selber gerade an einigen I2C-Dingern und Arduino-Klonen. Timing - oder besser Pausen - ist irgendwie verdammt wichtig. Die Drucksensoren schmieren mir nach ein paar Minuten ab, wenn ich ein delay(1); einbau läuft es ohne Probleme.

Außerdem dürfte die aktuelle Temperatur ihr übrigens tun. Wenn es nicht einfach nur zu heiß ist, können durchaus auch die Teile selber einen Schaden bekommen haben. Ich weis halt nicht wie genau Du Deine Station gebaut hast. Zumal die Adafruit-Sensoren primär nicht für Industrie gedacht sind. Und so blöd es klingt, ich halte eine Wetterstation (auf Grund der Temperaturunterschiede Winder/Sommer, 24h Outdoor) für einen Industrieeinsatz.

ansonsten ja - das würde ich ebenfalls erstmal vorschlagen - Was genau passiert auf der Leitung?

hand, mogel

ne sowas hab ich leider nicht, meine alternativ Lösung ist es mal nen anderen Pi zu nehmen. Aber ich hab noch keine Zeit gehabt

hmpf, ich hatte es vorbereitet und irgendwie war ich abgelenkt und habs nicht reingepackt
das ist zb die Sample App die auch abraucht, mein Code ist ähnlich

Ach eigentlich halten die Sensoren ganz gut durch, ich hab die aktuelle Version irgendwie Anfang des Jahres gebaut, aber in anderer Form (mit anderen Sensoren, aber auch Adafruit) lief sie über 4 Jahre
Aber klar die sind 0 auf Industrie ausgelegt

Mich irritiert dieses Abschmieren des I2C irgendwie, wenn ihr mir nen Tipp gebt wie ich die Leitung mir angucken kann probiere ich das gern mal aus.

ich habe eine seeeehr frühe Version von https://redpitaya.com/ - ich bin mir bei den Werte sicher das sie nicht genau sind - aber es funktioniert für die meisten meiner Fälle, kann sogar I2C auslesen

theoretisch müsstest Du aber auch SDA/SCL an einem weiteren Pi/Arduino/… anklemmen können und dann auf die Pegeländerung der Pins achten bzw. die aufzeichnen

über Arduino müsste es ungefähr so gehen - PIN1 und PIN2 sind einfach nur als digitaler Eingang und nicht für I2C konfiguriert

loop() {
    delayMicroseconds(1); // I2C hat normal 100kHz - müsste passen
    int pin1 = digitalRead( PIN1 );
    int pin2 = digitalRead( PIN2 );

    // Ausgabe über Plotter
    Serial.print("SDA:");
    Serial.print(pin1);
    Serial.print("\t");
    Serial.print("SCL:"); 
    Serial.print(pin2 + 2);  // andere Zeile - über SDA
    Serial.println();
}

Ui, ich kaufe mir gern neues Spielzeug, aber die Hardware ist doch etwas zu viel :smiley:
Ich bin die Woche unterwegs aber das mit Arduino checke ich dann mal, danke

Ich würde einen Arduino einfach als Slave an die I2C Schnittstelle hängen um die Verbindung aufzuzeichnen. Aber dann müsste man wiederum erstmal in Erfahrung bringen wie die Adafruit Sensoren „korrekt“ kommunizieren.

Aber mal ganz doof gefragt:

  • Sind alle Kabel sauber getrennt? Die billigen Jumperkabel leiten auch wenn sie sich über die Isolierung berühren
  • Oder ist alles sauber gelötet?
  • Sind die Boards alle sauber von Staub und Dreck?

Wenn ich jetzt tippen müsste, davon ausgehend du hast nichts geändert hast, würde ich sagen hast du irgendwo entweder einen Leckstrom, einen defekten Pi oder mindestens einen defekten Sensor. Bei Letzterem würde ich mal mit einem Multimeter die Testpunkte testen oder die einzelnen SMD Bauteile auf Alterung oder Defekt prüfen.

Hast du mal ein anderes Netzteil probiert?

jep, keine Änderung, weil ab und zu gabs schon ne Meldung wegen zu wenig Spannung

Wochen später …
Ich hab gerade mal den Pi ausgetauscht und es läuft wieder. Was könnte am PI selbst kaputt gehen so dass es auf einmal rumzickt?

Der muss nicht zwangsläufig „kaputt“ sein. Ggf. passen die Signalpegel nicht so ganz oder das Signal ist nicht sauber. Das lässt sich aber nicht so einfach rausbekommen, dazu bräuchte man wohl ein Oszilloskop.

Naja warum sollten auf einmal die Signale kaputt sein, außer wenn mysteriöserweise der Controller den Geist aufgegeben hat

ich werde mal gucken, ich hab noch paar Sensoren rumzufliegen die werde ich mal an den „kaputten“ Pi anschließen und gucken was er dann sagt

Hast du den alten Pi denn nochmal probiert?

ne noch nicht gerade erst einmal andere Baustellen

ok wäre zu einfach, Wetterstation wieder down :see_no_evil:
jetzt muss ich Bauteil für Bauteil durchgehen

kleines Miniupdate, nachdem ich in den letzten Tagen erst den einen dann den anderen Sensor allein dran hatte und alles sauber lief, hängen jetzt wieder alle dran und es läuft wie es soll.
Mal beobachten wie es so weiter geht