Проверка шины I²C
Цель — убедиться, что шина I²C жива и Nano видит все три I²C-модуля кубсата: BME280, CCS811 и MPU9250. Если на этом шаге все адреса видны, дальнейшие сенсорные тесты пройдут без сюрпризов.
Распиновка — см. таблицу в Подготовка среды разработки (A4=SDA, A5=SCL).
Перетыкать ничего не нужно: разводка уже выполнена при сборке.
Тестовый скетч
#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 и печатает
те, на которых получил ответ.
Как запустить
Залейте скетч на Nano.
Откройте 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 модуля. Оба варианта валидны.
Если не видно одного из адресов
Проверяйте по порядку:
Питание модуля.
VCCподан, индикатор на плате модуля горит (если есть).Земля.
GNDобщая со всем кубсатом.Целостность шлейфа. Dupont-провод мог соскочить или переломиться у разъёма — пошевелите/переткните контакт.
Если найден только ``0x68`` без других — соседи на шине подвешивают линию. Чаще всего виновник — CCS811: его пин
WAKдолжен быть притянут кGND.Если шина показывает много «странных» адресов (5+ устройств) — плохой контакт SDA или SCL, шина «звенит».
Подробнее по симптомам — Возможные ошибки и диагностика.