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. Но ее можно скачать и отдельно по ссылке ниже.

Скачать Ардуино библиотеку 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 "); // ответить сообщением
}

Ардуино