Пишем по‑русски
Далее нужно разобраться с русским языком – модели дисплеев с новым контроллером WS0010 русифицируются переключением кодовой таблицы, что в стандартной библиотеке LiquidCrystal не предусмотрено. Введением таких таблиц в фирме Winstar кардинально решили проблему национальных прошивок: 255 символов на все языки не хватает, а применение Unicode в восьмиразрядном контроллере весьма затруднено. Ранее в каждый регион приходилось поставлять дисплеи со своим языком, что вызывало понятные трудности у потребителя.
С контроллером WS0010 этого не требуется, в нем уже записаны четыре таблицы: ENGLISH_JAPANESE, две таблицы WESTERN EUROPEAN и ENGLISH_RUSSIAN. Выбор осуществляется переключением двух специальных битов FT (font table), которые в старом варианте просто не задействованы и не должны ничему мешать, – в силу чего отредактированная библиотека должна быть полностью совместима со старыми типами дисплеев. Если они все‑таки мешать будут (автор, естественно, никакой гарантии дать не может), то придется использовать два варианта библиотеки или усложнять ее введением специальной функции установки font_table . Здесь же мы просто добавим одну лишнюю строку в тот же файл LiquidCrystal.срр.
Для объявления кириллической таблицы шрифтов найдите в файле начало функции void LiquidCrystal::begin . Там, внутри оператора if (lines > 1) , имеется строка номер 87: _displayfunction |= LCD_2Line; . Сразу после нее (перед замыкающей операторной скобкой «}») вставьте еще одну строку:
_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».
По приходу команды «R» (десятичный код 82) контроллер считывает часы и выдает их «наружу», причем день недели выдается английским сокращением, как в примере из библиотеки. Впоследствии мы воспользуемся этим разделением по командам для приема данных через последовательный порт из другого источника.
В качестве составной части скетч Clock_set.ino вошел в полную программу метеостанции, но может использоваться и как отдельная тестовая программа.
Для облегчения задачи установки часов я написал утилиту на Delphi, которая взаимодействует с программой Clock_set.ino с помощью всего двух кнопок (точно так же он работает и с полной программой метеостанции). Эту утилиту под названием MeteoSet можно найти в том же архиве, что и скетч Clock_set.ino . В архиве, кроме собственно программы (файл setmeteo.exe), находится папка с Delphi‑проектом, который читатель волен использовать по собственному усмотрению. Проект создан в версии Delphi 7, но после преобразования будет компилироваться и в любой более поздней версии, изменения вносить не потребуется.
Предварительно соедините компьютер со станцией USB‑кабелем, загрузите в прибор скетч Clock_set.ino и установите в запущенной на компьютере программе setmeteo.exe соответствующий порт (предусмотрены номера от СОМ1 до СОМ8). После этого можно прочесть показания часов из станции (кнопка Read Time from Station ), сравнить их с текущим временем (показывается внизу окна программы) и обновить через нажатие кнопки Set current Time . Перед проведением этой операции целесообразно принудительно обновить время в самом компьютере через пункт Настройка даты и времени контекстного меню области уведомлений (хотя Windows делает это автоматически по расписанию, но не каждый день, и часы могут «уйти»).
Дата добавления: 2016-05-11; просмотров: 1883;