Сканер I2C устройств

#include <Wire.h>
void setup() {
    Serial.begin(9600);
    Serial.println("nI2C Scanner");
    Wire.begin();
}
void loop() {
    byte error, address;
    int nDevices;
    Serial.println("Scanning...");
    nDevices = 0;
    for(address = 1; address < 127; address++ ) {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
        if (error == 0) {
            Serial.print("I2C device found at address 0x");
            if (address<16) {
                Serial.print("0");
            }
            Serial.print(address,HEX);
            Serial.println(" !");
            nDevices++;
        }
        else if (error==4) {
            Serial.print("Unknown error at address 0x");
            if (address<16) {
                Serial.print("0");
            }
            Serial.println(address,HEX);
        }
    }
    if (nDevices == 0) {
        Serial.println("No I2C devices foundn");
    }
    else {
        Serial.println("donen");
    }
    delay(5000); // wait 5 seconds for next scan
}

Общее описание

Данный код представляет собой сканер I2C устройств, который позволяет определить, какие устройства подключены к шине I2C и узнать их адреса.

Подключение библиотеки

#include <Wire.h>
  • Подключается библиотека Wire.h, которая обеспечивает работу с протоколом I2C

Функция setup()

void setup() {
  Serial.begin(9600);
  Serial.println("nI2C Scanner");
  Wire.begin();
}
  • Инициализация последовательного порта со скоростью 9600 бод
  • Вывод приветственного сообщения
  • Запуск I2C интерфейса

Функция loop()

void loop() {
  byte error, address;
  int nDevices;
  
  Serial.println("Scanning...");
  nDevices = 0;
  
  for(address = 1; address < 127; address++ ) {
    // ...
  }
}
  • Объявляются переменные:
    • error — для хранения кода ошибки
    • address — текущий адрес для проверки
    • nDevices — счетчик найденных устройств

Основной цикл сканирования

Wire.beginTransmission(address);
error = Wire.endTransmission();
  • Происходит попытка передачи данных на текущий адрес
  • Сохраняется результат операции в переменную error

Обработка результатов

if (error == 0) {
  // Устройство найдено
}
else if (error==4) {
  // Ошибка при обращении
}
  • Если error = 0, значит устройство успешно ответило
  • Если error = 4, произошла неизвестная ошибка

Вывод результатов

Serial.print("I2C device found at address 0x");
Serial.print(address,HEX);
  • Выводится найденный адрес устройства в шестнадцатеричном формате

Завершение сканирования

if (nDevices == 0) {
  Serial.println("No I2C devices found");
}
delay(5000);
  • Если устройства не найдены, выводится соответствующее сообщение
  • Программа делает паузу в 5 секунд перед следующим сканированием

Практическое применение

Этот код полезен для:

  • Определения адресов подключенных устройств
  • Отладки систем на базе I2C
  • Диагностики проблем с подключением
  • Проверки работоспособности устройств
Категория

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *