- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Занимательная электроника - Юрий Ревич
Шрифт:
Интервал:
Закладка:
_displayfunction |= 0x02; //russian codetable
Она устанавливает биты FT в состояние 1:0, соответствующее таблице ENGLISH_RUSSIAN. Сами коды кириллических символов одинаковы и для старого варианта HD44780 с «прошитой» русской таблицей, и для нового WS0010 (табл. 22.1). Подогнать под кодировку UTF-8 здесь их не удастся (и исправить перечеркнутый ноль тоже). В отличие от таблицы ASCII, в этих таблицах указаны только кириллические символы, отличающиеся от английских, потому в функции print () совпадающие буквы в обоих языках можно указывать напрямую, как обычно, а кириллические придется вставлять указанием их числового кода.
В табл. 22.1 приведены шестнадцатеричные коды символов (в строке записываются с предваряющим х), а также восьмеричные. В тексте программ на основе и без того совершенно нечитаемого языка С, на мой взгляд, восьмеричные выглядят компактнее, потому что требуют одного лишь предваряющего обратного слэша.
Обычные символы и коды можно писать вперемешку. Например, процедура замены английских названий дней недели на русские при выводе показаний часов DS1307 (см. далее) будет выглядеть, как показано в листинге далее. Сами часы выдают дни недели в цифровом виде, а соответствующие им англоязычные константы MON, TUE и т. п. уже определены в файле ds1307.h.
Подключение библиотеки LiquidCrystalПосле подключения библиотеки LiquidCrystal к программе ее необходимо инициализировать, причем с указанием реальных контактов, к которым присоединяются выводы выбора индикатора RS, разрешения Е и линии данных. Индикаторы на базе HD44780 могут подключаться как по восьмипроводной, так и по четырехпроводной линии данных. Все реальные библиотеки в целях экономии числа соединений, естественно, выбирают второй способ. В нашем случае таких индикаторов два: четыре линии данных у них будут общие, а линии RS и Е различаются — ими мы будем обеспечивать выбор текущего дисплея.
Таким образом, тестовая программа для двух дисплеев WEH001602В, подключенных согласно схеме на рис. 22.1, будет выглядеть следующим образом:
Часы реального времени DS-1307Модуль часов реального времени RTC на основе микросхемы DS-1307, предлагаемый в «Амперке», имеет один недостаток — к нему требуется батарейка редко встречающегося в продаже типоразмера CR1225, которую придется приобретать отдельно. Проблемой в дальнейшем это, однако, не станет: согласно спецификации, DS-1307 потребляют ток 0,5 мкА, так что в теории этой батарейки при ее емкости 48 мА-ч должно хватать примерно лет на десять — больше, чем ее гарантийный срок хранения. Надо учесть, что без установленной батарейки часы неработоспособны, и их не удастся даже запрограммировать.
Сам модуль представляет собой практически «голую» микросхему DS-1307 с установленными резисторами «подтяжки» для интерфейса 12С. К Arduino модуль подключается через штатные выводы аппаратного I2C (TWI) MK AVR, т. е. через контакты платы Arduino А4 (SDA) и А5 (SCL). Доступ к этому интерфейсу реализован в стандартной библиотеке Wire.h, поставляемой вместе со средой Arduino IDE. Подробно об интерфейсе I2С (другое название интерфейса: TWI, Two Wire Interface) можно прочесть в моей книге [21], здесь мы только укажем, что к нему одновременно могут подключаться до 128 устройств (различаются они программно по индивидуальному адресу). Поэтому на схеме к тем же выводам подключен еще и барометр, который мы рассмотрим позднее.
* * *
Заметки на полях
Следует отметить, что существует очень много библиотек Arduino для работы с часами DS-1307, и большинство из них не используют аппаратный порт I2C, предполагая подключение к другим цифровым выводам. Как рассказывается в моей книге [21], аппаратная реализация I2C (TWI) в AVR действительно оставляет желать лучшего. Но в данном случае мы пойдем именно этим путем — наш барометр тоже применяет тот же способ, а, значит, мы можем сэкономить на выводах, подключив эти устройства к одному и тому же интерфейсу. Что же касается неудобств реализации интерфейса, то все трудности здесь скрыты от нас создателями библиотеки.
* * *
Библиотеку RTC можно скачать с официального сайта Seeed[44]. Все взаимодействие программы с часами заключается в подключении библиотек ds1307.h и Wire.h, вызове функции инициализации clock.begin() и считывании показаний с помощью единственной функции clock.getTime(), которая обеспечивает обновление целого выводка скрытых переменных, таких как clock.hour, clock.minute и т. п. Потому основная проблема в программировании взаимодействия с часами не в том, чтобы периодически читать показания и выводить их на дисплей, а в том, как удобно и корректно организовать их начальную установку и периодическую коррекцию.
Установка часовПривычную установку часов с помощью одной-двух кнопочек в современных условиях я считаю приемлемым методом только в случае самых простых радиолюбительских конструкций — подобных той, что рассматривалась в главе 20. Так как там мы еще не изучали последовательный порт и другие коммуникационные возможности контроллеров, то и не умели организовать установку часов иным способом. В устройствах, ориентированных на практическое применение, заставлять пользователя жать на кнопочки после каждого сбоя в питании — признак либо лени, либо крайней безграмотности разработчика.
Самым, вероятно, прогрессивным способом установки и коррекции встроенных часов будет полная автоматизация этого процесса — подобно тому, как это делает Windows, периодически обновляя внутренние часы через Интернет незаметно для пользователя. В случае готового доступа в Интернет это просто, а вот для автономного прибора потребуются соответствующие беспроводные функции. Их можно организовать двояким способом: либо через службы точного времени (так устроены некоторые серийные метеостанции), либо через подключение GPS-модуля, имеющего доступ к сигналам точного времени по определению.
Существует модуль Arduino DCF77 radio clock receiver, ориентированный на прием радиосигналов служб точного времени (известных, как DCF77)[45]. Способ имеет тот недостаток, что работает не везде, — так, модули, ориентированные на немецкий передатчик во Франкфурте-на-Майне, глохнут уже километрах в ста к востоку от Москвы. Как ни странно, но никаких серийно выпускаемых модулей (необязательно именно ориентированных на Arduino), предназначенных для приема сигналов российских служб точного времени, я так и не нашел — возможно, они просто неактуальны в связи с распространением спутниковых систем навигации.
Применение для этой цели приемников GPS (или GPS/Глонасс), конечно, более универсальный и повсеместно доступный способ. Но в нашем случае я счел это нецелесообразным — GPS-приемник удорожит нашу станцию примерно вдвое, а использоваться будет лишь изредка. Потому здесь мы пожертвуем полной автоматизацией, и сделаем процесс полуавтоматическим, через подключение к компьютеру.
Обновить время, раз в полгода подключив станцию к любому компьютеру, совсем несложно, тем более что никаких дополнительных аппаратных средств для этого не понадобится. В версии станции с SD-карточкой мы еще и будем хранить на ней софт, упрощающий этот процесс.
Скетч под названием Clock_set.ino для проверки функционирования и установки часов реального времени, подключенных по схеме рис. 22.1, можно скачать с сайта автора по ссылке http://revich.lib.ru/AVR/Meteoset.zip. Он принимает команды от компьютера и, в соответствии с принятым символом, выполняет ту или иную операцию. По приему символа «D» (десятичный код 68) контроллер переходит в режим установки часов из компьютера и ждет, что ему придут еще последовательно семь байтов в десятичной форме: год (младшие две цифры), месяц, дата, часы, минуты, секунды и день недели (понедельник — первый). В общем-то, последняя цифра не нужна, т. к. день недели полностью определяется остальными данными, но в часах его установка почему-то предусмотрена отдельно, и в библиотеке DS1307.h имеется соответствующая функция.
Со значением года создатели библиотеки придумали пользователю дополнительные заморочки. В сами часы загружается лишь один байт, соответствующий двум последним цифрам года, но почему-то при обращении к функциям установки из библиотеки DS1307.h нужно загружать двухбайтовое число, представляющее год полностью. Функции Windows, которые применяются в нашей Delphi-программе (см. далее), тоже выдают год целиком. Но чтобы не возиться с передачей двухбайтового числа через порт, мы в компьютерной программе вычитаем из значения года число 2000, затем в программе Clock_set.ino снова его прибавляем, а в библиотечных функциях (см. в конце файла DS1307.cpp из библиотеки RTC) оно опять вычитается, как и требуют часы. Глупость, конечно, но править библиотеку по столь незначительному поводу мы не станем. По окончанию установки часов контроллер выдает в «верхнюю» программу строку «Ok».

