Умный дом

Программа для управляющего компьютера

До начала работы еще раз перечислим модули, которые мы разработали для системы:

• релейный модуль;

• модуль приема системных ИК-команд (от старого пульта);

• модуль трансляции ИК-команд для управления бытовой аппаратурой.

Модулей немного. Но даже на их основе можно создать множество очень интересных версий системы, например «Умный кукольный домик» (Барби - достаточно богатая кук­ла, чтобы иметь свой умный домик) для дочери или младшей сестренки.

Если не усложнять задачу по созданию управляющей про­граммы, в качестве среды разработки основной программы и отладки системы я предлагаю использовать 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 и до отправки строки в СОМ-порт все, что было прочитано, выводится на эту клави­шу в качестве названия.

Пока у меня не остается сомнений (спасибо Михаэлю Рай - тигеру и Геральду Мучу), я могу спокойно провести сегодняш­ний вечер у телевизора. А завтра начну проверять модули, но это будет завтра...

Умный дом

Вторая версия основной программы на языке С++

/****************^ * TOC o "1-3" h z Copyright (С) 2006 by Vladimir Gololobov * * vgololobov@yandex. ru * * * * This program is free software; you can redistribute it …

Циклы

Циклы выполняют выражения или блоки выражений до тех пор, пока выражение условия не становится истинным. Наша программа требует двух циклов (один вложен в дру­гой). Пока пользователь желает угадывать последовательно­сти: { …

Две полезные схемы

Первая схема относится к настенному выключателю, работа­ющему по протоколу XI0. Что полезного можно почерпнуть из этой схемы? Например, организацию сканирования сети и управления триаком. Схему я привожу, как она сохранилась …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия
+38 050 512 11 94 — гл. инженер-менеджер (продажи всего оборудования)

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@inbox.ru
msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Оперативная связь

Укажите свой телефон или адрес эл. почты — наш менеджер перезвонит Вам в удобное для Вас время.