Как сделать свою библиотеку для ардуино

Обновлено: 02.07.2024

На основе примера генератора кода Морзе здесь показано, как сконвертировать его функции в библиотеку (перевод официальной документации [1]). Это позволит другим людям проще использовать код, и проще обновить свой проект, когда Вы улучшите библиотеку. Начнем с простого примера скетча, который генерирует морзянку, мигая светодиодом (после его запуска он постоянно выдает сигнал SOS):

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

Для библиотеки нам нужно как минимум 2 файла: файл заголовка (header file, файл с расширением .h) и файл исходного кода (с расширением .cpp). В заголовочном файле есть определения для библиотеки: в основном здесь кратко описано все, что есть внутри библиотеки; файл исходного кода в то же время содержит действительный код. Назовем нашу библиотеку "Morse", так что заголовочный файл получит имя Morse.h.

[Заголовочный файл библиотеки]

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

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

Примечание: определение класса в заголовке можно рассматривать как пользовательский ТИП (по аналогии с typedef struct), а экземпляр класса можно рассматривать как ПЕРЕМЕННУЮ, которая имеет этот тип. Конструктор предназначен для инициализации этой переменной. Может быть также еще и деструктор, который предназначен для уничтожения переменной класса. Наличие и конструктора, и деструктора необязательно: это зависит от реализации класса.

[Файл исходного кода библиотеки]

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

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

Теперь напишем код для функций библиотеки. Код будет выглядеть точно таким же, как он был в скетче, за исключением того, что к имени функции будет добавлен префикс Morse. и будет использоваться частная переменная _pin вместо глобальной переменной pin. Нужно также добавить подключение заголовочных файлов и текст комментария в начало файла. В результате получится файл исходного кода (модуль) библиотеки:

[Как использовать библиотеку]

Файлы библиотеки готовы. Теперь надо разобраться, как использовать библиотеку в среде разработки Arduino.

Теперь давайте посмотрим, как можно создать скетч, который будет делать то же самое, что и раньше, но с использованием библиотеки:

Очевидно, что есть несколько различий от старого скетча (основанные на том, что некоторая часть кода перемесилась в библиотеку). Кроме того, код значительно сократился, и стал читабельнее. Давайте рассмотрим эти отличия.

Вызов конструктора класса. Второе отличие - как создается переменная класса Morse (в нашем примере мы создаем переменную класса morse):

Когда выполняется эта строка кода (это происходит до вызова функции setup()), то будет вызвана функция конструктора класса Morse, и ей будет передан аргумент (в нашем случае номер цифрового порта 13).

Обратите внимание, что функция setup() теперь пуста; это потому, что вызов pinMode() происходит внутри библиотеки (когда конструктор создает экземпляр переменной класса).

Вызов функций класса. Последнее отличие - функции dot() и dash() вызываются с префиксом из имени экземпляра класса и точки (morse.). У нас может быть несколько экземпляров класса Morse, каждый из них будет использовать свой номер порта. Путем вызова функции с отдельным экземпляром класса, мы указываем, какие экземпляры переменных используются для вызова функции. К примеру, если у нас есть два экземпляра класса:

то внутри вызова morse2.dot(), значение переменной _pin будет 12.

[Подсветка синтаксиса библиотеки]

Если Вы попробуете использовать библиотеку в новом скетче, то не увидите, что наша библиотека не будет подсвечиваться особым образом в редакторе кода Arduino IDE, как это принято для стандартных библиотек (например, для общеизвестной библиотеки Serial). К сожалению, программное обеспечение среды разработки Arduino не может автоматически распознать определения в Вашей библиотеке (что было бы приятной возможностью), так что Вам нужно ей немного в этом помочь. Чтобы настроить подсветку синтаксиса для Вашей библиотеки, создайте файл keywords.txt в каталоге Morse. Его содержимое должно выглядеть так:

В каждой строке должно быть имя ключевого слова, за которым через табуляцию (не через пробелы) должен идти тип ключевого слова. Имя класса должно быть обозначено как KEYWORD1, и это дает оранжевую подкраску; функции (методы) класса должны обозначены как KEYWORD2, и имена функций будут коричневыми. После создания файла keywords.txt в каталоге Morse нужно перезапустить среду разработки Arduino, чтобы она распознала новые ключевые слова.

[Пример кода использования библиотеки]

