Как узнать адрес дисплея i2c на ардуино
Перейти к содержимому

Как узнать адрес дисплея i2c на ардуино

  • автор:

Как узнать адрес дисплея i2c на ардуино

При подключении нескольких устройств или датчиков бывает необходимо определить адрес каждого устройства. Обычно производитель пишет информацию об адресе, но иногда нет времени искать. Ниже приведу Скетч-пример как на Arduino просканировать все подключенние устройства и вывести их адреса.

Подключение

Подключается через контакты SDA и SCL (на ардуино УНО и НАНО они на контактах A4 и A5).

Скетч

#include Wire.h> byte error, address; int nDevices; //Кол-во найденных устройств void setup()  Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); > void loop()  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("Unknow error at address 0x"); if (address  16) Serial.print("0"); Serial.println(address, HEX); > > if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // Ждем 5 сек. до следующего сканирования > 

Комментарии

+2 # Глеб 17.06.2016 23:45

спасибо работает
очень полезная программа

Урок 24. Узнаём адреса устройств на шине I2C

В этом уроке мы научимся определять адреса устройств на шине I2C, аппаратно устанавливая состояния Start/Stop на шине I2C и передавая байт данных с адресом устройства и битом RW.

Нам понадобится:
  • Arduino х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema Shield х 1шт.
  • Trema-модуль i2C Hub х 1шт.
  • Trema-модуль кнопка c проводом х 1шт.
  • Шлейф «мама-мама»для шины I2С х 2шт.
  • Устройства и модули с шиной I2C, адреса которых Вы хотите узнать, до 126 шт.

Для реализации проекта нам необходимо установить одну библиотеку:

  • Библиотека LiquidCrystal_I2C_V112 (для работы с дисплеем LCD1602 по шине I2C)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki — Работа с символьными ЖК дисплеями.

Видео:
Схема подключения:
  • Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
  • Кнопка подключается к цифровому выводу 2.

Определение адресов устройств на шине I2C

Алгоритм работы:
  • При однократном нажатии на кнопку — выводится очередной адрес.
  • При удержании кнопки — производится чтение адресов, всех подключенных к шине I2C устройств.
Код программы:
// Подключаем библиотеки: #include // подключаем библиотеку для работы с шиной I2C (для работы с дисплеем) #include // подключаем библиотеку для работы с LCD дисплеем // Объявляем переменные и константы: LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET uint8_t SEC_button_SET; // переменная содержащая десятые доли секунд времени удержания кнопки SET uint8_t NUM_found_ADDR; // количество найденных адресов uint8_t MAS_found_ADDR[127]; // массив найденных адресов uint8_t OUT_found_ADDR = 1; // выводимый адрес из списка найденных void setup() < pinMode(PIN_button_SET, INPUT); // конфигурируем вывод кнопки, как вход lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("iArduino.ru")); // выводим текст "iArduino.ru" delay(2000); // ждём 2 секунды lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("Please click. ")); // выводим текст "Please click. " >void loop() < if(digitalRead(PIN_button_SET))< // Если нажата кнопка, то . lcd.clear(); // Стираем экран SEC_button_SET=0; // Обнуляем счётчик удержания кнопки while(digitalRead(PIN_button_SET))< // Создаём цикл, пока кнопка не будет отпушена delay(10); // Пропускаем 10мс if(SEC_button_SET<100)// Если прошло меньше 1 секунды, инкрементируем счетчик удержания кнопки else // Выводим на экран текст "Start Search. " > // Как только кнопка отпущена, выполняем одно из двух действий . if(SEC_button_SET<100)< // Если кнопка SET удерживалась меньше 1 секунды, то показываем значение очередного адреса . OUT_found_ADDR++; if(OUT_found_ADDR>NUM_found_ADDR) // Инкрементируем номер выводимого адреса >else< // Если кнопка SET удерживалась дольше 1 секунды, то читаем адреса устройств на шине I2C. NUM_found_ADDR=0; // Сбрасываем количество найденных адресов OUT_found_ADDR=1; // Сбрасываем номер выводимого адреса for(uint8_t i=1; i>> func_STOP();> // Устанавливаем состояние СТОП > // Выводим данные на LCD дисплей lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("ALL")); lcd.setCursor(4, 0); lcd.print(F("ADDR = " )); lcd.print(NUM_found_ADDR); if(NUM_found_ADDR) > > bool func_START() =60000)> if((TWSR & 0xF8)!=0x08) return true;> bool func_SEND (uint8_t j)=60000)> if((TWSR & 0xF8)!=0x18) return true;> void func_STOP () =60000)> delayMicroseconds(20); >
Алгоритм работы программы:

Код в функции loop() начинает выполняться только при условии, если нажата кнопка. Если таковое событие произошло, то начинает исполняться цикл while() выход из которого осуществляется при отпускании кнопки. В самом цикле происходит подсчёт времени удержания кнопки.

