- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Занимательная электроника - Юрий Ревич
Шрифт:
Интервал:
Закладка:
Любая программа в среде Arduino состоит из трех основных блоков: блока определений, функции установок и бесконечного цикла, который и составляет собственно программу. Эти блоки полностью аналогичны структуре нашей ассемблерной программы (см. главу 19, где с блока определений начиналась программа, функция установок у нас следовала за меткой Reset, а бесконечный цикл заключал текст, который выполняется вне прерываний (у нас — то, что между меткой Cykle: и оператором rjmp Cykle). Явное использование прерываний в программах Arduino — скорее исключение, что относится к числу недостатков этой платформы (и мы еще будем об этом говорить).
* * *
Подробности
Но было бы ошибкой считать, что прерывания в Arduino не используются вовсе. Например, в Arduino отсчет времени реализован совершенно так же, как мы делали в главе 19, только не с помощью Time1, как у нас, а через восьмиразрядный Timer0. Здесь тоже устанавливается прерывание таймера по переполнению и тоже с коэффициентом предделителя 64. При обычной тактовой частоте Arduino, равной 16 МГц, прерывания переполнения восьмиразрядного таймера происходят каждые (64/16)·256 = 1024 микросекунды, что позволяет реализовать такие функции, как millis () или delay (). Самый частый отсчет возможен при таком коэффициенте каждые 4 микросекунды, что обуславливает приведенное в справочнике по функциям Arduino максимальное разрешение функции отсчета микросекунд micros (). Любопытно, что задержка в микросекундах (т. е. функция delayMicroseconds ()) при этом реализована в виде простой программной задержки, как мы делали в первом примере главы 19. Функции коммуникационного порта, кстати, также основаны на прерываниях (см. далее).
* * *
Блок определений содержит обычные для почти любого языка программирования ссылки на включаемые библиотеки и определения переменных, например:
#include <LiquidCrystal.h> //подключаем библиотеку для работы со строчным ЖК-индикатором
int i; //переменная i — 16-разрядный счетчик
byte temp = 0; //рабочая переменная типа byte
float temperature; //переменная — действительное число для значения температуры
Определение наименований выводов, как констант:
#define dataPin 16 //dataPin — цифровой вывод 16[40] (т. е. вывод А2 платы, см. далее)
Выводы можно определять и как переменные целого типа:
int ledPin =3; // цифровой выход управления светодиодом
Строчные и заглавные буквы здесь различаются, например, string () и String () — это разные функции (см. справочник по языку на сайте [23]). В языке С любые определения можно делать в любом месте программы, выносить их в начало необязательно. Только стоит учесть, что, например, вызов переменной, определенной внутри некоей функции (локальная переменная), в другой функции вызовет сообщение об ошибке. Для того чтобы переменная действовала для всей программы, она должна быть определена именно в начале, до всех функций (глобальная переменная). Нюанс заключается в том, что глобальная переменная займет ресурсы контроллера на все время работы программы, тогда как локальная освободит их по окончании действия функции. В условиях ограниченных ресурсов МК это может оказаться существенным фактором, влияющим на скорость выполнения программы.
Наша процедура Reset (блок установок) здесь выглядит, как функция setup:
void setup()
{
< операторы >
}
Следует заметить, что в языке С служебное слово void («пустота») обозначает, что за ним последует то, что в человеческом языке носит название «процедура» — т. е. функция, не возвращающая никакого значения. Между фигурными скобками здесь размещаются те операторы, которые должны выполняться при запуске программы один раз. После setup обычно идет функция (на самом деле тоже процедура) бесконечного цикла, которая обозначается словом loop («петля»):
void loop()
{
< операторы >
}
Кроме этих двух обязательных функций, программа для Arduino может включать в себя любое количество других функций (или процедур), определяемых пользователем, и примеры этого мы увидим далее.
В заключение нашего суперкраткого обзора программирования для Arduino стоит напомнить про некоторые особенности логических операций в языке С, которые почти не играют роли в обычном программировании, но в приложении к микроконтроллерам имеют важное значение. Это касается выполнения базовых логических функций «И», «ИЛИ» и «НЕ» о которых мы упоминали в главе 14 (см. также [25]).
В языке С имеются две разновидности логических операций: обычные («логическое И» &&, «логическое ИЛИ» ||, «логическое НЕ»!) и поразрядные битовые («поразрядное И» &, «поразрядное ИЛИ» |, «поразрядное НЕ» ~). Теперь вы можете с полным пониманием отнестись к этому разделению: обычные логические операции относятся к булевым переменным (т. е. таким, которые принимают только два значения: «ноль»/«не ноль», «ложь»/«правда»), а поразрядные — к числовым переменным, т. е. попросту к нашим родным регистрам контроллера.
В условных операторах (if) должна присутствовать чисто логическая операция с бинарным исходом («правда» — «ложь»), потому там надо ставить символы логических операций, а вот в операциях с числами и регистрами — поразрядных. Например, значок неравенства в языке С запишется, как «!=» (буквально и значит «не равно»), а запись «~=» будет бессмысленной. Но одинарные символы (& вместо положенного && или | вместо положенного ||) все равно часто ставят в условном операторе if, потому что там обычно фигурируют бинарные операции, вроде операций сравнения («больше», «меньше», «равно», «не равно» и т. п.), которые сами по себе в результате дают логическое значение. То есть они фактически состоят из одного двоичного разряда, и применение к ним побитовой операции даст ровно тот же результат, что и обычной логической.
Термостат на ArduinoДавайте соорудим для начала на Arduino что-нибудь простенькое. В главе 12 мы уже изобретали термостаты на чисто аналоговых компонентах. Теперь посмотрим, как можно привлечь к этому полезному в хозяйстве делу цифровую технику.
Мы уже упоминали (см. главу 18), что в состав AVR-контроллеров входит 10-разрядный многоканальный АЦП. На платах Arduino его выводы специально помечены, как аналоговые входы (буквой А с цифрами от нуля до пяти). Заметьте, что они могут быть задействованы и как обычные цифровые с номерами от 14 до 18, и мы в таком качестве ими еще воспользуемся. Один из этих входов мы как раз и применим для измерения температуры, а управлять подключением нагрузки будем с одного из цифровых выходов.
Итого нам понадобятся:
□ плата Arduino Uno (годится и любая другая);
Я термистор в качестве датчика температуры. Подойдет, например, имеющийся
□ «Амперке» В57164-К 103-J с номинальным сопротивлением 10 кОм при 25 °C — именно его характеристики приведены в главе 13 в качестве иллюстрации к свойствам термисторов;
□ переменный резистор 10 кОм, постоянный резистор 620 Ом;
□ исполнительное реле — электромагнитное (обязательно с усилительным транзисторным ключом, см. далее) или твердотельное.
В продаже имеются модули на основе 5-вольтовых электромагнитных реле, специально подогнанных под управление от выходов Arduino. Электромагнитные реле сами по себе требуют довольно большого тока управления (и он тем больше, чем мощнее реле, — непосредственно от логики могут работать только самые маломощные герконовые реле), потому во всех подобных релейных модулях обязательно имеется транзисторный усилительный ключ[41]. Например, в «Амперке» продается такой модуль на основе реле HLS8L-DC5V-S-C. Если вас электромагнитное реле не устраивает, и вы стремитесь к предельной простоте схемы, то можно поискать твердотельные реле — подойдут, например, CX240D5R фирмы Crydom или аналогичные с напряжением срабатывания 3-15 В. У них ток управления составляет около 15 мА при 5 вольтах на входе, что допустимо для AVR, потому их управляющий вход можно подключать к цифровому выводу Arduino напрямую. Правда, при напряжении 220 вольт коммутировать нагрузку мощностью больше киловатта CX240D5R не может, но нам в данной задаче больше и не требуется.
Схема термостата на Arduino Uno показана на рис. 21.2.
Рис. 21.2. Схема термостата на Arduino Uno
На схеме обмотка реле К1 (с нормально разомкнутыми контактами) условно присоединяется прямо к цифровому выходу Arduino — подразумевается, что либо это упомянутое ранее твердотельное реле с нужными характеристиками, либо просто управляющий вход готовой платы релейного модуля. Для контроля состояния схемы одновременно с нагревателем срабатывает светодиод. Программа термостата в соответствии с подобной схемой крайне проста:

