- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программируем Arduino. Основы работы со скетчами - Монк Саймон
Шрифт:
Интервал:
Закладка:
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
flashing = ! flashing;
// и выключить светодиод
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
}
long now = millis();
if (flashing && now > lastChangeTime + period)
{
ledState = ! ledState;
digitalWrite(ledPin, ledState);
lastChangeTime = now;
}
}
В этом скетче я добавил две новые переменные, lastChangeTime и ledState. Переменная lastChangeTime хранит время последнего перехода светодиода между состояниями «включено» и «выключено», а переменная ledState хранит текущее состояние светодиода — «включено» или «выключено», чтобы знать, в каком состоянии он пребывает, когда потребуется переключить его.
Теперь функция loop не выполняет задержек. В первой части loop проверяется нажатие кнопки, и, если кнопка нажата, переключается режим мигания. Дополнительная инструкция if, следующая далее, просто выключает светодиод, если нажатие кнопки вызвало выключение режима мигания. В противном случае светодиод мог бы остаться включенным:
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
Во второй части функция loop читает текущее значение счетчика миллисекунд вызовом millis() и сравнивает со значением lastChangeTime, увеличенным на значение period. То есть код внутри этой инструкции if выполняется, только если с момента последнего переключения светодиода прошло более period миллисекунд.
Затем значение переменной ledState изменяется на противоположное, и на цифровом выходе устанавливается соответствующий уровень напряжения. Потом значение now копируется в lastChangeTime, чтобы можно было определить, когда наступит момент следующего переключения.
Библиотека Timer
Решение, представленное в разделе «Пауза без приостановки», было обобщено и реализовано в виде библиотеки, позволяющей планировать выполнение повторяющихся операций с использованием функции millis. Несмотря на свое название, библиотека не использует аппаратные таймеры и потому прекрасно работает в большинстве моделей Arduino.
Получить библиотеку можно по адресу http://playground.arduino.cc//Code/Timer.
Применение библиотеки может существенно упростить код, как показано далее:
// sketch_14_03_flashing_3
#include <Timer.h>
const int ledPin = 13;
const int switchPin = 5;
const int period = 1000;
boolean flashing = false;
int ledState = LOW;
Timer t;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
t.every(period, flashIfRequired);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
flashing = ! flashing;
if (! flashing)
{
digitalWrite(ledPin, LOW);
}
}
t.update();
}
void flashIfRequired()
{
if (flashing)
{
ledState = ! ledState;
digitalWrite(ledPin, ledState);
}
}
Чтобы задействовать возможности библиотеки, необходимо определить объект таймера (в данном скетче он получил имя t) и в функции setup указать функцию для вызова через установленные периоды:
t.every(period, flashIfRequired);
Затем нужно добавить в функцию loop следующую строку:
t.update();
В каждом вызове функция update проверит значение millis, определит необходимость выполнения повторяющихся действий и, если пришло время для этого, вызовет указанную функцию (в данном случае flashIfRequired).
Библиотека Timer имеет также множество других вспомогательных функций. Более подробную информацию о ней можно найти, если пройти по ссылке, приведенной в начале раздела.
В заключение
В этой главе вы узнали, как организовать решение сразу нескольких задач без использования механизма потоков выполнения. Для этого достаточно рассмотреть ограничения, накладываемые микроконтроллером, под другим углом.
В заключительной главе вы узнаете, как поделиться своими разработками с сообществом Arduino, создавая и публикуя библиотеки для Arduino.
15. Создание библиотек
Рано или поздно вы создадите нечто замечательное, что, по вашему мнению, могли бы использовать другие. Это будет самый подходящий момент оформить свой код в виде библиотеки и выпустить ее в свет. Эта глава покажет вам, как это сделать.
Когда создавать библиотеки
Библиотеки создаются не только разработчиками Arduino — любой пользователь Arduino может создать свою библиотеку. Если библиотека окажется по-настоящему полезной, в адрес ее создателя потечет поток благодарностей. Никто не занимается продажей библиотек, так как это противоречит ценностям сообщества Arduino. Библиотеки должны публиковаться с открытым исходным кодом и рассматриваться как помощь своим собратьям по увлечению Arduino.
Часто наиболее полезными оказываются библиотеки, дающие доступ к некоторому аппаратному обеспечению. Они нередко упрощают процесс использования аппаратных средств и некоторых сложных протоколов. Нет причин, почему более одного человека должны преодолевать тернистый путь, выясняя, как работает некоторая аппаратура, и, если вы опубликуете свою библиотеку, благодаря Интернету люди смогут отыскать ее.
СОВЕТ
Прикладной программный интерфейс (Application Programmer Interface, API) — это комплект функций, которые пользователь библиотеки будет включать в свой скетч. Проектируя API, всегда задавайте себе вопрос: «Что действительно волнует пользователя?» Низкоуровневые детали реализации должны быть максимально скрыты. В примере библиотеки, который будет представлен в разделе «Пример библиотеки (радиоприемник TEA5767)», мы продолжим обсуждение этой проблемы.
Использование классов и методов
Создатели скетчей обычно полагают, что пишут код на языке C, и используют довольно ограниченный круг возможностей, в действительности скетчи пишутся на языке C++, объектно-ориентированном расширении языка C. В этом языке используется понятие классов объектов, объединяющих информацию об объектах (их данные) и функции, которые применяются к этим данным. Эти функции похожи на обычные функции, но, когда они ассоциируются с конкретным классом, их называют методами. Кроме того, методы могут объявляться общедоступными, и тогда они доступны всем, кто пользуется ими, или приватными, и тогда они доступны только из методов внутри класса.
Я говорю об этом, потому что создание расширений — один из немногих видов деятельности в мире Arduino, где использование классов считается нормой. Класс — отличный способ заключить все необходимое в некое подобие модуля. Кроме того, различия между закрытыми и общедоступными членами помогают спроектировать API так, чтобы заставить разработчиков скетчей думать о том, как взаимодействовать с библиотекой (общедоступные члены), а не о том, как она работает (приватные члены).
В дальнейшем в процессе изучения примеров вы увидите, как пользоваться классами.
Пример библиотеки (радиоприемник TEA5767)
Чтобы показать, как писать библиотеки для Arduino, я возьму программный код, который использовался в главе 7 для работы с УКВ-приемником TEA5767, и превращу его в библиотеку. Скетч очень прост и в основном занимается настройкой библиотеки, тем не менее он служит хорошим примером.
Далее перечислены основные этапы процесса.
1. Определение API.
2. Создание заголовочного файла.
3. Создание файла реализации.
4. Создание файла с ключевыми словами.
5. Создание нескольких примеров.
С точки зрения файлов и папок библиотека включает папку с именем, совпадающим с именем библиотечного класса. В данном случае я выбрал имя TEA5767Radio для библиотеки и класса. Внутри этой папки должны находиться два файла: TEA5767Radio.h и TEA5767Radio.cpp.

