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 | |
|---|---|
| 0x00 | Chamada geral (escrita) ou byte de START (leitura) |
| 0x01 | Endereço CBUS |
| 0x02 | Reservado para outro formato de barramento |
| 0x03 | Reservado para uso futuro |
| 0x04–0x07 | Código de controlador no modo Hs |
| 0x78–0x7B | Endereçamento de 10 bits |
| 0x7C–0x7F | Device 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 | |||
|---|---|---|---|
| QMC5883L | magnetômetro de 3 eixos | 0x0D | endereço fixo |
| VEML6075 | sensor de luz UVA/UVB | 0x10 | endereço fixo |
| LIS2DH12 | acelerômetro de 3 eixos | 0x18, 0x19 | SA0: GND → 0x18 · VDD → 0x19 |
| MCP9808 | sensor de temperatura digital | 0x18–0x1F | A2 A1 A0 → 0x18–0x1F |
| MMA8451Q | acelerômetro de 3 eixos | 0x1C, 0x1D | SA0: GND → 0x1C · VDD → 0x1D |
| ADXL345 | acelerômetro de 3 eixos | 0x1D, 0x53 | ALT ADDRESS: GND → 0x53 · VDD → 0x1D |
| MCP23008 | expansor de E/S de 8 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| MCP23017 | expansor de E/S de 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8574 | expansor de E/S de 8 bits (módulos I²C para LCD) | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PCF8575 | expansor de E/S de 16 bits | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| TCA9555 | expansor de E/S de 16 bits com interrupção | 0x20–0x27 | A2 A1 A0 → 0x20–0x27 |
| PN532 | controlador NFC/RFID (modo I²C) | 0x24 | endereço fixo |
| BNO055 | sensor de orientação absoluta de 9 eixos com fusão de sensores integrada | 0x28, 0x29 | COM3: GND → 0x28 · VDD → 0x29 |
| TCS34725 | sensor de cor RGB | 0x29 | endereço fixo |
| VL53L0X | sensor de distância por tempo de voo (ToF) | 0x29 | |
| MLX90640 | câmera térmica 32×24 | 0x33 | |
| AXP192 | CI de gerenciamento de energia (PMIC) | 0x34 | endereço fixo |
| AXP2101 | CI de gerenciamento de energia (PMIC) | 0x34 | endereço fixo |
| PCF8574A | expansor de E/S de 8 bits, faixa de endereços alternativa | 0x38–0x3F | A2 A1 A0 → 0x38–0x3F |
| VEML6070 | sensor de luz UV | 0x38 | endereço fixo |
| APDS-9960 | sensor de gestos, proximidade, luz ambiente e cor RGB | 0x39 | endereço fixo |
| SH1106 | controlador de display OLED 132×64 | 0x3C, 0x3D | SA0: GND → 0x3C · VDD → 0x3D |
| SSD1306 | controlador de display OLED 128×64 / 128×32 | 0x3C, 0x3D | SA0 (D/C#): GND → 0x3C · VDD → 0x3D |
| SX1509 | expansor de E/S de 16 canais com driver de LED e controle de teclado | 0x3E, 0x3F, 0x70, 0x71 | ADDR1 ADDR0: 00 → 0x3E · 01 → 0x3F · 10 → 0x70 · 11 → 0x71 |
| HDC1080 | sensor de temperatura e umidade | 0x40 | endereço fixo |
| INA219 | monitor de corrente, tensão e potência | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA226 | monitor de corrente, tensão e potência | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA260 | monitor de corrente, tensão e potência com shunt integrado | 0x40–0x4F | A1, A0: GND · VS · SDA · SCL → 0x40–0x4F |
| INA3221 | monitor de corrente e tensão de 3 canais | 0x40, 0x41, 0x42, 0x43 | A0: GND → 0x40 · VS → 0x41 · SDA → 0x42 · SCL → 0x43 |
| PCA9685 | driver PWM / servo de 16 canais, 12 bits | 0x40–0x77 | A5…A0 → 0x40–0x77 (0x70 = All Call) |
| Si7021 | sensor de temperatura e umidade | 0x40 | endereço fixo |
| OPT3001 | sensor de luz ambiente | 0x44, 0x45, 0x46, 0x47 | ADDR: GND → 0x44 · VDD → 0x45 · SDA → 0x46 · SCL → 0x47 |
| SHT30 / SHT31 / SHT35 | sensor de temperatura e umidade | 0x44, 0x45 | ADDR: GND → 0x44 · VDD → 0x45 |
| SHT40 / SHT41 / SHT43 / SHT45 (SHT4x) | sensor de temperatura e umidade | 0x44, 0x45, 0x46 | |
| ADS1015 | ADC de 12 bits e 4 canais | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS1115 | ADC de 16 bits e 4 canais | 0x48, 0x49, 0x4A, 0x4B | ADDR: GND → 0x48 · VDD → 0x49 · SDA → 0x4A · SCL → 0x4B |
| ADS7830 | ADC de 8 bits e 8 canais | 0x48, 0x49, 0x4A, 0x4B | A1 A0 → 0x48–0x4B |
| LM75B | sensor de temperatura digital / termostato | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| PCF8591 | ADC de 8 bits e 4 canais + 1 DAC | 0x48–0x4F | A2 A1 A0 → 0x48–0x4F |
| TMP102 | sensor de temperatura digital | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| TMP117 | sensor de temperatura digital de alta precisão | 0x48, 0x49, 0x4A, 0x4B | ADD0: GND → 0x48 · V+ → 0x49 · SDA → 0x4A · SCL → 0x4B |
| 24LC256 / 24AA256 / 24FC256 | EEPROM I²C de 256 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| AT24C32 | EEPROM I²C de 32 Kbit | 0x50–0x57 | A2 A1 A0 → 0x50–0x57 |
| PCF85063A | relógio de tempo real (RTC) | 0x51 | endereço fixo |
| ENS160 | sensor de óxido metálico para qualidade do ar (TVOC/eCO₂/AQI) | 0x52, 0x53 | ADDR: GND → 0x52 · VDD → 0x53 |
| BQ27441-G1 | medidor de carga para uma célula Li-ion | 0x55 | endereço fixo |
| MAX30100 | oxímetro de pulso e sensor de frequência cardíaca | 0x57 | endereço fixo |
| SGP30 | sensor de gás VOC e eCO₂ | 0x58 | endereço fixo |
| SGP40 | sensor de gás, índice VOC | 0x59 | endereço fixo |
| SGP41 | sensor de gás, índices VOC e NOx | 0x59 | endereço fixo |
| CCS811 | sensor de gás eCO₂ / TVOC | 0x5A, 0x5B | ADDR: GND → 0x5A · VDD → 0x5B |
| MLX90614 | termômetro infravermelho sem contato | 0x5A | |
| MPR121 | controlador de toque capacitivo de 12 canais | 0x5A, 0x5B, 0x5C, 0x5D | ADDR: GND → 0x5A · VDD → 0x5B · SDA → 0x5C · SCL → 0x5D |
| LPS22HB | sensor de pressão barométrica | 0x5C, 0x5D | SA0: GND → 0x5C · VDD → 0x5D |
| GT911 | controlador de tela touch capacitiva de 5 pontos | 0x5D, 0x14 | |
| MCP4725 | DAC de 12 bits com EEPROM | 0x60–0x67 | A0 → 0x60/0x61 (MCP4725A0) |
| MCP4728 | DAC de 12 bits e 4 canais com EEPROM | 0x60–0x67 | |
| SCD30 | módulo de CO₂ NDIR, temperatura e umidade | 0x61 | endereço fixo |
| SCD40 / SCD41 | sensor de CO₂ fotoacústico, temperatura e umidade | 0x62 | endereço fixo |
| BMI270 | IMU de 6 eixos | 0x68, 0x69 | SDO: GND → 0x68 · VDDIO → 0x69 |
| DS1307 | relógio de tempo real (RTC) | 0x68 | endereço fixo |
| DS3231 | relógio de tempo real compensado em temperatura | 0x68 | endereço fixo |
| MPU-6050 | acelerômetro + giroscópio de 6 eixos | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| MPU-6886 | IMU de 6 eixos | 0x68, 0x69 | SA0: GND → 0x68 · VDD → 0x69 |
| MPU-9250 | IMU de 9 eixos (acelerômetro, giroscópio, magnetômetro AK8963) | 0x68, 0x69 | AD0: GND → 0x68 · VDD → 0x69 |
| SEN50 / SEN54 / SEN55 | módulo de material particulado, VOC/NOx, temperatura e umidade | 0x69 | endereço fixo |
| SHTC3 | sensor de temperatura e umidade | 0x70 | endereço fixo |
| TCA9548A | multiplexador I²C de 8 canais | 0x70–0x77 | A2 A1 A0 → 0x70–0x77 |
| IP5306 | SoC para power bank (carregador + boost), versão I²C | 0x75 | endereço fixo |
| BME280 | sensor de temperatura, umidade e pressão | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME680 | sensor de gás (VOC), temperatura, umidade e pressão | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BME688 | sensor de gás com IA, temperatura, umidade e pressão | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP280 | sensor de pressão e temperatura | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| BMP388 | sensor de pressão e temperatura | 0x76, 0x77 | SDO: GND → 0x76 · VDDIO → 0x77 |
| MS5611-01BA | sensor de pressão barométrica (altímetro) | 0x76, 0x77 | CSB: VDD → 0x76 · GND → 0x77 |
| BMP180 | sensor de pressão e temperatura | 0x77 | endereç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.