Главная chevron_right Функции chevron_right Связь chevron_right Wire.onRequest()

Wire.onRequest()

onRequest() регистрирует функцию-обработчик, которую Arduino вызовет автоматически, когда I²C-контроллер запросит данные — внутри обработчика отправляйте ответ через Wire.write().

Полная статья

Описание

onRequest() регистрирует функцию-обработчик, которая будет автоматически вызвана, когда контроллер I²C-шины запросит данные от вашего устройства, работающего в роли периферии. Именно здесь вы описываете, что нужно отправить в ответ на запрос — как правило, вызывая Wire.write() внутри обработчика.

Эта функция является частью библиотеки Wire.

Синтаксис

Wire.onRequest(handler)

Параметры

  • handler: функция обратного вызова, которую нужно вызывать при входящем запросе от контроллера. Функция не принимает параметров и должна возвращать void. Типичная сигнатура: void myHandler().

Возвращает

Ничего.

Пример кода

void setup() {
  Wire.begin(0x08);             // Подключиться к шине I2C как периферийное устройство с адресом 0x08
  Wire.onRequest(requestEvent); // Зарегистрировать функцию обратного вызова
}

void requestEvent() {
  Wire.write("Hello");  // Отправить данные контроллеру
}

Где применяется

  • Периферийное устройство на I²C-шине — когда Arduino отвечает на запросы контроллера, например другой Arduino или одноплатного компьютера.
  • Датчики и модули на заказ — если вы создаёте собственный I²C-модуль на Arduino и хотите, чтобы он возвращал измеренные значения по запросу.
  • Многопроцессорные системы — когда несколько плат Arduino работают вместе, и одна из них собирает данные с остальных по I²C.

Практические замечания

  • Функцию-обработчик обычно регистрируют в setup() сразу после Wire.begin(address), чтобы вся настройка периферийного устройства была в одном месте.
  • Внутри обработчика используйте Wire.write() для отправки данных. Если не вызвать Wire.write(), контроллер получит пустой ответ, что часто воспринимается как ошибка.
  • Обработчик выполняется в контексте прерывания, поэтому не используйте внутри него delay(), Serial.print() и другие блокирующие вызовы. Для отладки сохраняйте данные в глобальную переменную и выводите их в loop().
  • Количество байт, которое ожидает контроллер, определяется на его стороне при вызове Wire.requestFrom(). Если вы отправите меньше байт, чем запрошено, контроллер получит неполный ответ; если больше — лишние байты будут проигнорированы.
  • onRequest() работает только на устройстве, инициализированном как периферийное, то есть Wire.begin() должен быть вызван с адресом (Wire.begin(address)), а не без аргументов.