ESP32 + ESPHome - problem z I2C

Styczność z modułami ESPx mam od niedawna.
Przez pół roku RPi obsługiwało:

  • 8x przekaźnik
  • 2x PWM do LEDów
  • BME280 + BMP180 po I2C

Całość działała sprawnie ale był problem po zaniku zasilania, zacząłem szukać alternatywy.
Padło na ESP32 ze względu na ilość potrzebnych wyprowadzeń.
Mam problem z czujnikami po I2C, jeśli zaczną już działać to “świrują”

Piny wg. dokumentacji dla I2C - 21 i 22, zasilanie 3,3V.
Często czujniki nie są w ogóle wykrywane, albo wykrywany jest tylko jeden.
Pojawiają się wpisy w logach “Recovery: failed, SDA is held low on the bus”
Testowałem różne konfiguracje, zmniejszałem i zwiększałem częstotliwość ale bez skutku.

Wczoraj dla testu uruchomiłem czujniki na ESP8266 z tym samym kodem w ESPHome.
Od kilkunastu godzin działają bez żadnych błędów.

i2c:
  sda: D2
  scl: D1
  frequency: 50kHz
  scan: true
  
sensor:
  - platform: bme280
    temperature:
      name: "BME280_2 Temperature"
      oversampling: 8x
    pressure:
      name: "BME280_2 Pressure"
      oversampling: 8x
    humidity:
      name: "BME280_2 Humidity"
      oversampling: 8x
    address: 0x76
    iir_filter: 4x
    update_interval: 30s
  - platform: bmp085
    address: 0x77
    temperature:
      name: "BMP180_2 Temperature"
    pressure:
      name: "BMP180_2 Pressure"
    update_interval: 60s

No i teraz mam zagwozdkę, w czym problem?
Trafił się felerny ESP32 a może obsługa w ESPHome kuleje?
Macie jakieś pomysły gdzie szukać i jak zdiagnozować problem?

Podłącz sensory pojedynczo i zobacz , który przytrzymuje linie danych w niskim stanie.

1 Like

To sugeruje problem ze sprzętem, a konkretniej zwarcie/upływność do masy na SDA (czyli jak rozumiem pinie GPIO21 skoro użyłeś domyślnych pinów).
Może to też sugerować zbyt wysoką rezystancję pullup’u na tej szynie.
Generalnie jako piny I2C w ESP32 można zdefiniować każdy “normalny” pin GPIO, więc podejrzewając uszkodzenie układu możesz zdefiniować jakiś inny pin, który ma w tabelce spod linka

2x zielone OK oraz brak uwag

PS nie wiem jakiego modułu użyłeś, ale to

i2c:
  sda: D2
  scl: D1

mi pasuje tylko do takiego klona Wemosa

Czujniki sprawne, jaki pisałem z ESP8266 i RPi działają bezbłędnie.

Podepnę i sprawdzę dzisiaj jakieś inne piny niż GPIO21/22 w ESP32.

i2c:
  sda: D2
  scl: D1

Te wpisy tyczą się NodeMCU ESP8266, odpowiadają GPIO5 i GPIO4.

ESP32 ma dwa kontrolery I2C i tu może być jakiś problem, nie znam ESPHome więc tylko zgaduję, po Twojej informacji, że z ESP8266 działa OK.
Ta notatka myślę, że nie znalazła się w dokumentacji bez przyczyny:

Nie zaszkodzi pewnie dodać pull up na liniach sda, scl (jeśli nie ma ich na płytkach czujników).

Widziałem to przy tworzeniu koniga dla ESP32 ale ja zrozumiałem to tak, że jeśli korzystasz z jednej to nie musisz tego podawać.

Tak jest w opisie I2C na ESPHome:

# Example configuration entry for ESP32
i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a

a poniżej

id (Optional, ID): Manually specify the ID for this I²C bus if you need multiple I²C buses.

Co do rezystorów to ponoć te gotowe płytki(takowe posiadam), mają już je wlutowane.

Dzięki za propozycje, dam znać czy coś pomogło.

Testowałem różne konfiguracje z ESP32, zmieniałem piny na inne niż domyślne 21/22 dla I2C. Podpinałem rezystory 2.2k i 4.7k.
Kupiłem inny egzemplarz ESP32…
Nic nie pomogło, cały czas “wariowały” odczyty z BME280/BMP180.
Podejrzewam kable od czujników bo są nieekranowane, zwykłe telefoniczne.
Ewentualnie jakość wykonania tych klonów devkit-ów ESP32.
Środowisko nie jest idealne, cewki od przekaźników, zasilacz impulsowy od TV w pobliżu.

Co nie zmienia faktu, że RPi działało w tym miejscu bez zająknięcia.
Poddałem się i uruchomiłem ESP8266 z PCF8574, który obsługuje 8 przekaźników przez I2C.
Odczyty z czujników od ponad 12h bez żadnych błędów.