ESPHOME esp32 z MCP23017

Dodałem kolejny esp32 do HA
Podłączyłem moduł MCP23017 do ESP32 z esphome
i gdy czujnik otwarcia jest zwarty ciągle jest powtarzające:

[esp-idf:000]	
E (963644) i2c.master: I2C bus is still busy but software timeout detected

co zrobić aby ten komunikat nie wyświetlał się w nieskończoność przy zwartym czujniku?

Szklane kule kiepsko działają, może używasz PA7 lub PB7 jako wejścia?
Może za słabe pullupy na magistrali?
(problem z zasilaniem też jest prawdopodobny)

Tak PA7 podlaczylem jako pierwsze aby testowac i wlasnie na nim tak się dzieje

Dokumentacja producenta tego scalaczka zabrania użytku w ten sposób - został wykryty błąd po wielu latach produkcji, więc wydano jedynie erratę do dokumentacji, że nie wolno używać ani PA7, ani PB7 jako wejść…
https://support.microchip.com/s/article/GPA7---GPB7-Cannot-Be-Used-as-Inputs-In-MCP23017
(konstrukcji nie zmieniono, dalej jest wadliwa)

Prawdopodobnie nikt nie zgłosił issue do komponentu mcp23017 w ESPHome
(a nieaktualną dokumentację tych wypustów Microchipa w ESPHome zauważyłem przypadkiem przy okazji innego wątku na ten temat i chyba dopiero jakoś w grudniu została wprowadzona poprawka linków do not katalogowych do dokumentacji komponentów mcp230xx; jakkolwiek skoro nie mam sprzętu z MCP23017 to nie będę zgłaszał issue do samego komponentu, bo nawet nie mam jak tego sprawdzić).

Na innych pinach taki sam błąd
Napisales że slabe pullupy na magistrali
Czy pullup na magistrali nie jest domyslny?
Jesli to jak właczyć programowo bo na esp32 chyba się da?

Nie na wszystkich GPIO, podaj pełen YAML i dokładny model dla płytki z ESP.

Akurat pechowo zacząłeś konstruować zaczynając od nieczytania dokumentacji… taki zbieg okoliczności, bo o tych PA7/PB7 jest na 1 stronie datasheeta wręcz w pierwszych linijkach.

Programowo wewnętrzny pullup oczywiście się da i włączyć i wyłączyć (zakładam, że skoro cokolwiek działa to używasz piny które w ogóle mają pullup - jeśli wziąłeś jakieś domyślne w danym MCU dla I2C to mają).

taki przykład rozbudowanej jawnej konfiguracji tu aktywowane są wbudowane pullupy (tylko nie wprowadzaj takich zmian póki nie wrzucisz swojego YAMLa - normalnie domyślne opcje nie wymagają jawnej deklaracji)

i2c:
  - id: bus_a
    sda: 8
    scl: 9
    scan: true
    sda_pullup_enabled: true
    scl_pullup_enabled: true
    frequency: 50000.0

Ale jeśli jest za słaby (a konstrukcyjnie w ESP32 wbudowane pullupy są słabsze niż w ESP8266) to daj rezystory, a wyłącz pullupy wbudowane w MCU (“programowe”).

Przy okazji twojego wątku w sprawie PA7/PB7 skrobnąłem komentarz w jakimś pokrewnym issue, gdzie widziałem programistów ESPHome, więc już wiem, że problemy mogą wynikać też z innych przyczyn (jakaś aktualizacja mniej więcej sprzed pół roku była źródłem problemów i issue jest nadal otwarte, nie kopalem po innych issues jakoś intensywnie, bo mnie to nie dotyczy = u mnie wszystko działa, nawet tam gdzie magistralę I2C wykorzystuję bardzo intensywnie, ale to jest nie na MCU ESP, jakkolwiek nie używam akurat MCP23017 wcale… ani z ESP ani z innymi MCU więc nie sprawdzę organoleptycznie).


A tak ogólnie to podstawowe przyczyny problemów z I2C to wadliwe zasilanie (brak kondensatorów odsprzęgających, niestabilne lub za niskie napięcie), za długie przewody magistrali (o zbyt dużej pojemności), wybrana za wysoka częstotliwość szyny.

Niby jest, ale daj kompletny YAML to zobaczę co tam masz.

Zrób też jakieś fotki sprzętu, może coś się komuś rzuci w oko.

YAML

# Obsługa magistrali I2C

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true
  id: bus_a

mcp23017:
  - id: 'mcp23017_hub'
    address: 0x20

