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)), а не без аргументов.