Программируем Arduino. Профессиональная работа со скетчами. - страница 77

Шрифт
Интервал

стр.

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

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

В дальнейшем в процессе изучения примеров вы увидите, как пользоваться классами.


Пример библиотеки (радиоприемник TEA5767)

Чтобы показать, как писать библиотеки для Arduino, я возьму программный код, который использовался в главе 7 для работы с УКВ-приемником TEA5767, и превращу его в библиотеку. Скетч очень прост и в основном занимается настройкой библиотеки, тем не менее он служит хорошим примером.

Далее перечислены основные этапы процесса.

1. Определение API.

2. Создание заголовочного файла.

3. Создание файла реализации.

4. Создание файла с ключевыми словами.

5. Создание нескольких примеров.

С точки зрения файлов и папок библиотека включает папку с именем, совпадающим с именем библиотечного класса. В данном случае я выбрал имя TEA5767Radio для библиотеки и класса. Внутри этой папки должны находиться два файла: TEA5767Radio.h и TEA5767Radio.cpp.

При желании можно также создать файл keywords.txt и папку examples, содержащую примеры скетчей, использующих библиотеку. Структура папок для этого примера показана на рис. 15.1.


Рис. 15.1. Структура папок примера проекта


Библиотеку проще использовать, если она находится непосредственно в папке libraries в Arduino IDE, куда устанавливаются другие сторонние библиотеки. Файлы можно править прямо в этой папке. Среда разработки Arduino IDE заметит существование библиотеки только после перезапуска, но после этого любые изменения в содержимом файлов будут учитываться во время сборки проекта автоматически.

Оригинальный скетч, на котором основана библиотека, находится в файле sketch_07_01_I2C_TEA5767, а законченную библиотеку можно загрузить по адресу http://playground.arduino.cc//Main/TEA5767Radio.


Определение API

На первом этапе определяется интерфейс, которым будут пользоваться другие.

Если вам доводилось пользоваться разными библиотеками, вы наверняка заметили, что обычно они соответствуют двум шаблонам. Самый простой иллюстрирует библиотека Narcoleptic. Чтобы задействовать эту библиотеку, достаточно подключить ее и затем обращаться к ее методам, предваряя их имена именем библиотеки Narcoleptic, как в следующем фрагменте:

#include

// и потом где-то в скетче

Narcoleptic.delay(500);

Этот же шаблон использует библиотека Serial. Если библиотека поддерживает только один объект, то применение этого шаблона оправданно. Но если есть вероятность, что в скетче потребуется использовать несколько объектов, то необходим другой подход. Поскольку есть шанс, что к плате Arduino будет подключено более одного радиоприемника, данный пример попадает во вторую категорию.

В таких ситуациях применяется шаблон, сходный с тем, что используется библиотекой SoftwareSerial. Чтобы на одной плате организовать несколько последовательных портов, обслуживаемых программно, скетч создает именованные экземпляры библиотеки SoftwareSerial, используя следующий синтаксис:

#include

SoftwareSerial mySerial(10, 11); // RX, TX

Когда возникнет потребность использовать данный конкретный последовательный порт (связанный с контактами 10 и 11), достаточно создать именованный объект для его обслуживания — в данном случае mySerial — и затем выполнить в него запись, как показано далее:

mySerial.begin(9600);


стр.

Похожие книги