El SCD30 en la Pi da error Remote I/O, ¿debo escribir I2C en Python con bit-bang?
Traducido del Türkçe por IA ·
Medimos CO2 en salas de reuniones, con una Pi 3B+ y un Sensirion SCD30. La Pi lee cada 30 segundos y envía co2, temp, rh a Hermetry. Algunas lecturas fallan con este error:
OSError: [Errno 121] Remote I/O error
File "scd30.py", line 58, in read_measurement
data = bus.read_i2c_block_data(0x61, 0x03, 18)
Entre 20 y 30 veces por hora. Se generan huecos en la gráfica. Según he leído, el SCD30 usa clock stretching y el I2C por hardware de la Pi no lo soporta bien. Estoy pensando en escribir el maestro I2C en Python con bit-bang usando RPi.GPIO. ¿Tiene sentido, lo ha hecho alguien antes? No estoy seguro de que la temporización se mantenga en Python.
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.
Traducido del Türkçe por IA ·
¿Ha probado a reducir la velocidad? Con i2c_arm_baudrate en config.txt.
Hızı düşürmeyi denediniz mi? config.txt’de i2c_arm_baudrate ile.
Traducido del Türkçe por IA ·
Lo bajé a 10000, el error bajó a 5-6 por hora pero no desapareció.
10000’e indirdim, hata saatte 5-6’ya düştü ama bitmedi.
Traducido del Türkçe por IA ·
No lo escribas tú en Python, el kernel ya tiene un I2C por software listo que hace el bit-banging y vigila correctamente el clock stretching. Justo por eso yo también pasé el SCD30 a él. /boot/config.txt (en Bookworm /boot/firmware/config.txt):
dtoverlay=i2c-gpio,bus=3,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Reinicia y comprueba con i2cdetect -y 3 que aparece 0x61. En el código, usa SMBus(3) en lugar de SMBus(1). Mueve el sensor a GPIO 23/24 y pon una resistencia pull-up de 4,7k a 3,3V (los pull-ups internos de los pines I2C del hardware no están aquí). Si tienes otros sensores, pueden quedarse en el bus 1.
Además, haz la lectura según el comando «data ready» del sensor (0x0202); si lees mientras la medición no está lista, también sale basura. Si aun así vuelve a producirse un error, reintenta una vez y omite esa lectura; para una lectura omitida no envíes nada, en Hermetry se mantiene el último valor.
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.
Traducido del Türkçe por IA ·
Lo pasé al bus 3 con un overlay y llevo 2 días sin un solo Errno 121. Se me habían olvidado las pull-ups: en el primer arranque i2cdetect salió vacío, y al poner las de 4.7k apareció. Menos mal que no me puse a escribir el bit-bang.
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ş.
Traducido del Türkçe por IA ·
¿Por qué entonces reducir la velocidad no lo solucionó por completo? Tengo curiosidad.
Hız düşürmek neden tamamen çözmedi peki? Merak ettim.
- Debes estar registrado para responder a este debate.
Únete a la conversación
Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