После отпускания кнопки, программа выполняет одно из двух действий:

  • Если кнопка удерживалась меньше 1 секунды, то происходит увеличение порядкового номера выводимого адреса.
  • Если кнопка удерживалась дольше 1 секунды, то происходит чтение всех доступных адресов на шине I2C.

Чтение адресов на шине I2C происходит в цикле for() от 1 до 127, где индекс цикла соответствует проверяемому адресу. Проверка на существование адреса осуществляется следующим образом:

  • Вызывается функция func_START, которая устанавливает состояние СТАРТ на шине I2C и возвращает результат установки данного состояния.
  • Если состояние СТАРТ установлено, то вызывается функция func_SEND, которая передает свой аргумент как байт адреса с битом RW=0 и если на шине зафиксирован ответ ACK, то возвращает результат true, иначе false.
  • Если на шине зафиксирован результат ACK, то переданный адрес сохраняется в массив найденных адресов, за исключением адреса 0x27 который является адресом LCD дисплея.
  • Вызывается функция func_STOP, которая устанавливает состояние СТОП на шине I2C.

И последнее действие программы — вывод данных на дисплей, не зависимо от того, как долго удерживалась кнопка.

Так как передача данных осуществляется только после отпускания кнопки, то допускается «горячее» подключение проверяемых устройств к шине I2C, если кнопка не нажата.

Ссылки:
  • Код программы.
  • Библиотека LiquidCrystal_I2C_V112.
  • Wiki — Установка библиотек в Arduino IDE .
  • Wiki — Работа с символьными ЖК дисплеями.
  • Wiki — Trema Shield.

Arduino: как узнать I2C адрес устройства?

I2C — это такая шина данных, широко используемая в микроэлектронике. С помощью I2C можно подключить к Ардуино много разных полезных модулей, включая датчики, дисплеи, АЦП и даже другие платы Ардуино.

Шина является адресной, так что каждое подключаемое устройство имеет свой адрес в диапазоне от 8 до 127. На одной шине не может быть два устройства с одинаковыми адресами.

В этой короткой статье мы победим одну из частых проблем, которые испытывают самодельщики про покупке неведомого модуля с этим самым I2C интерфейсом. Проблема состоит в том, что производитель может изменить адрес устройства, и стандартные библиотеки перестают работать. Часто с подобной неприятностью можно столкнуться, например, при подключении ЖК дисплея с интерфейсом I2C.

Программа для сканирования I2C шины

Чтобы понять, какой всё-таки адрес у модуля, подключаемого к плате Ардуино, нужно просто «постучаться» по каждому из 119 возможных адресов. Если кто-то ответит, значит адрес рабочий!

#include void setup() < Wire.begin(); Serial.begin(9600); while (!Serial); Serial.println("\nI2C Scanner"); >void loop() < byte error, address; int nDevices; Serial.println("Scanning. "); nDevices = 0; for(address = 8; 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("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); >> if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); >

Загружаем программу на Ардуино Уно, подключаем тестируемое устройство к I2C шине и открываем монитор последовательного порта. Если все подключено правильно, то появится примерно такой отчет:

Сканер I2C шины на Ардуино

Это значит, что мой дисплей имеет адрес 0x27 в шестнадцатеричной системе счисления. Теперь можно смело подключить библиотеку для работы с такими дисплеями и указать в ней данный адрес.

Изменено: 14 Ноя, 2016 02:25

Arduino: как узнать I2C адрес устройства? : Один комментарий

Роман говорит 14.11.2016 в 15:39 :

Очень интересно, но думаю не помешала бы принципиальная схемка подключения I2C устройства к Ардуино. Ну или ссылка на такую процедуру.

I2C сканер на Arduino

I2C сканер на Arduino

В этой статье расскажу как с помощью Arduino сделать I2C сканер, в качестве примера определю адрес LCD1602 дисплей, работающего по интерфейсу I2C.

I2C сканер на Arduino

I2C сканер на Arduino

Немного теории, I2C — это протокол, который позволяет различным устройствам взаимодействовать друг с другом используя одну шину данных SDA и SCL (всего два проводника), так же, для каждого устройства присваивается свой уникальный адрес (максим 127 устройств). Поменять адрес устройства нельзя, он намертво вшит в микросхему, но некоторые производитель предоставил возможность изменять адрес в небольшом диапазоне, это дает возможность подключить несколько одинаковых устройств (с одинаковым чипом) к одной шине.
Иногда, нет возможности найти документацию на микросхему или микросхема не имеет адрес схожий от документации (такое то же бывало), тогда поможет данный скетч. В примере используется Arduino UNO и LCD модуль I2C (который имеет брак и другой адрес, не 0x27), так-же, интерфейс I2C работает только на определенные выводах (в arduino UNO это A4 и A5), приведу таблицу подключения для различных платформ Arduino.

I2C сканер на Arduino

Собираем принципиальную схему

I2C сканер на Arduino

Открываем среду разработки IDE Arduino, копируем скетч и загружаем его в платформу Arduino.

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

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