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.