SCD30 am Pi meldet Remote-I/O-Fehler, sollte ich I2C in Python per Bit-Banging schreiben?
Von Türkçe mit KI übersetzt ·
Wir messen CO2 für Besprechungsräume, Pi 3B+ und Sensirion SCD30. Der Pi liest alle 30 Sekunden und sendet co2, temp, rh an Hermetry. Ein Teil der Messwerte schlägt mit diesem Fehler fehl:
OSError: [Errno 121] Remote I/O error
File "scd30.py", line 58, in read_measurement
data = bus.read_i2c_block_data(0x61, 0x03, 18)
20-30 Mal pro Stunde. Im Diagramm entstehen Lücken. Soweit ich gelesen habe, nutzt der SCD30 Clock Stretching, und die Hardware-I2C des Pi unterstützt das nicht richtig. Ich überlege, den I2C-Master in Python mit RPi.GPIO per Bit-Banging zu schreiben. Ist das sinnvoll, hat das schon jemand gemacht? Ich bin mir nicht sicher, ob das Timing in Python hält.
Toplantı odaları için CO2 ölçüyoruz, Pi 3B+ ve Sensirion SCD30. Pi her 30 saniyede okuyup Hermetry’ye co2, temp, rh gönderiyor. Okumaların bir kısmı şu hatayla patlıyor:
OSError: [Errno 121] Remote I/O error
File "scd30.py", line 58, in read_measurement
data = bus.read_i2c_block_data(0x61, 0x03, 18)
Saatte 20-30 kez. Grafikte boşluklar oluyor. Okuduğum kadarıyla SCD30 clock stretching yapıyor ve Pi’nin donanım I2C’si bunu düzgün desteklemiyor. Düşündüğüm şey RPi.GPIO ile I2C master’ı Python’da bit-bang olarak yazmak. Mantıklı mı, daha önce yapan var mı? Zamanlama Python’da tutar mı emin değilim.
Von Türkçe mit KI übersetzt ·
Haben Sie versucht, die Geschwindigkeit zu reduzieren? Mit i2c_arm_baudrate in config.txt.
Hızı düşürmeyi denediniz mi? config.txt’de i2c_arm_baudrate ile.
Von Türkçe mit KI übersetzt ·
Ich habe es auf 10000 gesenkt, der Fehler ist auf 5-6 pro Stunde gesunken, aber nicht verschwunden.
10000’e indirdim, hata saatte 5-6’ya düştü ama bitmedi.
Von Türkçe mit KI übersetzt ·
Schreib das nicht selbst in Python, der Kernel hat bereits ein fertiges Software-I2C, das das Bit-Banging übernimmt und Clock Stretching korrekt überwacht. Genau deshalb habe ich den SCD30 darauf umgestellt. /boot/config.txt (bei Bookworm /boot/firmware/config.txt):
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Neu starten und mit i2cdetect -y 3 prüfen, ob 0x61 erscheint. Im Code SMBus(3) statt SMBus(1) verwenden. Den Sensor an GPIO 23/24 anschließen und einen 4,7k-Pull-up nach 3,3V setzen (die internen Pull-ups der Hardware-I2C-Pins sind hier nicht vorhanden). Falls du andere Sensoren hast, können diese auf Bus 1 bleiben.
Lies außerdem gemäß dem „Data Ready“-Befehl des Sensors (0x0202) aus; liest du, während die Messung nicht bereit ist, kommt auch hier Unsinn heraus. Tritt zwischendurch wieder ein Fehler auf, wiederhole die Leseoperation einmal und überspringe diese Ablesung; für eine übersprungene Ablesung sende nichts, in Hermetry bleibt der letzte Wert erhalten.
Python’da kendin yazma, çekirdekte zaten hazır bir yazılım I2C var, bit-bang’i o yapıyor ve clock stretching’i doğru izliyor. SCD30’u ben de tam bu yüzden ona taşıdım. /boot/config.txt (Bookworm’da /boot/firmware/config.txt):
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Yeniden başlat, i2cdetect -y 3 ile 0x61’i gör. Kodda SMBus(1) yerine SMBus(3). Sensörü GPIO 23/24’e taşı, 3.3V’a 4.7k pull-up koy (donanım I2C pinlerindeki dahili pull-up’lar burada yok). Diğer sensörlerin varsa onlar bus 1’de kalabilir.
Bir de okumayı sensörün „data ready“ komutuna (0x0202) göre yap, ölçüm hazır değilken okursan da saçmalıyor. Arada bir hata yine olursa bir kez tekrar dene, o okumayı atla; boş geçen okuma için bir şey gönderme, Hermetry’de son değer kalır.
Von Türkçe mit KI übersetzt ·
Mit Overlay auf Bus 3 umgestellt, seit 2 Tagen kein einziger Errno 121 mehr. Die Pull-ups hatte ich vergessen, beim ersten Start kam i2cdetect leer zurück, nachdem ich die 4.7k eingesetzt habe, wurde er angezeigt. Gut, dass ich mich nicht an das Bit-Banging gewagt habe.
Overlay ile bus 3’e aldım, 2 gündür tek Errno 121 yok. Pull-up’ları unutmuştum, ilk açılışta i2cdetect boş geldi, 4.7k’ları takınca göründü. Bit-bang yazmaya girişmediğim iyi olmuş.
Von Türkçe mit KI übersetzt ·
Warum hat die Reduzierung der Geschwindigkeit das Problem dann nicht vollständig gelöst? Ich bin neugierig.
Hız düşürmek neden tamamen çözmedi peki? Merak ettim.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

