Разберемся, как создать свою собственную библиотеку для Arduino. Начнем с эскиза, который позволит мигать кодом Морзе и объясним, как преобразовать его функции в библиотеку. Это позволит пользователю, подключив библиотеку, использовать написанный код и легко обновлять его при обновлении библиотеки.

Начнем с эскиза, который воспроизводит код Морзе:

При запуске программы мы получим на выводе 13 цифровой сигнал — код SOS (сигнал бедствия).

В эскизе есть несколько частей, которые необходимо будет внести в нашу библиотеку. Во-первых, у нас есть две функции dot() и dash(), которые обеспечивают «мигание» на выходе. Во-вторых, есть переменная ledPin, которая указывает функциям, какой пин использовать. Наконец, есть вызов pinMode(), который инициализирует пин в качестве вывода.

Давайте начнем превращать эскиз в библиотеку!

Вам нужно как минимум два файла для библиотеки: заголовочный файл (с расширением .h) и исходный файл (с расширением .cpp). Файл заголовка имеет определения для библиотеки: в основном список всего, что находится внутри; в то время, как исходный файл имеет фактический код. Мы будем называть нашу библиотеку «Morse», поэтому нашим заголовочным файлом будет Morse.h. Давайте посмотрим, что в нем происходит. Сначала он может показаться немного странным, но смысл станет понятен, если посмотреть исходный файл, который будет с ним работать.

Ядро файла заголовка состоит из строк для каждой функции в библиотеке, завернутой в класс вместе с различными переменными, которые вам нужны:

Класс — это просто набор функций и переменных, которые хранятся в одном месте. Эти функции и переменные могут быть общедоступными (public) , что означает, что к ним могут обращаться люди, использующие вашу библиотеку, или частные (private), то есть они могут быть доступны только из самого класса. Каждый класс имеет специальную функцию, называемую конструктором, которая используется для создания экземпляра класса. Конструктор имеет то же имя, что и класс, но не имеет возвращаемого значения.

Вам нужно еще несколько вещей в файле заголовка. Один из них — это оператор #include, который дает вам доступ к стандартным типам и константам языка Arduino (это автоматически добавляется к эскизам, но не к библиотекам). Это выглядит так (и идет выше определения класса, данного ранее):

И второе — обычно весь заголовочный файл «обертывается» в следующую конструкцию:

Данная конструкция предотвращает проблемы, если кто-то случайно подключит  вашу библиотеку дважды.

Обычно в верхней части библиотеки помещается комментарий, содержащий имя библиотеки, краткое описание того, что она делает, кто ее написал, дату и лицензию.

В конечном итоге получаем файл, следующего содержания:

Теперь давайте рассмотрим различные части исходного файла Morse.cpp.

Сначала указывается пара операторов #include. Они предоставляют доступ ко всем стандартным функциям Arduino и определениям в вашем файле-заголовке:

Затем пишется конструктор. Конструктор показывает, что должно произойти, когда кто-то создает экземпляр вашего класса. В нашем случае пользователь указывает, какой пин он хотел бы использовать. Мы настраиваем пин в качестве вывода, сохраняем его в частной переменной для использования в других функциях:

Рассмотрим некоторые особенности данного кода. Прежде всего это Morse :: перед именем функции. Такая запись говорит о том, что эта функция является частью класса Morse. Вы увидите это снова в других функциях класса. Вторая необычная вещь — это символ подчеркивания в имени нашей частной переменной _pin . Эта переменная может иметь любое имя, которое вы хотите, если оно соответствует определению в файле-заголовке. Добавление подчеркивания к началу имени является общим соглашением, позволяющим понять, какие переменные являются частными, а также отличать имя от имени аргумента функции ( в нашем случае — pin).

Далее идет код из эскиза, который мы переводим в библиотеку. Код выглядит примерно так же, как в скетче. Только добавляется Morse :: перед именами функций и  _pin вместо pin :

Обычно в верхней части исходного файла включают комментарий. Выглядит это следующим образом:

A source: btcqrcode.ru