ESP8266 rozszerzenie I2C

Chce podłączyć kilka modułów BME280 pod ESP8266. Do tego używam Multipleksera I2C TCA9548A.
Ale mam problem z poprawną konfiguracją. Prosze o sprawdzenie kodu - na razie na dwa czujniki BME280. Obecna konfiguracja zczytuje tylko z jednego czujnika.

captive_portal:
    
i2c:
  sda: 4
  scl: 5
  scan: true
  id: i2c_a

tca9548a:
  - address: 0x70
    id: multiplex0
    i2c_id: i2c_a
    channels:
      - bus_id: multiplex0channel0
        channel: 0
      - bus_id: multiplex0channel1
        channel: 1
      - bus_id: multiplex0channel2
        channel: 2

sensor:
  - platform: bme280
    address: 0x76
    i2c_id: multiplex0channel1
    temperature:
      name: "BME280 Temperature"
      id: bme280_temperature
    pressure:
      name: "BME280 Pressure"
      id: bme280_pressure
    humidity:
      name: "BME280 Relative Humidity"
      id: bme280_humidity
    
    update_interval: 15s

  - platform: bme280
    address: 0x77
    i2c_id: multiplex0channel2
    temperature:
      name: "BME280 Temperature1"
      id: bme280_temperature1
    pressure:
      name: "BME280 Pressure1"
      id: bme280_pressure1
    humidity:
      name: "BME280 Relative Humidity1"
      id: bme280_humidity1
    
    update_interval: 15s  

…“Twój początkowy kod jest poprawny i powinien działać poprawnie, aby odczytać dane z dwóch czujników BME280, z których każdy jest podłączony do odpowiedniego kanału multipleksera TCA9548A. Jeśli czujniki nie działają poprawnie, może to wynikać z innych problemów sprzętowych lub konfiguracyjnych. W takim przypadku warto sprawdzić podłączenia, adresy I2C, ustawienia multiplexera i upewnić się, że urządzenia są poprawnie skonfigurowane w systemie Home Assistant.”

Tak twierdzi GPT gdzie sam zaproponował zmiany w kodzie - tyle że nic nie wniosły.

Ja nie jestem GPT i widzę jakieś totalne niekonsekwencje - adresy poszczególnych BME są różne (trzeba się wysilić by to uzyskać)

  1. Jaki jest zatem sens używania multipleksera, skoro oba mogą być na tej samej szynie o ile są skonfigurowane sprzętowo na różne adresy?
    (oba przecież mogą być na tej samej - multiplekser dla 2 czujników nie ma sensu)
  2. Czy faktycznie mają różne adresy?
    (domyślna konfiguracja typowych modułów to 0x76 i jeśli nie były one zmieniane to taki należy użyć na każdej magistrali)

Skąd zatem wziąć adresy poszczególnych BME?
Ustawiałem również oba na 0x76 i też bez rezultatu.

Producent czujnika daje taką możliwośc wyboru adresu. Jednak producent modułu w większości przypadków ustawia jeden sztywny adres.
Ze względu na rozmiary druku nawet cięcie ścieżek bywa niemożliwe. Musisz zaopatrzyć się w taki moduł ,który to umożliwia.
Wyboru adresu dokonuje się sprzetowo poprzez podłączanie pinu/pinów np. do GND.
Takie info znajdziesz w danyćh producenta samego czujnika. Na Twojej płytce nie ma jakiś padów z możliwością przecięcia lub zlutowania - czego co wygląda jak “zworka” ?

…edit

@lukasx160
Po pierwsze to projektant PCB decyduje jaki adres jest defaultem w przypadku danego modułu.
Jak będę miał trochę więcej czasu to może się nieco rozwinę w temacie zmiany adresu.

Po drugie jeśli podepniesz na krótko (pojedynczo, by nie było konfliktów między nimi) bezpośrednio do I2C (nie używałem dotąd multiplekserów TCA9548A, więc nie wiem, ale na logikę też powinna być opcja skanowania dostępna) to możesz ustawić skanowanie szyny, i zobaczysz dzięki temu w logu przy zimnym rozruchu lub po flaszowaniu adres wykrytego modułu.

Przykładowy konfig (tu akurat z MCU, który ma 2 kontrolery I2C, ale pokazałem tylko jeden) - chodzi o opcję scan: true

i2c:
  - id: bus_a
    sda: SDA #4
    scl: SCL #5
    scan: true

Po trzecie - trafiają się wadliwe moduły, warto sprawdzić, choćby tak,

