Проверка шины I²C

Цель — убедиться, что шина I²C жива и Nano видит все три I²C-модуля кубсата: BME280, CCS811 и MPU9250. Если на этом шаге все адреса видны, дальнейшие сенсорные тесты пройдут без сюрпризов.

Распиновка — см. таблицу в Подготовка среды разработки (A4=SDA, A5=SCL). Перетыкать ничего не нужно: разводка уже выполнена при сборке.

Тестовый скетч

examples/i2c_scanner/i2c_scanner.ino
#include <Wire.h>

const unsigned long SCAN_PERIOD_MS = 3000;
unsigned long lastScanMs = 0;

const char* knownDeviceName(uint8_t addr) {
  switch (addr) {
    case 0x76: return "BME280";
    case 0x5A: return "CCS811";
    case 0x68: return "MPU9250 (or compatible at 0x68)";
    case 0x69: return "MPU9250 (or compatible at 0x69)";
    default:   return "Unknown device";
  }
}

void printAddressHex(uint8_t addr) {
  Serial.print("0x");
  if (addr < 16) Serial.print('0');
  Serial.print(addr, HEX);
}

void runI2CScan() {
  uint8_t found = 0;

  Serial.println();
  Serial.println("=== I2C scan start ===");

  for (uint8_t addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    uint8_t error = Wire.endTransmission();

    if (error == 0) {
      found++;
      printAddressHex(addr);
      Serial.print("  ->  ");
      Serial.println(knownDeviceName(addr));
    }
  }

  if (found == 0) {
    Serial.println("No I2C devices found.");
  } else {
    Serial.print("Total devices found: ");
    Serial.println(found);
  }

  Serial.println("Expected: BME280=0x76, CCS811=0x5A, MPU9250=0x68/0x69");
  Serial.println("=== I2C scan end ===");
}

void setup() {
  Serial.begin(115200);
  Wire.begin(); // Arduino Nano: SDA=A4, SCL=A5
  delay(300);

  Serial.println("I2C Scanner ready.");
  Serial.println("Wiring: SDA->A4, SCL->A5, GND common.");
  runI2CScan();
  lastScanMs = millis();
}

void loop() {
  if (millis() - lastScanMs >= SCAN_PERIOD_MS) {
    lastScanMs = millis();
    runI2CScan();
  }
}

Скетч раз в 3 секунды проходит адреса с 0x01 по 0x7E и печатает те, на которых получил ответ.

Как запустить

  1. Залейте скетч на Nano.

  2. Откройте Serial Monitor на скорости 115200.

Что должно быть видно

I2C Scanner ready.
Wiring: SDA->A4, SCL->A5, GND common.

=== I2C scan start ===
0x5A  ->  CCS811
0x68  ->  MPU9250 (or compatible at 0x68)
0x76  ->  BME280
Total devices found: 3
Expected: BME280=0x76, CCS811=0x5A, MPU9250=0x68/0x69
=== I2C scan end ===

Адрес MPU может быть 0x68 или 0x69 — зависит от уровня на пине AD0 модуля. Оба варианта валидны.

Если не видно одного из адресов

Проверяйте по порядку:

  1. Питание модуля. VCC подан, индикатор на плате модуля горит (если есть).

  2. Земля. GND общая со всем кубсатом.

  3. Целостность шлейфа. Dupont-провод мог соскочить или переломиться у разъёма — пошевелите/переткните контакт.

  4. Если найден только ``0x68`` без других — соседи на шине подвешивают линию. Чаще всего виновник — CCS811: его пин WAK должен быть притянут к GND.

  5. Если шина показывает много «странных» адресов (5+ устройств) — плохой контакт SDA или SCL, шина «звенит».

Подробнее по симптомам — Возможные ошибки и диагностика.