# Individual outputs
switch:
  - platform: gpio
    name: "MCP23017 Pin A0"
    pin:
      mcp23xxx: mcp23017_hub
      # Use pin A0
      number: 0
      mode:
        output: true
      inverted: false

# Individual inputs
binary_sensor:
  - platform: gpio
    name: "MCP23017 Pin B6"
    pin:
      mcp23xxx: mcp23017_hub
      # Use pin B6
      number: 14
      # One of INPUT or INPUT_PULLUP
      mode:
        input: true
        pullup: true
      inverted: false

To NIE jest kompletny YAML - chcę całkowicie kompletny, bo zamierzałem wrzucić u siebie i to skompilować (ale już czas chyba minął nie mam więcej wolnego)

To co brakuje to ja nie pisałem to już było ale oki załączam cały

esphome:
  name: garaz
  friendly_name: garaz

esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "mzTl2rHmPkd/3mQHr2jOT1wmarB6wVa8Z08uD1IzCc8="

ota:
  - platform: esphome
    password: "6f5f4727e8d19a1f003eaf0c5421718f"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Garaz Fallback Hotspot"
    password: "111111222222"


# interfejs web modułu
web_server:
  port: 80
# Synchronizacja czasu z Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time 

# Obsługa magistrali I2C

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true
  id: bus_a

mcp23017:
  - id: 'mcp23017_hub'
    address: 0x20

# Individual outputs
switch:
  - platform: gpio
    name: "MCP23017 Pin A0"
    pin:
      mcp23xxx: mcp23017_hub
      # Use pin A0
      number: 0
      mode:
        output: true
      inverted: false

# Individual inputs
binary_sensor:
  - platform: gpio
    name: "MCP23017 Pin B6"
    pin:
      mcp23xxx: mcp23017_hub
      # Use pin B6
      number: 14
      # One of INPUT or INPUT_PULLUP
      mode:
        input: true
        pullup: true
      inverted: false




  

captive_portal:
    

mcp takie mam

Zamień sobie framework na arduino.
Jeśli nie masz zewnętrznych rezystorów to zmien sobie kod na taki:

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true
  id: bus_a
  sda_pullup_enabled: true
  scl_pullup_enabled: true

Tu są rezystory

@muchac35 sprawdź sobie taki kod i na początek ustaw GPIO dla I2C na 21, 22

captive_portal:
  
# KONFIGURACJA I2C 
i2c:
   - id: bus_a
     sda: 21
     scl: 22
     scan: true
     frequency: 400kHz    

# KONFIGURACJA MCP23017
mcp23017:
  - id: 'mcp23017_hub_1' 
    address: 0x20
    i2c_id: bus_a 
	
# ŚWIATŁA- PRZEKAŹNIKI
light:
  - platform: binary
    name: "LIGHT-01"
    id: light_01
    output: relay_01

  - platform: binary
    name: "LIGHT-02"
    id: light_02
    output: relay_02

  - platform: binary
    name: "LIGHT-03"
    id: light_03
    output: relay_03

  - platform: binary
    name: "LIGHT-04"
    id: light_04
    output: relay_04

#KONFIGURACJA WYJŚĆ 
output:
  - platform: gpio
    id: relay_01
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 0
      mode: OUTPUT
      inverted: true
   
  - platform: gpio  
    id: relay_02
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 1
      mode: OUTPUT
      inverted: true

  - platform: gpio
    id: relay_03
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 2
      mode: OUTPUT
      inverted: true
  - platform: gpio
    id: relay_04
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 3
      mode: OUTPUT
      inverted: true   

# KONFIGURACJA WEJŚĆ
binary_sensor:
  - platform: gpio
    name: "INPUT-01"
    id: input_01
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 8
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
    - delayed_on_off: 50ms
  
  - platform: gpio
    name: "INPUT-02"
    id: input_02
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 9
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
    - delayed_on_off: 50ms
      
  - platform: gpio
    name: "INPUT-03"
    id: input_03
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 10
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
    - delayed_on_off: 50ms
  
  - platform: gpio
    name: "INPUT-04"
    id: input_04
    pin:
      mcp23xxx: mcp23017_hub_1
      number: 12
      mode:
        input: true
        pullup: true
      inverted: true
    filters:
    - delayed_on_off: 50ms
   
1 polubienie

To jest schemat tej płytki, producent klona dał inną wartość jednego z pullupów

ten 1uF kondensatora na zasilaniu to takie sobie rozwiązanie (szczególnie że przewody nie są przylutowane)

Jak zwykle zgryźliwie skomentuję fragmentaryczność - tym razem zdjęć - nie wywnioskujemy z tego czy MCU masz 5cm od ekspandera, czy 5m…