choć sugeruję podpięcie “na krótko” (tj. bez multipleksera) - im mniej elementów tym prostsza diagnostyka
Gdy już będziesz miał oba moduły sprawdzone i będziesz znał ich adresy czy wręcz je skonfigurujesz, to przejdziesz do użycia multipleksera.

Sprawa czwarta - płytki z BME280 i BMP280 wyglądają identycznie, natomiast same IC sensorów różnią się minimalnie (BME jest bardziej kwadratowy).


edit - miałem chwilę

Tak wracając do drugiego zagadnienia - na module ze zdjęcia link powyżej (ten do opisu sprawdzenia zwarcia) widać trzy prostokątne pola lutownicze - one służą do konfiguracji adresu (nie wiem czy muszę opisywać jak to użyć, ale jest tam też ścieżka dedykowana do przecięcia, a mostek się robi między 2 sąsiednimi polami - domyślnie jest cieniutka ścieżka między 2 polami, więc nie musisz go robić, ale przy zmianie adresu tniesz tą ścieżkę i lutujesz zworę na polach fabrycznie nie zwartych, a jeśli chcesz przywrócić konfigurację, to przelutowujesz zworę tak by przywrócić połączenie fabryczne), ta ścieżka “bezczelnie” bezpośrednio łączy SDO z masą - stąd domyślny adres takiego wykonania 0x76
Na schemacie poniżej (to zapewne schemat innego wykonania, ale schemat z grubsza pasuje do typowe chińskiej płytki 4-pinowej) te zworki opisano jako S1 (SW SPDT)

W typowych chińskich modułach PCB z 6 pinami jest po prostu wyprowadzone SDO i fabrycznie ściągnięte do masy rezystorem 10k - stąd 0x76, więc ścieżek się nie tnie, tylko podpina SDO do zasilania (w celu zmiany adresu, ten pulldown w rywalizacji z bezpośrednim połączeniem z Vcc nie ma znaczenia, natomiast prąd zużywany dodatkowo z powodu jego istnienia wzrośnie zaledwie o 0,33mA).

Rozumiem że nie jest możliwe podpiąć np 5 takich czujników pod mulitplekser. Bo adres można zmienić ewentualnie na 0x77.??

Nie podepniesz pięciu pod jedna magistralę I2C. Możesz uzyskać tyko dwa różne adresy na BME, więc tylko dwa. W przypadku pięciu, będziesz potrzebował 3 magistral. Jeśli kontroler nie posiada tylu, to multiplekser. Pamiętaj również o ograniczeniach długości magistrali I2C.

Pod multiplekser można podpiąć tyle czujników o tych samych adresach iloma szynami on dysponuje.
TCA9548A ma 8 szyn I2C więc 8.
Ale masz 2 adresy do wyboru, więc idąc na maksa (połowa o zmienionym adresie) będzie 16.

Dobra już widze gdzie popełniłem błąd. Normalnie czujniki BMP280 można podpiąć pod ten multiplekser z adresem 0x76 i wszystko chodzi. Docelowo chciałem podpiąć kilka czujników pod multiplekser., ale do testów wziąłem dwa. Okazało się że jeden z czujników który miałem - właśnie ten na którym przypadkowo testowałem, identycznie wygląda i ma oznaczenie HW-611 ep280. Widoczenie chińczyk przysłał mi nie ten co zamawiałem.

Płytka jest uniwersalna pod BMP280 i BME280, one są pin w pin zgodne, ale na pierwszy rzut oka różnią się obudową (tylko trzeba o tym wiedzieć).

Tu masz przykład oferty, która eksponuje różnice

ale generalnie łatwo poznać po cenie - BMP280 są sporo tańsze od BME280.

Jeśli się Chińczykowi chciało, to czasem jest oznaczenie farbą/pisakiem na białych polach █ czyli na jednym z █E/P█
Tu masz przykład ładnie oznaczonego BMP280

HW-611 to jest 6-pinowa wersja PCB.

Niezwiązane z tematem, ale gdzieś widziałem dyskusję na temat długości połączeń I2C. Ten multiplexer bez problemu sobie radzi z czujnikami podpiętymi przewodem telefonicznym (płaskim) na odległości 10m w środowisku o dość dużych zakłóceniach zewnętrznych (odcinki równolegle z przewodami siłowymi do falowników PV). Bez kombinowania z zegarami w ESPHome. Żyły sygnałowe na zewnątrz, zasilanie - żyły wewnętrzne, zasilanie TCA - 5V.

1 Like