Программа для управляющего компьютера
До начала работы еще раз перечислим модули, которые мы разработали для системы:
• релейный модуль;
• модуль приема системных ИК-команд (от старого пульта);
• модуль трансляции ИК-команд для управления бытовой аппаратурой.
Модулей немного. Но даже на их основе можно создать множество очень интересных версий системы, например «Умный кукольный домик» (Барби - достаточно богатая кукла, чтобы иметь свой умный домик) для дочери или младшей сестренки.
Если не усложнять задачу по созданию управляющей программы, в качестве среды разработки основной программы и отладки системы я предлагаю использовать Visual Basic или любую доступную и удобную для вас среду разработки. Я выбрал Visual Basic только по той причине, что «это у меня есть». Вдобавок, вариант Visual Basic упрощает работу с СОМ-портом. Я пробовал создание подобной среды программирования на языке С++ в KDevelop под управлением операционной системы Linux. Все работает. Все удобно. Среда разработки KDevelop входит в дистрибутив Linux, который стоит около 350 рублей. Тоже, как мне кажется, очень хороший вариант.
Перечислим команды модулей, которые могут потребоваться при написании основной программы.
Релейный модуль. Возможно, мы не будем запрашивать статус реле, используя только команды включения и выключения. Возможно, используем три модуля с адресами 01, 02, 03, которые будут располагаться в трех комнатах и включать настольную лампу в кабинете, торшер в гості шой и бра в холле:
• включить - Rxx$xN;
• выключить - Rxx$xF, где хх - это 01, 02, 03; х после символа команды «$» - это «1» (будем использовать только по одному реле в модуле);
• передать статус - Rxx$xS; при передаче статуса используются следующие символы:
- включено - Rxx#xN;
- выключено - Rxx#xF.
Модуль приема системных ИК-команд. Используем один модуль, который расположим в гостиной.
Запрос статуса - Cxx$0S (аналогично команде запроса статуса релейного модуля).
Ответ модуля - Cxxkkk, если команда пришла, и Cxx#f f, если ИК-команда не приходила.
Модуль трансляции ИК кодов. Предположим, что мы по команде с системного пульта будем включать и выключать телевизор. То есть, нам потребуется отправлять команду power для телевизора, которую предварительно прочитаем с помощью WinLIRC и обработаем, записав в файл с расширением. ire.
Какой я представляю себе в настоящий момент работающую программу? При запуске программы отображается пользовательский интерфейс, который проверяет работу модулей и запускает основную программу. Помещений, где будут установлены модули, три - кабинет, гостиная, холл.
В Visual Basic, как и в других средах программирования, есть удобное средство создания пользовательского интерфейса программы - форма (Form). Этим мы и воспользуемся.
Заменим название формы (свойство Caption) на «Кукольный умный домик». В редакторе изображений создадим иконку, которую вставим, используя свойство Icon Щ. Теперь откроем три Frame, которые назовем соответственно Кабинет, Гостиная, Холл. Получим картинку, показанную на рис. 1.80.
В редакторе изображений нарисуем изображения выключенной и включенной ламп - и Ц. Их мы используем впоследствии для отображения состояния ламп (или реле). Вставим картинки в каждое из ранее нарисованных помещений на форме (добавив PictureBox с вкладки General), добавим клавиши, которые будут управлять этими лампами (с помощью реле). Картинки наложим одна поверх другой. Получим вид формы, показанный на рис. 1.81 (последние две картинки не совмещены).
Напомню, что картинки с изображением включенной лампы мы наградим свойством Visible False, а для ввода кода нужно дважды щелкнуть кнопку на форме, например «Лампу включить», и вписать небольшой текст:
Private Sub ReleyO l_on_Click ()
Forml. Lamp_off. Visible = False
Рис. 1.80. Окно основной программы проекта |
Рис. 1.81. Форма программы проекта с расставленными лампами |
Forml. Lamp_on. Visible = True End Sub
В этом фрагменте я выделил то, что создает Visual Basic при щелчке кнопки на форме.
Расположим в гостиной пульт управления, с которого будем принимать команды (он сыграет роль модуля фотоприемника) и телевизор, которым мы будем управлять с помощью модуля излучателя ИК-команд. Картинки нарисуем в графическом редакторе и наложим одну на другую (конечно, соответствующие, как с лампами). Добавим код, аналогичный вышеупомянутому фрагменту кода, и получим работающую заготовку, которую, в первую очередь, можно использовать для тестирования модулей. Клавиши включения и выключения ламп будут посылать команды модулям и менять картинки в соответствие с состоянием - «Включено» или «Выключено». Аналогично мы поступим и с остальными модулями. А пока можно проверить отображение будущих идей.
Поскольку мы планируем использовать два режима работы - тестовый и основной, - я думаю, есть смысл сделать главное меню с двумя режимами работы. Для этой цели на форме щелкнем правой кнопкой мыши и в открывшемся меню выберем Редактор Меню. С его помощью создадим меню с основным пунктом Режим и двумя подпунктами: Проверка и Работа.
При выборе режима Проверка (щелкаем этот раздел меню) мы сделаем видимыми все клавиши:
Private Sub mnuTest_Click()
Forml. Reley01_off. Enabled = True Forml. Reley01_off. Visible = True Forml. Reley02_off. Enabled = True Forml. Reley02_off. Visible = True Forml. Reley03_off. Enabled = True Forml. Reley03_off. Visible = True Forml. Reley01_on. Enabled = True Forml. Reley01_on. Visible = True Forml. Reley02_on. Enabled = True Forml. Reley02_on. Visible = True Forml. Reley03_on. Enabled = True Forml. Reley03_on. Visible = True Forml. Photo01_on. Enabled = True Forml. Photo01_on. Visible = True Forml. IRemitter01_off. Visible = True
Forml. IRemitter01_off .Enabled = True Forml. IRemitter01_on. Visible = True Forml. IRemitter01_on. Enabled - True Forml. Photo01_off. Enabled = True Forml. Photo01_off. Visible = True End Sub
При переходе в режим Работа мы их уберем «с глаз долой»:
Private Sub muWork_Click() Forml. Reley01_off. Enabled = False Forml. Reley01_off. Visible = False Forml. Reley02_off. Enabled = False Forml. Reley02_off. Visible = False Forml. Reley03_off. Enabled = False Forml. Reley03_off. Visible = False Forml. Reley01_on. Enabled = False Forml. Reley01_on. Visible = False Forml. Reley02_on. Enabled = False Forml. Reley02_on. Visible = False Forml. Reley03_on. Enabled = False Forml. Reley03_on. Visible = False Forml. Photo01_on. Enabled = False Forml. Photo01_on. Visible = False Forml. IRemitter01_off. Visible = False Forml. IRemitter01_off .Enabled = False Forml. IRemitter01_on. Visible = False Forml. IRemitter01_on. Enabled = False Forml. Photo01_off. Enabled = False Forml. Photo01_off. Visible = False End Sub
Теперь работающая программа будет выглядеть в двух режимах, как показано на рис. 1.82.
В программе я использовал обозначения Reley 0 l_on (off), Photo01_off (on) и IRemitter01_on (off) для клавиш управления Лампу включить и т. д. Клавиша Команда? - запрос фотоприемнику. Обозначения содержат адрес модулей ReleyOl, Reley02, PhotoOl и т. д.
Не трогая режим работы, попробуем организовать работу с портом СОМІ. Для этих целей используем возможность добавить элементы управления. Я добавил требуемый элемент
Рис. 1.82. Окно программы проекта с расставленными устройствами и меню |
Управления MSComm на панель Ноте в Visual Basic, которую создал, чтобы не перегружать основную инструментальную панель. Этот элемент переносим на форму для использования в программе.
Для добавления элемента на инструментальную панель открываем в меню Проект раздел Компоненты и ставим флажок напротив Microsoft Comm Control 6.0 (рис. 1.83).
После добавления элемента управления на форму он становится доступен для использования (рис. 1.84).
Признаться, я хотел сделать два варианта этой программы: на Visual Basic и Delphi, благо, есть возможность поработать и с той, и с другой средой программирования. Но в Delphi, установив необходимый компонент VCL, я не смог им воспользоваться по причине отсутствия на это лицензии. Может быть, я что-то сделал не так, но не стал без нужды озадачивать тех, кто дал мне возможность поработать на компьютере, и перешел на Visual Basic, решив, что в этой среде Microsoft не
Потребует лицензии. Еще раз повторю, что, возможно, что-то сделал не так, как должно в Delphi, но... описывать работу с СОМ-портом «вручную» в данный момент я считаю преждевременным. Да и зачем, если именно для облегчения работы придуманы VCL, OLE и прочие загадочные составляющие современных сред программирования?
Оряка РО ІЯЙИКТ «»»ет Сцжмка а*в** Зуросфагранив Цицушдм
..
^щ ррттьгтцт../гЛТуКу __ •л; Лш ЛеЁгтлуь. Утммммп flnii тиши. |
Іш |
Metastream 1.0 Type Lfcrary Noosoft ActiveX Plugln : Noosoft ADO Data Control 6.0 (OLED6) '; Noosoft Agent Control 2.0 .: Noosoft Chart Control 6.0 (OLED6) V. МЮокЛ Comet Control 6.0 V* Noosoft Comnon Dialog Control 6.0 (5P3) " j Mfcrosoft Data Bound Gnd Control 5.0 (SP3) Noosoft Data Bound List Controk 6.0 .. Noosoft DataGrid Control 6.0 (ОШЯ) □ Noosoft DataList Controk 6.0 (OLED6) Noosoft Dataftapeetar Control 6.0 (< |
I Татрам»»»» і v Конаим?,, <| t»«wwcp kw» ЩІ 1 - m V: "Ш ' ' . * a: |
Добавит» Модул.
5 Дс&еитьСгржмої Свойств
- • . • v. V--- ( I » Добавит» WrtQa»
Добавит* OtU lUpert: j ' ' Добавит» СИП* Paga^
Х08» Kft. j. I |
Дебет* Р*в Cmirerwwnt, . Добавил. ФЛ»,:,.:
Рис. 1.83. Установка СОМ-порта в Visual Basic
В режим проверки добавим инициализацию порта:
Private Sub mnuTest_Click() Forml. MSCamml. CommPort = 1 Forml. MSComml. Settings = "9600,N,8,1" Forml. MSCamml. Port Open = True
Forml. Reley01_off .Enabled = True Forml. Reley01_off. Visible = True И т. д. End Sub
Как и в рабочий режим. Изменим управление релейными модулями в режиме тестирования, добавив реальные команды.
Рис. 1.84. Форма проекта с установленным СОМ-портом |
Команда Включить лампу:
Private Sub Reley01_on_Click() Forml. MSCamml. Output = "R01$1N" Forml. MSComml. Output = "R01$1S" If Forml. MSCamml. Input = "R01#1N" Then
Forml. Lamp_off .Visible = False Forml. Lampoon. Visible = True End If End Sub
Команда Выключить лампу:
Private Sub Reley01_off_Click() Forml. MSCamml. Output = "R01$1F" Forml. MSCamml. Output = "R01$1S" If Forml. MSCamml. Input = "R01#1F" Then
Forml. Lampoon. Visible = False
Forml. Lamp_off .Visible = True End If End Sub
Пока я не вставил код инициализации порта при загрузке программы, поэтому при запуске программы и попытках нажать на клавишу Включить лампу появляется сообщение об ошибке. Это сообщение служит напоминанием, что нужно выбрать режим Проверка. Вторая особенность работы программы - лампа, которую я хочу включить или выключить, не реагирует на команды. Причина в том, что релейный модуль, настроенный соответствующим образом, я пока не включал.
Будем надеяться, что с включенным модулем программа будет работать правильно. С надеждой на это важное допущение исправим работу всех релейных модулей аналогично первому.
Например, для третьего модуля (реле в модуле №1):
Private Sub Reley03_off_Click() Forml. MSCamml. Output = "R03$lF" Forml. MSCamml. Output = "R03$1S" If Forml. MSCamml. Input = "R03#1F" Then
Forml. Bra_on. Visible = False Forml. Bra_off. Visible = True End If End Sub
Теперь попробуем обработать прием системной ИК-команды модулем приема ИК-кодов. Для режима проверки нам достаточно одной системной команды. Пусть это будет команда 001.
Private Sub Photo01_on_Click()
Forml. MSCamml. Output = "C01$0S"
If Forml. MSCamml. Input = "COlOOl" Then
Forml. IRcmnd_off. Visible = False Forml. IRcmnd_on. Visible = True Else
Forml. IRcmnd_on. Visible = False Forml. IRcmnd_off. Visible = True End If End Sub
Работу клавиши Нет команды оставим без изменений. Пришло время разобраться с командой включения телевизора. Подготовим файл, возможно, внеся некоторые исправления в файл input. txt. Мы его использовали с программой MPLAB при разработке модуля ИК-команд. Изменим его расширение, превратив в файл input. irc, который я размещаю на диске D в папке barby:
02 02 32 В1 26 5D 26 26 26 5D 26 26 26 5D 26 26 26 26 26 5D 26 5D 26 26 26 5D 26 26 00
Я оставил пробелы между числами, чтобы числа легче читались, но эти пробелы не нужны в реальном файле.
Private Sub IRemitter01_on_Click() Forml. TV_off. Visible = False Forml. TV_on. Visible = True intFH = FreeFileO
Open "D:barbyinput. irc" For Input As intFH
Do Until EOF(intFH)
Line Input #intFH, strString
StrCmnd = strCmnd & strString & vbLf
Loop
Forml. MSComml. Output = "I01S5P" Forml. MSComml. Output = strCmnd End Sub
Вот такая получилась кнопка. Я честно «срисовал» весь фрагмент программы из полного руководства по Visual Basic 6.0 Михаэля Райтигера и Іеральда Муча (издание BHV, «Ирина», Киев, 2000), которое обнаружил на книжной полке. Программа не протестует против этого фрагмента, у меня тоже пока нет оснований д ля протестов.
Вторую клавишу управления телевизором можно снабдить этим же кодом. Многое зависит от команд включения и выключения. Мой старый телевизор включается подачей команды канала, а выключается клавишей power. Пока это не принципиально, важно только, чтобы в файле input. irc была правильная команда. Перед проверкой работы программы в режиме тестирования я удалил строки:
Forml. MSComml. PortOpen = False Forml. MSComml. CommPort = 1
Forml. MSComml. Settings = "9600,N,8,Iй Forml. MSComml. PortOpen = True
Из Private Sub muWork__Click {). Обозначил ее свойство Visible равным False (в редакторе меню убрал флажок в опции Включено) и добавил к фрагменту щелчка кнопки меню Проверка строку Forml. mnuWork. Enabled = True, а к фрагменту щелчка кнопки меню Работа - Forml. mnuTest. Enabled = False. Добавил еще один пункт в основное меню Стоп, работу которого описал так:
Private Sub mnuStop_Click() Forml. mnuTest. Enabled = True Forml. mnuWork. Enabled = False Forml. MSComml. PortOpen = False End Sub
Причина этого, полагаю, понятна - «заплатки» для правильной работы СОМ-порта, который нужно во время открывать и закрывать. Чуть позже поправим (если не забудем) наше лоскутное одеяло, а теперь настал, как говорят, момент истины. До написания блока Работа основной программы следует проверить ее тестовую часть. Пришла пора собрать модули, подключить конвертор к компьютеру, а модули - к конвертеру, и запустить программу. Но это завтра. Сейчас время позднее, я не успею дома переписать программу, разложиться возле компьютера и кое-что проверить. Однако меня беспокоит фрагмент чтения из файла. Что же я прочитаю? Попробую в очередной раз схитрить, немного времени у меня еще есть (рис. 1.85).
Хитрость в добавленной кнопке в верхней части с именем wrem, надпись на которой я убрал, а перед отправкой ИК-ко - манды кнопкой Телевизор включить добавил строку, выделенную ниже:
Private Sub IRemitter01_on_Click() Forml. TV_off. Visible = False Forml. TV_on. Visible = True intFH = FreeFileO
Open "D:barbyinput. irc" For Input As intFH
Do Until EOF(intFH)
Line Input #intFH, strString
Рис. 1.85. Окно проекта с выводом тестовой информации |
StrCmnd = strCmnd & strString & vbLf Loop
Forml. wrem. Caption = strCmnd
Forml. MSComml. Output = "І01$5РИ Forml. MSComml. Output = strCmnd End Sub
После чтения из файла input. irc и до отправки строки в СОМ-порт все, что было прочитано, выводится на эту клавишу в качестве названия.
Пока у меня не остается сомнений (спасибо Михаэлю Рай - тигеру и Геральду Мучу), я могу спокойно провести сегодняшний вечер у телевизора. А завтра начну проверять модули, но это будет завтра...