@angler twój kod jest prawidłowy, jednak użyto w przypadku tego konkretnie MCU strapping pin, więc jest to dyskusyjne czy jest OK czy nie

YAML przed kompilacją jest parsowany i są w nim wykonywane podstawienia do takiej wersji jakby tam było wszystko podane jawnie i akurat definicja magistrali zostaje sparsowana z
kodu od @muchac35

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true
  id: bus_a

do realnie kompilowanego czegoś takiego

i2c:
  - sda: 4
    scl: 5
    scan: true
    id: bus_a
    sda_pullup_enabled: true
    scl_pullup_enabled: true
    frequency: 50000.0

Uważam, że “z palcem w tyłku” można podnieść częstotliwość magistrali do 100kHz (lub nawet 400kHz, ale im wyższa częstotliwość tym mocniejsze pullupy muszą być, więc te 100kHz brzmi rozsądnie - moje ulepy działają na 400kHz, ale używam modułów w których każdy producent dorzucił swoje) , ba MCP23017 jest w stanie pracować też z zegarem 1.7MHz (ale tu to bym tak nie szarżował, bo sam MCU raczej nie da rady z takim zegarem).

Tak odnośnie wartości samych pullpuów to zarówno 10k jak i 8k2 to moim zdaniem by się nadawały do logiki 5V, spokojnie można zostawić włączone pullupy MCU (w zasadzie dla logiki 3V3 nie widzę problemu w zejściu z rezystancją wypadkową do około 2k, najniższa dopuszczalna to bodajże 1k2)

TU UWAGA - sugeruję piny które zaproponował @isom1266 (albo jakieś inne nie mające żadnych ograniczeń, bo akurat GPIO5 dla ESP32 ma)

Wgrałem twój kod i myślałem że jest oki ale po paru minytach pojawia sie to

00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:54	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> ON
00:02:55	[D]	[binary_sensor:047]	
'MCP23017 Pin B6' >> OFF
00:02:55	[D]	[binary_sensor:047]	

po zrestartowaniu jest chwilkę oki i znowu
dopiszę że dodałem rezystory 4.7 na pinach 21 i 22
kabelki pomiędzy esp a mcp to około 10 cm

Gdybyś wgrał to co zaproponowałem to logi byłyby podobne do tego

[07:48:12.317][C][mdns:177]:   Hostname: mcp23017
[07:48:40.137][D][wifi:2112]: Roam scan (-75 dBm, attempt 1/3)
[07:48:45.830][D][binary_sensor:047]: 'INPUT-01' >> ON
[07:48:48.570][D][binary_sensor:047]: 'INPUT-01' >> OFF
[07:53:40.156][D][wifi:2112]: Roam scan (-76 dBm, attempt 2/3)
[07:55:15.393][D][binary_sensor:047]: 'INPUT-01' >> ON
[07:55:16.942][D][binary_sensor:047]: 'INPUT-01' >> OFF
[07:56:50.789][D][binary_sensor:047]: 'INPUT-02' >> ON
[07:56:50.843][D][binary_sensor:047]: 'INPUT-02' >> OFF

Rezystory, które dołożyłeś powinny dać wypadkowo około 3k, tylko pytanie jak je podłączyłeś? Ostatnia kwestia, co masz podłączone do wejścia B6 ?

A przypadkiem nie zasilasz modułu z 5V? :thinking: …albo osobnego zasilacza

@isom1266
Rezystory 4.7 polaczylem pomiedzy 3.3v a gpio21 i drugi pomiędzy 3.3v a gpio22
Obecnie do B6 jest połączony 10cm kabelek ktorym recznie stykam z GND i testuje w ten sposób.


@RobinI30
Moduł esp32 zasilałem z usb komputera ale teraz z ładowarki od telefonu 5V
Bo docelowo chciałbym wlasnie zasilać to zasilaczem od telefonu.


Z Teojego kodu wgralem tulko część odpowiadajacą za konfigurację i2c konfigurację pinow pozostawilem moją tzn mam tylko konfugurację 2 pinow AO i B6

Co podłaczyłeś do VCC MCP… 3.3 czy 5V?
Po objawach mi to wygląda na 5V😉

1 polubienie

@muchac35 kod różni się również w części odpowiedzialnej za wejścia.
MCP powinieneś zasilić z 3,3 V dostępnego na esp32
Rezystory 4,7 mogą być, ale bez nich też powinno być ok.
Taki efekt mam na identycznym module ( patrz na czasy w logach)

Tak na przyszlość @muchac35 nie pisz posta pod postem jest opcja znaczenia użytkownika przy pomocy @ tak to tylko zaśmiecasz w temacie możesz także edytować post.