Вместе с библиотекой полезно предоставить пример скетча с демонстрацией использования библиотеки. Для этого в директории Morse создайте подкаталог examples. Затем скопируйте или переместите папку, содержащую код скетча (пусть эта папка называется SOS), в папку examples. Где находится копируемый скетч можно узнать из меню Sketch -> Show Sketch Folder (Скетч -> Показать папку скетчей). Если после этого Вы еще раз перезапустите среду разработки Arduino, то в меню File -> Sketchbook -> Examples (Файл -> Примеры) увидите Morse, и внутри неё пример SOS. Также для кода примера можно создать дополнительные комментарии, чтобы лучше разъяснить, как использовать Вашу библиотеку.

Как преобразовать строку в int в C++

Программирование и разработка

Что такое библиотека Arduino?

Библиотеки — это набор предварительно скомпилированного, многократно используемого кода или подпрограмм, которые используются разработчиками для сокращения времени разработки. Библиотеки Arduino написаны на C или C ++. Эти библиотеки предоставляют нам удобный способ поделиться кодом. Arduino IDE уже состоит из набора стандартных библиотек, их можно использовать для часто используемых функций. Помимо стандартных библиотек, можно создать собственную библиотеку.
Эта статья посвящена обсуждению того, как создать собственную библиотеку Arduino.

Зачем создавать библиотеку Arduino?

Хотя в Arduino есть стандартные библиотеки, разработчики должны создавать свои собственные библиотеки на основе требований своего проекта. Ниже приведены некоторые преимущества создания и использования нашей библиотеки.

  1. Пользовательские библиотеки предоставляют дополнительные функции.
  2. Объединяет схожие функции вместе.
  3. Уменьшенный размер кода.
  4. Легко поделиться (полезно в групповых проектах).
  5. Пониженная сложность кода.

Шаги по написанию кода и созданию библиотеки Arduino с использованием C ++

  • my_library.h — это файл заголовка. Заголовочный файл должен состоять только из объявлений, связанных с библиотекой.
  • my_library.cpp — это файл C ++. Файл C ++ содержит все определения функций, объявленных в my_library.h

Наша библиотека DC_Motor успешно создана.

Упакуйте свою библиотеку Arduino

Выполните следующие действия, чтобы поместить настраиваемую библиотеку Arduino в папку библиотеки Arduino.

Шаг 2: В этой папке библиотек находятся все стандартные библиотеки, имеющиеся в Arduino. Скопируйте папку DC_Motor и вставьте ее сюда, в папку с библиотеками.

В этой папке библиотек находятся все стандартные библиотеки, имеющиеся в Arduino

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

Поделитесь своей библиотекой Arduino

Чтобы поделиться библиотекой Arduino, нужно выполнить два шага:

1. Экспорт библиотеки: чтобы экспортировать и поделиться своей библиотекой, создайте архив в папке DC_Motor /, находящейся в Arduino / libraries /. Этим архивным файлом можно легко поделиться с другими людьми в Интернете. Можно легко найти веб-сайты для размещения архивов вашей библиотеки.

2. Импорт библиотеки Arduino: эти шаги будут работать, когда архив.zip (не.rar или другие расширения) создается при экспорте библиотеки.

Шаг 1: Откройте IDE Arduino.

Шаг 2: Нажмите Sketch-> Include Library-> Add.ZIP Library… и найдите свой архив.zip.

IDE Arduino распакует архив и поместит импортированную библиотеку в папку

IDE Arduino распакует архив и поместит импортированную библиотеку в папку Arduino / libraries / и обновит себя. Нет необходимости перезапускать его.

Как включить в код созданную библиотеку Arduino

Есть два способа включить библиотеку Arduino в код:

Шаг 1:Откройте Arduino IDE.

Шаг 2:Создайте новый эскиз.

Шаг 3:Щелкните меню эскиза внутри строки меню.

Теперь наша библиотека успешно включена в текущий проект

Теперь наша библиотека успешно включена в текущий проект.

Шаг 1:Создайте скетч Arduino внутри самой папки библиотеки DC_Motor.

Здесь мы указываем путь к файлу заголовка

Как использовать созданную библиотеку Arduino

В этом разделе обсуждается, как использовать созданную библиотеку. Следуйте инструкциям ниже:

Привет! В прошлый раз мы начали знакомство с объектно-ориентированным программированием для Ардуино. В этой теме можно написать много статей и уроков. Мы будем постепенно раскрывать эту область программирования. А сегодня посмотрим, что такое библиотека для программы на Ардуино и оформим класс led из предыдущего урока для использования кода в любом проекте.

Предыдущий урок, в котором мы написали первый класс и начали разговор про объектно-ориентированное программирование моно найти по ссылке .

