Ардуино wire requestfrom
Doubts on how to use Github? Learn everything you need to know in this tutorial.
Last Revision: Searching.
Last Build: 2022/10/07
Description
This library allows you to communicate with I2C/TWI devices. On the Arduino boards with the R3 layout (1.0 pinout), the SDA (data line) and SCL (clock line) are on the pin headers close to the AREF pin. The Arduino Due has two I2C/TWI interfaces SDA1 and SCL1 are near to the AREF pin and the additional one is on pins 20 and 21.
As a reference the table below shows where TWI pins are located on various Arduino boards.
20 (SDA), 21 (SCL), SDA1, SCL1
As of Arduino 1.0, the library inherits from the Stream functions, making it consistent with other read/write libraries. Because of this, send() and receive() have been replaced with read() and write() .
Recent versions of the Wire library can use timeouts to prevent a lockup in the face of certain problems on the bus, but this is not enabled by default (yet) in current versions. It is recommended to always enable these timeouts when using the Wire library. See the Wire.setWireTimeout function for more details.
Note: There are both 7 and 8-bit versions of I2C addresses. 7 bits identify the device, and the eighth bit determines if it’s being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8-bit address, you’ll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127. However the addresses from 0 to 7 are not used because are reserved so the first address that can be used is 8. Please note that a pull-up resistor is needed when connecting SDA/SCL pins. Please refer to the examples for more information. MEGA 2560 board has pull-up resistors on pins 20 and 21 onboard.
The Wire library implementation uses a 32 byte buffer, therefore any communication should be within this limit. Exceeding bytes in a single transmission will just be dropped.
Arduino библиотека Wire
Ардуино библиотека Wire используется для связи микроконтроллера с устройствами и модулями через интерфейс I2C. Об этом интерфейсе я рассказывал в уроке посвященном I2C. Там мы подробно рассмотрели пример подключения и работы с I2C устройствами. I2C интерфейс для передачи данных использует множество устройств.
Для связи по I2C используется всего два контакта: линия данных (SDA) и линия тактового сигнала (SCL). К соответствующим разъемам Arduino можно подключить до 120 устройств, поддерживающих интерфейс I2C. Для обмена данными с такими устройствами и нужна Arduino библиотека Wire.
Расположение пинов SDA и SCL на разных платах Arduino может отличаться. Смотрите описание вашей платы микроконтроллера, что бы не допустить ошибку при подключении. В списке ниже расписано расположение пинов I2C популярных плат Ардуино.
- Arduino Nano: A4-SDA A5-SCL
- Arduino Uno: A4-SDA A5-SCL продублированы рядом с разъемом AREF (только версия R3)
- Arduino Mega: 20-SDA 21-SCL продублированы рядом с разъемом AREF (только версия R3)
- Arduino Pro Mini: A4-SDA A5-SCL
- Arduino Leonardo: 2-SDA 3-SCL и пины рядом с разъемом AREF (второй канал)
В этой статье я подробно распишу функции библиотеки Wire.
Скачать Arduino библиотеку Wire.h
Wire идет в комплекте стандартных библиотек и устанавливается вместе с Arduino IDE. Но ее можно скачать и отдельно по ссылке ниже.
Для установки библиотеки просто распакуйте zip архив в папку «C:\Program Files (x86)\Arduino\libraries» или в то место, где у васт установлена среда разработки Arduin IDE. Если у вас запущена программа Arduino IDE, то для работы с новой библиотекой её необходимо перезапустить.
begin()
Инициализирует библиотеку Wire и подключается к шине I2C как ведущий (мастер) или ведомый.
Синтаксис
Параметры
address — Необязательный параметр. 7-битный адрес ведомого устройства; если не задан, плата подключается к шине как мастер.
Возвращаемые значения
requestFrom()
Отправляет запрос на определенное количество байтов от ведущего устройства к ведомому.
Синтаксис
Параметры
address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.
quantity — Обязательный параметр. Количество запрашиваемых байт.
stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.
Возвращаемые значения
Количество байт, возвращенных от устройства.
beginTransmission()
Открывает канал связи по шине I2C с ведомым устройством.
Синтаксис
Параметры
address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.
Возвращаемые значения
endTransmission()
Отправляет данные, которые были поставлены в очередь методом write() и завершает передачу.
Синтаксис
Параметры
stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.
Возвращаемые значения
byte, который указывает на состояние передачи: 0: успешная передача; 1: Объем данных для передачи слишком велик; 2: принят NACK при передаче адреса; 3: принят NACK при передаче данных; 4: другие ошибки.
write()
Ставит данные в очередь для передачи.
Синтаксис
Параметры
data — Обязательный параметр. Байт, срока или массив байтов для передачи.
length — Необязательный параметр. Длинна передаваемого массива данных. Используется только при передаче массива в первом параметре.
Возвращаемые значения
Количество записанных байт
available()
Возвращает количество байт, доступных для чтения.
Синтаксис
Параметры
Возвращаемые значения
Количество байт доступных для считывания
Считывает байт переданной информации.
Синтаксис
Параметры
Возвращаемые значения
Синтаксис
Параметры
Возвращаемые значения
setClock()
Устанавливает тактовую частоту обмена данными по I2C интерфейсу.
Синтаксис
Параметры
clockFrequency — Обязательный параметр. Новое значение частоты обмена данными в герцах. Доступные значения: 10000 — медленный режим 100000 — стандартное значение 400000 — быстрый режим 1000000 — быстрый режим плюс 3400000 — высокоскоростной режим Необходимо убедится, что выбранный режим поддерживается вашим процессором, обратившись к документации от производителя.
Возвращаемые значения
onReceive()
Добавляет функцию обработчик, которая будет выполняться при получении данных от ведущего устройства.
Синтаксис
Параметры
handler — Имя функции, которая будет выполняться когда ведомое устройство принимает данные. Функция должна принимать один параметр int и ничего не возвращать.
Возвращаемые значения
onRequest()
Добавляет функцию обработчик, которая будет выполняться при получении запроса от ведущего устройства.
Синтаксис
Параметры
handler — Имя функции, которая будет выполняться когда ведомое устройство получает запрос от ведущего. Функция не принимает параметров и ничего не возвращает.
Возвращаемые значения
Железо
Это расширенный стартовый набор. В комплект входит Arduino Mega R3, макетные платы, множество датчиков, управляемые механизмы и необходимые радиоэлектронные компоненты. Полный список.
Arduino Uno — плата на базе микроконтроллера ATmega328P с частотой 16 МГц. На плате есть все необходимое для удобной и быстрой работы.
Макетная плата на 830 точек и ничего лишнего.
Интерфейсная шина I²C/Библиотека Wire
I²C (IIC, англ. Inter-Integrated Circuit) — последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов.
Шина I2C также известна как двухпроводной интерфейс (Two Wire Interface, TWI) — простое и удобное устройство, используемое для обмена данными. Сам протокол был предложен фирмой Philips, но во избежание проблем с авторскими правами иногда протокол называют «двухпроводным».
Передача данных между устройствами и Arduino осуществляется по двум линиям, которые называют линией данных (Serial Data Line, SDA) и тактовой линией синхронизации сигнала (Serial Clock Line, SCL). В Arduino Uno вывод SDA находится на A4, а линия SCL — на контакте A5. Некоторые новейшие платы R3 имеют отдельные контакты, соединённые с шиной I2C и расположенные в верхнем левом углу для удобства доступа к ним. При подключении требуется установка подтягивающих резисторов. Обычно используют резисторы номиналом 4.7 кОм.
Будучи подключённой к шине I2C, плата Arduino считается ведущим устройством, а все остальные устройства — ведомыми. Каждое ведомое устройство имеет свой адрес (идентификационный номер) — шестнадцатеричное число, — позволяющий плате Arduino обращаться и взаимодействовать с каждым устройством по отдельности. Обычно устройство имеет на выбор диапазон адресов I2C, который указан в документации к нему. Конкретные доступные адреса определяются подключением контактов IC тем или иным образом.
Ведущее устройство (Uno) отвечает за инициирование обмена. Ведомые устройства не могут инициировать обмен данных, а только отвечают на запросы от ведущего устройства.
Библиотека Wire
Библиотека Wire входит в состав Arduino и используется для работы с шиной I2C.
В скетче сначала необходимо активировать библиотеку, затем в setup() активировать шину.
Поскольку как правило плата Arduino действует как ведущее устройство, ей не нужно присваивать адрес. Если бы плата настраивалась на работу в режиме ведомого устройства, нам пришлось бы присвоить адрес в диапазоне от 0 до 127, передав его как параметр, чтобы уникально идентифицировать плату на шине I2C.
Передача данных по шине осуществляется по одному байту. Чтобы послать байт из платы Arduino в устройство на шине, необходимо вызвать три функции:
- Первая функция инициализирует связь, как показано ниже (где аргумент address — это адрес ведомого устройства на шине в шестнадцатеричном виде, например 0x50):
- Вторая функция посылает 1 байт данных из Arduino в устройство с адресом, указанным в предыдущем вызове функции. Здесь аргумент data — это переменная, содержащая 1 байт данных; вы можете послать несколько байтов, но для каждого байта придётся вызвать Wire.write():
- По завершении передачи данных определённому устройству следует разорвать связь:
Чтобы запросить данные из устройства на шине I2C, инициализируйте связь вызовом Wire.beginTransmission(address) и отправьте запрос Wire.requestFrom(address, x), (где x — количество запрашиваемых байтов данных). Затем с помощью следующей функции нужно сохранить принятый байт в переменной:
По окончании приёма следует разорвать связь вызовом Wire.endTransmission().
Методы библиотеки
begin()
Инициализация библиотеки Wire и подключение к шине I2C в качестве ведущего или ведомого устройства. Как правило, вызывается только один раз.
Параметры
address: 7-битный адрес устройства (если работаем в режиме ведомого). Если не указано, то контроллер подключается к шине в роли ведущего (master).
Возвращаемое значение
Не возвращает значений
requestFrom()
Используется ведущим устройством для запроса байта от ведомого устройства. Байты могут быть получены с помощью методов available() и read().
Параметры
- address: 7-битный адрес устройства для запроса байтов данных
- quantity: количество запрошенных байт
Возвращаемое значение
Возвращает число считанных байт.
beginTransmission()
Начало передачи I2C для ведомого устройства с заданным адресом. Затем, нужно вызвать метод write() для добавления последовательности байт в очередь предназначенных для передачи, и выполнить саму передачу данных методом endTransmission().
Параметры
address: 7-битный адрес устройства для передачи.
Возвращаемое значение
Не возвращает значений
endTransmission()
Завершает передачу данных для ведомого устройства, которое было начато beginTransmission() и, фактически, осуществляет передачу байт, которые были поставлены в очередь методом write().
Параметры
Возвращаемое значение
Возвращает байт, который указывает статус передачи:
- 0: успех
- 1: данных слишком много и они не помещается в буфер передачи/размер буфера задаётся определением #define BUFFER_LENGTH 32
- 2: получили NACK на передачу адреса
- 3: получили NACK на передачу данных
- 4: другая ошибка
write()
Записывает данные от ведомого устройства в ответ на запрос мастера, или записывает очередь байт для передачи от мастера к ведомому устройству (в промежутках между вызовами beginTransmission() и endTransmission()).
Примеры
Параметры
- value: значение для отправления как единичный байт
- string: строка для отправления как последовательность байт
- data: массив байт для отправления
- length: число байт для передачи
Возвращаемое значение
Возвращает число записанных байт.
available()
Метод available() наследуется от класса Stream. Возвращает количество байт, доступных для получения. Этот метод должно быть вызван на мастере, после вызова requestFrom() или ведомым внутри обработчика onReceive().
Параметры
Возвращаемое значение
Число байт, доступных для чтения.
Метод read() наследуется от класса Stream. Считывает байт, который был передан от ведомого устройства к мастеру, после вызова requestFrom() или был передан от мастера к ведомому.
Параметры
Возвращаемое значение
Следующий полученный байт.
Регистрирует функцию, которая вызывается, когда ведомое устройство получает данные от мастера.
Параметры
- function: функция, которая вызывается, когда ведомый получает данные; обработчик должен принимать один параметр — int (число байт, считанных от мастера) и ничего не возвращать. Например:
void MyHandler (int numBytes);
Возвращаемое значение
Не возвращает значений
onRequest()
Регистрирует функцию, которая вызывается, когда мастер запрашивает данные из этого ведомого устройства.
Параметры
- function: функция, которая будет вызываться; не имеет параметров и ничего не возвращает. например:
void MyHandler();
Возвращаемое значение
Не возвращает значений
Узнать адрес
В примерах, где используется I2C, важно использовать правильный адрес. Если у вас устройство, чей адрес вы не знаете, то можете воспользоваться библиотекой i2cdetect, доступный через менеджер библиотек. После установки библиотеки запустите прилагаемый к нему пример и через последовательный монитор увидите нужный адрес.
Также можно запустить собственный скетч.
Проверил на ЖК-экране, чей адрес обычно 0х27.