Ардуино библиотека 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. Но ее можно скачать и отдельно по ссылке ниже.
Скачать Ардуино библиотеку Wire
Для установки библиотеки просто распакуйте zip архив в папку «C:\Program Files (x86)\Arduino\libraries» или в то место, где у васт установлена среда разработки Arduin IDE. Если у вас запущена программа Arduino IDE, то для работы с новой библиотекой её необходимо перезапустить.
begin()
Инициализирует библиотеку Wire и подключается к шине I2C как ведущий (мастер) или ведомый.
Синтаксис
Wire.begin(address);
Параметры
address — Необязательный параметр. 7-битный адрес ведомого устройства; если не задан, плата подключается к шине как мастер.
Возвращаемые значения
Нет
#include <Wire.h> // Подключаем библиотеку
void setup() {
Wire.begin(); // Подключаемся к шине i2c
}
void loop() {
}
requestFrom()
Отправляет запрос на определенное количество байтов от ведущего устройства к ведомому.
Синтаксис
Wire.requestFrom(address, quantity, stop);
Параметры
address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.
quantity — Обязательный параметр. Количество запрашиваемых байт.
stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.
Возвращаемые значения
Количество байт, возвращенных от устройства.
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключиться к шине i2c (адрес для мастера не обязателен)
Serial.begin(9600); // настроить последовательный порт для вывода
}
void loop()
{
Wire.requestFrom(2, 6); // запросить 6 байтов от ведомого устройства #2
while(Wire.available()) // ведомое устройство может послать меньше, чем запрошено
{
char c = Wire.read(); // принять байт как символ
Serial.print(c); // напечатать символ
}
delay(500);
}
beginTransmission()
Открывает канал связи по шине I2C с ведомым устройством.
Синтаксис
Wire.beginTransmission(address);
Параметры
address — Обязательный параметр. 7-ми битный адрес устройства к которому посылается запрос.
Возвращаемые значения
Нет
endTransmission()
Отправляет данные, которые были поставлены в очередь методом write() и завершает передачу.
Синтаксис
Wire.endTransmission(stop)
Параметры
stop — Необязательный параметр. Тип данных boolean. true — после запроса отправляет STOP, освобождая шину I2C. false — после запроса отправляет RESTART. Шина не освобождается и можно отправлять дополнительные запросы. По умолчанию — true.
Возвращаемые значения
byte, который указывает на состояние передачи: 0: успешная передача; 1: Объем данных для передачи слишком велик; 2: принят NACK при передаче адреса; 3: принят NACK при передаче данных; 4: другие ошибки.
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключиться к шине i2c
}
void loop()
{
Wire.beginTransmission(44); // передача на устройство #44 (0x2c) адрес устройства задан в техническом описании
Wire.write(val); // отправить байт значения
Wire.endTransmission(); // остановить передачу
}
write()
Ставит данные в очередь для передачи.
Синтаксис
Wire.write(data, length);
Параметры
data — Обязательный параметр. Байт, срока или массив байтов для передачи.
length - Необязательный параметр. Длинна передаваемого массива данных. Используется только при передаче массива в первом параметре.
Возвращаемые значения
Количество записанных байт
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключиться к шине i2c
}
void loop()
{
Wire.beginTransmission(44); // передача на устройство #44 (0x2c) адрес устройства задан в техническом описании
Wire.write(val); // отправить байт значения
Wire.endTransmission(); // остановить передачу
}
available()
Возвращает количество байт, доступных для чтения.
Синтаксис
Wire.available();
Параметры
Нет
Возвращаемые значения
Количество байт доступных для считывания
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключиться к шине i2c (адрес для мастера не обязателен)
Serial.begin(9600); // настроить последовательный порт для вывода
}
void loop()
{
Wire.requestFrom(2, 6); // запросить 6 байтов от ведомого устройства #2
while(Wire.available()) // ведомое устройство может послать меньше, чем запрошено
{
char c = Wire.read(); // принять байт как символ
Serial.print(c); // напечатать символ
}
delay(500);
}
read()
Считывает байт переданной информации.
Синтаксис
Wire.read();
Параметры
Нет
Возвращаемые значения
Принятый байт
#include <Wire.h>
byte val = 0;
void setup()
{
Wire.begin(); // подключиться к шине i2c (адрес для мастера не обязателен)
Serial.begin(9600); // настроить последовательный порт для вывода
}
void loop()
{
Wire.requestFrom(2, 6); // запросить 6 байтов от ведомого устройства #2
while(Wire.available()) // ведомое устройство может послать меньше, чем запрошено
{
char c = Wire.read(); // принять байт как символ
Serial.print(c); // напечатать символ
}
delay(500);
}
Синтаксис
Параметры
Возвращаемые значения
setClock()
Устанавливает тактовую частоту обмена данными по I2C интерфейсу.
Синтаксис
Wire.setClock(clockFrequency);
Параметры
clockFrequency — Обязательный параметр. Новое значение частоты обмена данными в герцах. Доступные значения: 10000 — медленный режим 100000 — стандартное значение 400000 — быстрый режим 1000000 — быстрый режим плюс 3400000 — высокоскоростной режим Необходимо убедится, что выбранный режим поддерживается вашим процессором, обратившись к документации от производителя.
Возвращаемые значения
Нет
onReceive()
Добавляет функцию обработчик, которая будет выполняться при получении данных от ведущего устройства.
Синтаксис
Wire.onReceive(handler);
Параметры
handler — Имя функции, которая будет выполняться когда ведомое устройство принимает данные. Функция должна принимать один параметр int и ничего не возвращать.
Возвращаемые значения
Нет
#include <Wire.h>
void setup()
{
Wire.begin(8); // подключиться к i2c шине с адресом #8
Wire.onReceive(receiveEvent); // зарегистрировать обработчик события
Serial.begin(9600); // настроить последовательный порт для вывода
}
void loop()
{
delay(100);
}
// функция, которая будет выполняться всякий раз, когда от мастера принимаются данные
// данная функция регистрируется как обработчик события, смотрите setup()
void receiveEvent(int howMany)
{
while (Wire.available()) {
char c = Wire.read(); // принять байт как символ
Serial.print(c); // напечатать символ
}
}
onRequest()
Добавляет функцию обработчик, которая будет выполняться при получении запроса от ведущего устройства.
Синтаксис
Wire.onRequest(handler);
Параметры
handler — Имя функции, которая будет выполняться когда ведомое устройство получает запрос от ведущего. Функция не принимает параметров и ничего не возвращает.
Возвращаемые значения
Нет
#include <Wire.h>
void setup()
{
Wire.begin(8); // подключиться к i2c шине с адресом #8
Wire.onRequest(requestEvent); // зарегистрировать обработчик события
}
void loop()
{
delay(100);
}
// функция, которая будет выполняться всякий раз, когда мастером будут
// запрошены данные
// данная функция регистрируется как обработчик события, смотрите setup()
void requestEvent()
{
Wire.write("hello "); // ответить сообщением
}