Aziz Bench

Endereços I²C e verificador de conflitos

Adicione os chips e módulos do seu barramento: o mapa mostra quais endereços eles usam, aponta os que conflitam e diz como mudar um deles. Mais abaixo, os resistores de pull-up para a sua velocidade e a sua fiação.

Conflitos de endereço
1
em 0x68
Dispositivos
4
Endereços em uso
3
Endereços livres
109
Mapa de endereços em uso conflito reservado
0123456789ABCDEF
00000102030405060708090A0B0C0D0E0F
10101112131415161718191A1B1C1D1E1F
20202122232425262728292A2B2C2D2E2F
30303132333435363738393A3B3C3D3E3F
40404142434445464748494A4B4C4D4E4F
50505152535455565758595A5B5C5D5E5F
60606162636465666768696A6B6C6D6E6F
70707172737475767778797A7B7C7D7E7F
Dispositivos no seu barramento
    Resistores de pull-up
    Tensão do barramento
    Velocidade
    pF

    Some a capacitância de cada pino de chip no barramento (no máximo 10 pF cada, pela especificação I²C) e a dos fios.

    Ω

    Muitos módulos trazem os seus, geralmente de 4,7 kΩ ou 10 kΩ. Liste-os, por exemplo 10k, 10k, 4k7: eles se somam em paralelo.

    Conflitos e como resolvê-los

    Resistores de pull-up

    Como definir cada endereço

    Como funcionam os endereços I²C

    Cada dispositivo num barramento I²C responde a um endereço de 7 bits, de 0x08 a 0x77. Muitos chips deixam você escolher entre dois, quatro ou oito endereços ligando pinos ao GND ou à alimentação; outros têm um único endereço fixo. Dois dispositivos no mesmo endereço respondem ao mesmo tempo, e as leituras dos dois viram lixo.

    Alguns datasheets dão valores de 8 bits, ou seja, o endereço deslocado para a esquerda com o bit de leitura/escrita acrescentado: o VL53L0X aparece como 0x52/0x53, o BMP180 como 0xEE/0xEF. Desloque um bit para a direita para obter o endereço de 7 bits que bibliotecas e scanners usam: 0x29 e 0x77.

    Endereços reservados

    Endereço
    0x00Chamada geral (escrita) ou byte de START (leitura)
    0x01Endereço CBUS
    0x02Reservado para outro formato de barramento
    0x03Reservado para uso futuro
    0x04–0x07Código de controlador no modo Hs
    0x78–0x7BEndereçamento de 10 bits
    0x7C–0x7FDevice ID

    Da especificação do barramento I²C da NXP (UM10204). Use só os endereços de 0x08 a 0x77 para os seus dispositivos.

    Quando dois dispositivos conflitam

    Primeiro procure um pino de endereço: mudar o endereço de um dispositivo é a solução mais limpa. Se os dois endereços forem fixos, como num relógio DS3231 e num DS1307, ou se você precisar de dois sensores iguais sem pino de endereço, use um multiplexador TCA9548A, que dá oito ramos separados atrás de um único endereço, ou coloque o segundo dispositivo em outro barramento I²C. O ESP32, o ESP32-S3 e o RP2040 têm dois controladores I²C; o ESP32-C3 tem um.

    Como descobrir o que está no barramento

    No ESPHome, o componente i2c varre o barramento na inicialização e lista no log os endereços que encontra. No Arduino, o clássico sketch I2C scanner faz o mesmo pelo monitor serial. Se um dispositivo não aparecer, confira a alimentação, SDA e SCL, os pull-ups e o pino de endereço dele.

    Resistores de pull-up

    As linhas I²C são open-drain (dreno aberto): os chips só as puxam para baixo, e resistores as puxam de volta para cima. Com um pull-up forte demais, os chips não conseguem puxar a linha para baixo o suficiente; se for fraco demais, a linha sobe devagar demais para a velocidade. A especificação dá os dois limites.

    Rmin = (VDD − 0,4 V) ÷ 3 mA        (VDD > 2 V; 20 mA em 1 MHz)
    Rmax = tr ÷ (0,8473 × Cbus)
    tr = 1000 ns em 100 kHz, 300 ns em 400 kHz, 120 ns em 1 MHz

    Todos os dispositivos da lista

    Endereço
    QMC5883Lmagnetômetro de 3 eixos0x0Dendereço fixo
    VEML6075sensor de luz UVA/UVB0x10endereço fixo
    LIS2DH12acelerômetro de 3 eixos0x18, 0x19SA0: GND → 0x18 · VDD → 0x19
    MCP9808sensor de temperatura digital0x18–0x1FA2 A1 A0 → 0x18–0x1F
    MMA8451Qacelerômetro de 3 eixos0x1C, 0x1DSA0: GND → 0x1C · VDD → 0x1D
    ADXL345acelerômetro de 3 eixos0x1D, 0x53ALT ADDRESS: GND → 0x53 · VDD → 0x1D
    MCP23008expansor de E/S de 8 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    MCP23017expansor de E/S de 16 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8574expansor de E/S de 8 bits (módulos I²C para LCD)0x20–0x27A2 A1 A0 → 0x20–0x27
    PCF8575expansor de E/S de 16 bits0x20–0x27A2 A1 A0 → 0x20–0x27
    TCA9555expansor de E/S de 16 bits com interrupção0x20–0x27A2 A1 A0 → 0x20–0x27
    PN532controlador NFC/RFID (modo I²C)0x24endereço fixo
    BNO055sensor de orientação absoluta de 9 eixos com fusão de sensores integrada0x28, 0x29COM3: GND → 0x28 · VDD → 0x29
    TCS34725sensor de cor RGB0x29endereço fixo
    VL53L0Xsensor de distância por tempo de voo (ToF)0x29
    MLX90640câmera térmica 32×240x33
    AXP192CI de gerenciamento de energia (PMIC)0x34endereço fixo
    AXP2101CI de gerenciamento de energia (PMIC)0x34endereço fixo
    PCF8574Aexpansor de E/S de 8 bits, faixa de endereços alternativa0x38–0x3FA2 A1 A0 → 0x38–0x3F
    VEML6070sensor de luz UV0x38endereço fixo
    APDS-9960sensor de gestos, proximidade, luz ambiente e cor RGB0x39endereço fixo
    SH1106controlador de display OLED 132×640x3C, 0x3DSA0: GND → 0x3C · VDD → 0x3D
    SSD1306controlador de display OLED 128×64 / 128×320x3C, 0x3DSA0 (D/C#): GND → 0x3C · VDD → 0x3D
    SX1509expansor de E/S de 16 canais com driver de LED e controle de teclado0x3E, 0x3F, 0x70, 0x71ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71
    HDC1080sensor de temperatura e umidade0x40endereço fixo
    INA219monitor de corrente, tensão e potência0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA226monitor de corrente, tensão e potência0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA260monitor de corrente, tensão e potência com shunt integrado0x40–0x4FA1, A0: GND · VS · SDA · SCL → 0x40–0x4F
    INA3221monitor de corrente e tensão de 3 canais0x40, 0x41, 0x42, 0x43A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43
    PCA9685driver PWM / servo de 16 canais, 12 bits0x40–0x77A5…A0 → 0x40–0x77 (0x70 = All Call)
    Si7021sensor de temperatura e umidade0x40endereço fixo
    OPT3001sensor de luz ambiente0x44, 0x45, 0x46, 0x47ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47
    SHT30 / SHT31 / SHT35sensor de temperatura e umidade0x44, 0x45ADDR: GND → 0x44 · VDD → 0x45
    SHT40 / SHT41 / SHT43 / SHT45 (SHT4x)sensor de temperatura e umidade0x44, 0x45, 0x46
    ADS1015ADC de 12 bits e 4 canais0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS1115ADC de 16 bits e 4 canais0x48, 0x49, 0x4A, 0x4BADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B
    ADS7830ADC de 8 bits e 8 canais0x48, 0x49, 0x4A, 0x4BA1 A0 → 0x48–0x4B
    LM75Bsensor de temperatura digital / termostato0x48–0x4FA2 A1 A0 → 0x48–0x4F
    PCF8591ADC de 8 bits e 4 canais + 1 DAC0x48–0x4FA2 A1 A0 → 0x48–0x4F
    TMP102sensor de temperatura digital0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    TMP117sensor de temperatura digital de alta precisão0x48, 0x49, 0x4A, 0x4BADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B
    24LC256 / 24AA256 / 24FC256EEPROM I²C de 256 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    AT24C32EEPROM I²C de 32 Kbit0x50–0x57A2 A1 A0 → 0x50–0x57
    PCF85063Arelógio de tempo real (RTC)0x51endereço fixo
    ENS160sensor de óxido metálico para qualidade do ar (TVOC/eCO₂/AQI)0x52, 0x53ADDR: GND → 0x52 · VDD → 0x53
    BQ27441-G1medidor de carga para uma célula Li-ion0x55endereço fixo
    MAX30100oxímetro de pulso e sensor de frequência cardíaca0x57endereço fixo
    SGP30sensor de gás VOC e eCO₂0x58endereço fixo
    SGP40sensor de gás, índice VOC0x59endereço fixo
    SGP41sensor de gás, índices VOC e NOx0x59endereço fixo
    CCS811sensor de gás eCO₂ / TVOC0x5A, 0x5BADDR: GND → 0x5A · VDD → 0x5B
    MLX90614termômetro infravermelho sem contato0x5A
    MPR121controlador de toque capacitivo de 12 canais0x5A, 0x5B, 0x5C, 0x5DADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D
    LPS22HBsensor de pressão barométrica0x5C, 0x5DSA0: GND → 0x5C · VDD → 0x5D
    GT911controlador de tela touch capacitiva de 5 pontos0x5D, 0x14
    MCP4725DAC de 12 bits com EEPROM0x60–0x67A0 → 0x60/0x61 (MCP4725A0)
    MCP4728DAC de 12 bits e 4 canais com EEPROM0x60–0x67
    SCD30módulo de CO₂ NDIR, temperatura e umidade0x61endereço fixo
    SCD40 / SCD41sensor de CO₂ fotoacústico, temperatura e umidade0x62endereço fixo
    BMI270IMU de 6 eixos0x68, 0x69SDO: GND → 0x68 · VDDIO → 0x69
    DS1307relógio de tempo real (RTC)0x68endereço fixo
    DS3231relógio de tempo real compensado em temperatura0x68endereço fixo
    MPU-6050acelerômetro + giroscópio de 6 eixos0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    MPU-6886IMU de 6 eixos0x68, 0x69SA0: GND → 0x68 · VDD → 0x69
    MPU-9250IMU de 9 eixos (acelerômetro, giroscópio, magnetômetro AK8963)0x68, 0x69AD0: GND → 0x68 · VDD → 0x69
    SEN50 / SEN54 / SEN55módulo de material particulado, VOC/NOx, temperatura e umidade0x69endereço fixo
    SHTC3sensor de temperatura e umidade0x70endereço fixo
    TCA9548Amultiplexador I²C de 8 canais0x70–0x77A2 A1 A0 → 0x70–0x77
    IP5306SoC para power bank (carregador + boost), versão I²C0x75endereço fixo
    BME280sensor de temperatura, umidade e pressão0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME680sensor de gás (VOC), temperatura, umidade e pressão0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BME688sensor de gás com IA, temperatura, umidade e pressão0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP280sensor de pressão e temperatura0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    BMP388sensor de pressão e temperatura0x76, 0x77SDO: GND → 0x76 · VDDIO → 0x77
    MS5611-01BAsensor de pressão barométrica (altímetro)0x76, 0x77CSB: VDD → 0x76 · GND → 0x77
    BMP180sensor de pressão e temperatura0x77endereço fixo

    Perguntas frequentes

    Por que o datasheet diz 0x52, mas o scanner encontra 0x29?

    O datasheet dá o endereço de escrita de 8 bits, que é o endereço de 7 bits deslocado um bit para a esquerda. 0x52 ÷ 2 = 0x29. Bibliotecas e scanners usam a forma de 7 bits.

    Dois sensores iguais podem dividir o mesmo barramento?

    Sim, se o sensor tiver um pino de endereço: configure-o de forma diferente em cada um. Se não tiver, use um multiplexador TCA9548A ou um segundo barramento I²C.

    Meu LCD I²C está em 0x3F, não em 0x27: por quê?

    O módulo tem um PCF8574AT em vez de um PCF8574T. A versão A usa 0x38–0x3F em vez de 0x20–0x27; com todos os pinos de endereço em nível alto, fica 0x3F em vez de 0x27.

    Preciso de pull-ups se os meus módulos já vêm com eles?

    Normalmente não: um conjunto por barramento basta. Com muitos módulos, os pull-ups deles se somam em paralelo e podem ficar fortes demais; a calculadora acima verifica isso.