При подключении по шине I²C часто используются уже вполне определенные адреса. Вот таблица основных зарезервированных и популярных адресных пространств на шине I²C (7-битный формат):

 

Таблица адресов на шине IIC

Адрес (HEX) Устройство / Назначение Примечание
0x00 General Call Address Широковещательный адрес
0x01 – 0x03 Reserved  
0x04 – 0x07 HS-mode master codes  
0x08 – 0x0F Reserved  
0x10 – 0x17 Устройства с адресацией "10-bit" Редко используется
0x18 – 0x1F Reserved  
0x20 – 0x27 LCD (HD44780), PCF8574 (I/O expander) Часто используется
0x28 – 0x2F EEPROM (24Cxx), датчики  
0x30 – 0x37 Reserved  
0x38 – 0x3F LCD (Nokia 5110), некоторые датчики  
0x40 – 0x47 Датчики (BME280, BMP280), PWM (PCA9685)  
0x48 – 0x4F АЦП (ADS1115), термометры (LM75)  
0x50 – 0x57 EEPROM (24C32/64), RTC (DS1307, китай) DS1307 иногда тут
0x58 – 0x5F Reserved  
0x60 – 0x67 ЦАП (MCP4725), синтезаторы частот  
0x68 – 0x6F RTC (DS1307, DS3231), IMU (MPU6050) DS1307 обычно тут (0x68)
0x70 – 0x77 I²C-мультиплексоры (TCA9548A)  
0x78 – 0x7F Reserved  

🔍 Популярные устройства и их адреса

Устройство Адрес (HEX) Описание
DS1307 0x68 Часы реального времени (RTC)
DS3231 0x68 Более точный RTC
MPU6050 0x68 (или 0x69) Гироскоп/акселерометр
OLED (SSD1306) 0x3C или 0x3D Дисплей 128x64
BME280 0x76 или 0x77 Датчик температуры/влажности
ADS1115 0x48–0x4B 16-битный АЦП
PCF8574 0x20–0x27 Расширитель GPIO
24C32 EEPROM 0x50–0x57 Внешняя память

⚠️ Важные нюансы

  1. Адреса 0x00–0x07 и 0x78–0x7F зарезервированы под системные нужды.

  2. Некоторые устройства (например, MPU6050) позволяют менять адрес перемычкой (например, 0x68 → 0x69).

  3. Китайские модули иногда используют нестандартные адреса (например, DS1307 на 0x57 вместо 0x68).

  4. Если устройство не отвечает:

    • Проверьте подтяжку SCL/SDA (3.3-4.7 кОм к VCC).

    • Убедитесь, что не конфликтуют адреса (например, два устройства на 0x68).

🛠 Как просканировать шину I²C?

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(); // SDA, SCL (по умолчанию 21, 22 для ESP32)
  
  Serial.println("Сканирование I2C...");
  for (byte addr = 0x08; addr <= 0x77; addr++) {
    Wire.beginTransmission(addr);
    byte error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("Устройство найдено: 0x");
      Serial.println(addr, HEX);
    }
  }
}

void loop() {}