МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ УЧРЕЖДЕНИЕ
ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
МУНИЦИПАЛЬНОГО ОБРАЗОВАНИЯ ГОРОД КРАСНОДАР
«МЕЖШКОЛЬНЫЙ ЭСТЕТИЧЕСКИЙ ЦЕНТР»-
АССОЦИИРОВАННАЯ ШКОЛА ЮНЕСКО
ПЛАН-КОНСПЕКТ ЗАНЯТИЯ
Тема: "Написание собственных функций и библиотек"
Автор: Никита Олегович Шевцов,
педагог дополнительного образования
Краснодар, 2021
ПЛАН-КОНСПЕКТ
Тема: "Написание собственных функций и библиотек"
Вопросы для рассмотрения:
1. Пример скетча
2. Процесс конвертации скетча в библиотеку.
3. Заголовочный файл.
4. Файл реализации
5. Использование библиотеки
6. Отличия
7. Задание для детей.
ХОД ЗАНЯТИЯ
В начале занятия необходимо проверить наличие у детей тетрадок, ручек.
Дать под запись дату. Озвучить тему занятия, что она подразумевает. Дети включают компьютеры, начало рассмотрения вопросов.
Пример скетча
Скетч, воспроизводящий код Морзе:
int pin = 13; |
|
void setup() |
{ |
pinMode(pin, OUTPUT); |
} |
|
void loop() |
{ |
dot(); dot(); dot(); |
dash(); dash(); dash(); |
dot(); dot(); dot(); |
delay(3000); |
} |
|
void dot() |
{ |
digitalWrite(pin, HIGH); |
delay(250); |
digitalWrite(pin, LOW); |
delay(250); |
} |
|
void dash() |
{ |
digitalWrite(pin, HIGH); |
delay(1000); |
digitalWrite(pin, LOW); |
delay(250); |
} |
Данный скетч посредством мигания светодиода на выводе 13 выдает сигнал SOS.
Скетч содержит ряд частей кода, которые необходимо будет перенести в библиотеку. Во-первых, это функции dot() и dash(), которые управляют миганием светодиода. Во-вторых, это переменная ledPin, определяющая какой порт ввод/вывода использовать. И наконец, вызов функции pinMode(), устанавливающий режим вывода на используемом порту ввода/вывода.
Библиотека содержит два файла: заголовочный файл (с расширением .h) и файлы реализации (с расширением .cpp). Заголовочный файл содержит характеристики библиотеки, т.е. список всего что содержится в ней. Создаваемый заголовочный файл будет называться Morse.h. Для дальнейшей работы с заголовочным файлом необходимо просмотреть содержание файла реализации.
Заголовочный файл содержит класс, в котором объявляются функций и используемые переменные:
class Morse |
{ |
public: |
Morse(int pin); |
void dot(); |
void dash(); |
private: |
int _pin; |
}; |
Класс в данном случае это набор функций и переменных, объеденных в одном месте. Функции и переменные могут быть публичными (public), что означает общий доступ к ним всех, кто использует библиотеку, или частными (private), что означает доступ к ним только внутри класса. Каждый класс имеет специальную функцию конструктор, которая используется для создания экземпляра класса. Конструктор имеет тоже имя, что и класс, но не имеет типа возвращаемого значения.
Также заголовочный файл содержит еще несколько дополнительных строк. Во-первых, это директива #include, которая дает доступ к стандартным типам и постоянным языка программирования Arduino (директива по умолчанию добавляется к каждому скетчу, но не к библиотеке). Директива выглядит следующим образом (и находится выше объявления класса):
#include "WProgram.h" |
В версиях Arduino 1.0 и выше нужно еще добавить:
#include Arduino.h |
Также принято заключать содержимое заголовочного файла в следующую конструкцию:
#ifndef Morse_h |
#define Morse_h |
|
// директивы #include и код помещается здесь |
|
#endif |
Это предотвращает повторное подключение нашей библиотеки, если кто-то по ошибке дважды подключит библиотеку директивой #include.
Заголовочный файл
В начале кода библиотеки принято помещать комментарий о ее предназначении, авторе, дате и лицензии на библиотеку.
Готовый заголовочный файл содержит:
#ifndef Morse_h |
#define Morse_h |
|
#include "WProgram.h" |
|
class Morse |
{ |
public: |
Morse(int pin); |
void dot(); |
void dash(); |
private: |
int _pin; |
}; |
|
#endif |
Файл реализации
Рассмотрим файл реализации Morse.cpp.
В начале кода находятся несколько директив #include. Данными директивами разрешается доступ к стандартным функциям Arduino и к характеристикам в головном файле библиотеки:
#include "WProgram.h" |
#include "Morse.h" |
Далее по коду находится конструктор. Он используется для создания экземпляра создаваемого класса. В данном случае пользователь задает номер используемого порта ввода/вывода через параметр. Порта устанавливается в режим вывода, а номер сохраняется в частной переменной для использования в других функциях:
Morse::Morse(int pin) |
{ |
pinMode(pin, OUTPUT); |
_pin = pin; |
} |
Код Morse:: означает, что функция принадлежит классу Morse. Нижний пробел в начале имени переменной _pin — принятое обозначение для частных переменных. Вообще, имя может быть любое, но согласно принятым конвенциям именования для частных переменных принято использовать префикс "_". Это также позволяет отличить от аргумента функции (в данном случае pin).
Далее код, который конвертируется в библиотеку из изначального скетча, добавилось только Morse:: и изменилось имя переменной с pin, на _pin:
void Morse::dot() |
{ |
digitalWrite(_pin, HIGH); |
delay(250); |
digitalWrite(_pin, LOW); |
delay(250); |
} |
|
void Morse::dash() |
{ |
digitalWrite(_pin, HIGH); |
delay(1000); |
digitalWrite(_pin, LOW); |
delay(250); |
} |
Общепринято помещать некоторые поясняющие комментарии в начале кода файла реализации. Полный код библиотеки:
|
#include "WProgram.h" |
#include "Morse.h" |
|
Morse::Morse(int pin) |
{ |
pinMode(pin, OUTPUT); |
_pin = pin; |
} |
|
void Morse::dot() |
{ |
digitalWrite(_pin, HIGH); |
delay(250); |
digitalWrite(_pin, LOW); |
delay(250); |
} |
|
void Morse::dash() |
{ |
digitalWrite(_pin, HIGH); |
delay(1000); |
digitalWrite(_pin, LOW); |
delay(250); |
} |
Во-первых, необходимо создать папку Morse в подпапке libraries директории блокнота. Во-вторых, требуется скопировать файлы Morse.h и Morse.cpp в созданную папку. После запуска программы Arduino в меню Sketch > ImportLibrary будет находиться библиотека Morse. Библиотека будет компилироваться совместно со скетчами, использующими ее. Если при компиляции библиотеки возникли проблемы, то необходимо проверить, чтобы ее файлы были с расширениями .cpp и .h (не должно быть никаких дополнительных расширений .pde и .txt).
Изначальный скетч, переписанный с использованием созданной библиотеки, будет выглядеть следующим образом:
#include <Morse.h> |
|
Morse morse(13); |
|
void setup() |
{ |
} |
|
void loop() |
{ |
morse.dot(); morse.dot(); morse.dot(); |
morse.dash(); morse.dash(); morse.dash(); |
morse.dot(); morse.dot(); morse.dot(); |
delay(3000); |
} |
Отличия от первоначального скетча
Несколько отличий от изначального скетча:
Во-первых, добавлена директивы #include в начало скетча. Таким образом определяется доступность библиотеки Morse и ее подключение. Неиспользуемую библиотеку можно удалить, убрав директиву #include.
Во-вторых, создается экземпляр класса Morse, называемый morse:
Morse morse(13); |
При выполнении данной строки (перед выполнением функции setup()) вызывается конструктор для класса Morse и принимает аргумент, данный в примере (13).
При этом функция setup() ничего не содержит, т.к. вызов функции pinMode() произошел внутри библиотеки (когда был создан экземпляр класса).
В-третьих, для вызова функций dot() и dash() необходимо прибавить префикс morse. – имя используемого экземпляра. Может быть несколько экземпляров класса Morse, каждый со своим номером порта, хранящимся в локальной переменной _pin. Вызовом функции конкретного экземпляра определяются какие переменные, используются во время вызова. При наличии следующих двух строк:
Morse morse(13); |
Morse morse2(12); |
внутри вызова morse2.dot(), переменная _pin будет иметь значение 12.
К сожалению автоматическая подсветка кода не работает с подключаемыми библиотеками. Для того чтобы подсветка заработала необходимо создать файл с названием keywords.txt. Пример:
Morse KEYWORD1 |
dash KEYWORD2 |
dot KEYWORD2 |
Напротив каждой строки через табуляцию стоит зарезервированное слово, и опять через табуляцию тип слова. Классы соответствуют зарезервированному слову KEYWORD1 и окрашены в оранжевый цвет; функции – KEYWORD2 и окрашены в коричневый. Для распознавания слов необходимо перезапустить среду разработки Arduino.
Созданную библиотеку желательно всегда сопровождают примером ее применения. Для этого создается папка examples в директории Morse. Затем копируется созданный ранее скетч SOS в данную папку. (Файл скетча можно найти через меню Sketch > ShowSketchFolder). После перезапуска Arduino в меню File > Sketchbook > Examples будет находиться пунктLibrary-Morse, содержащий пример. Также необходимо добавить комментарии о том, как лучше использовать библиотеку.
Заключительная часть занятия
Рефлексия. Итоговый опрос.
Задание: совместно с преподавателем создать библиотеку с ПИД регулятором.
Скачано с www.znanio.ru
© ООО «Знанио»
С вами с 2009 года.