Сегодня создадим простейшую библиотеку для управления светодиодом на основе класса из предыдущего урока.

Библиотека

В целом, наша библиотека уже создана. Нам нужно только оформить все файлы правильно и добавить несколько необходимых строк кода. Которые не будут менять смысла уже написанных команд в нашем классе.

В первую очередь, нам нужно отделить описание библиотеки от реализации методов класса на два разных файла.

Главный файл библиотеки будет иметь расширение .h

Его мы будем подключать к основной программе. И уже он будет загружать необходимые для нашей библиотеки файлы с кодом и любые другие нужные файлы.

Возьмем описание нашего класса led и сохраним его в отдельный файл led.h

Этот код описывает наш класс led. В нем содержится информация о публичных и приватных методах и свойствах класса. В нашем случае это конструктор, два метода и приватная переменная для номера пина.

Дополним описание класса необходимыми директивами для создания библиотеки и комментариями.

/*
Led.h - Library for turn LED on and off.
Created by Valentin, 18.10.2021.
Released into the public domain.
*/
ifndef Led_h
define Led_h
include "Arduino.h"
class Led public:
Led(int pin);
void on();
void off();
private:
int _pin;
protected:
>;
endif

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

Конструкция ifndef предотвратит загрузку библиотеки несколько раз, если разработчик попробует это сделать.

А подключение файла Arduino позволит использовать стандартные функции языка.

Реализация методов

Теперь подключим код реализации методов класса. Сам код у нас уже есть. Создадим для него отдельный файл с расширением .cpp

/*
Led.cpp - Library for turn LED on and off.
Created by Valentin, 18.10.2021.
Released into the public domain.
*/
include "Arduino.h"
include "led.h"

Led::Led(int pin) pinMode(pin, OUTPUT);
_pin = pin;
>
void Led::on() digitalWrite(_pin, HIGH);
>
void Led::off() digitalWrite(_pin, LOW);
>

В файл led.cpp вставим код реализации методов класса и подключим файлы заголовка и стандартных функций Ардуино.

Вот и все, что требуется для написания своей простой библиотеки.

Теперь, в основном тексте программы мы можем подключить библиотеку, и использовать методы, которые она предоставляет.

Заключение

В этом уроке мы написали простейшую библиотеку на основе нашего класса led. Теперь мы сможем организовать код для проектов с использованием концепции объектно-ориентированного программирования. И уже в следующем уроке попробуем написать новую библиотеку для генератора кода морзе на Ардуино.

Arduino IDE: учимся создавать библиотеки

Каждый, кто программировал в среде разработки Arduino IDE, сталкивался с подключением различных библиотек. Но задумывались вы о том, что можно написать собственную? Сегодня мы рассмотрим, зачем же нужны библиотеки и как их можно написать.

Определение и установка

Библиотека — это программный код, хранящийся в файлах, который после подключения можно использовать в скетч. Иными словами, объемный код в вашем скетче можно сократить, сделав его более удобным и понятным. Хранятся библиотеки в папке libraries (например, C:\Program Files (x86)\Arduino\libraries).

Один из способов установить — поместить папку библиотеки в папку libraries.

Структура

Давайте рассмотрим основные составляющие библиотеки на примере Stepper для подключения шаговых двигателей. Состоит она из самой папки Stepper внутри которой находятся:

  • Папка с примерами examples.
  • Текстовый файл keywords для подсветки синтаксиса.
  • И папка src, внутри которой находятся заголовочный файл Stepper.cpp и файл реализации Stepper.h.

Файл с расширением .h (в нашем примере Stepper.h) подключается и подтягивает к себе остальные. Все файлы и папки, кроме заголовочного .h, не обязательны.

Подключение

Давайте напишем библиотеку, которая плавно зажигает/тушит светодиод с возможностью устанавливать скорость процесса. Для этого создадим папку “Flare” с заголовочным файлом с файлом реализации.

Заголовочный файл

Создадим в блокноте и назовем наш заголовочный файл Flare.h. Файл содержит класс, в котором объявляются функции и используемые переменные. Они могут быть публичными, т.е. доступные всем, использующим библиотеку, или приватными, т.е. доступными только внутри класса.

Содержимое заголовочного файла заключают в следующую конструкцию:


Файл реализации

Создадим в блокноте и назовем наш заголовочный файл Flare.cpp


Пример:

Предварительно загрузив библиотеку в нужную папку, подключим светодиод к 3 пину и подадим команду медленно зажигаться и быстро потухать.

Читайте также: