Умный дом

Завтра

Вот «Завтра» и пришло.

Ранее уже описана проверка релейного модуля и модуля приема системных ИК-команд. Осталось проверить модуль трансляции ИК-кодов. Предполагаю следующий порядок про­верки. Подключаю модуль. Отправляю с компьютера команду трансляции ИК-кода и читаю его с помощью WinLIRC в режи­ме прямого чтения кода.

Первая правильная мысль - не устанавливать для излуче­ния светодиод ИК-диапазона, а использовать три светодиода АЛ307, которые уже установлены на макетной плате. Возмож­но, красный светодиод «прихватит» и ИК-диапазон.

Первый результат. После включения клавиши Телевизор включить и отправки ИК-кода модуль «виснет», а программа WinLIRC хладнокровно выводит результат:

Outputting raw mode2 data.

Space 6025710

Pulse 1086

Space 994

Pulse 1074

Space 1301

Pulse 1057

Space 978

Pulse 1185

Space 1011

Pulse 1448

Space 979

Pulse 1147

Space 983

Pulse 1155

Space 1002

Pulse 1158

Space 1014

Pulse 1441

Space 998

Pulse 1145

Space 992

Pulse 1133

Space 1002

Pulse 1163

Space 1012

Pulse 1442

Space 998

Pulse 1136

Space 976 pulse 1157 space 981 pulse 1156 space 977 pulse 1158 space 977 pulse 1130 space 1068 pulse 1467 space 951 pulse 1156 space 1053 pulse 1427 space 978 pulse 1159 space 999 pulse 1160 space 954 pulse 1183 space 1013 pulse 1466 space 950 pulse 1104

Я повторяю эксперимент несколько раз, постепенно при­ходя к выводу, что удобнее фиксировать результат в записи короткие (0) и длинные (1) импульсы, чтобы удобнее было сравнивать с исходным кодом.

Воспроизводимый код: 000100001000000010000000100000 000000100010000000100

Повторное воспроизведение дает тот же код, что уже хо­рошо.

Но оригинальный код имеет вид (в том же виде): Заголовок 01 0001 0001 000001 01 0001 00

Структура похожа, но сам код...

Первое, что я делаю, - убираю все отладочные вставки в программе модуля. Попутно «смахиваю» функцию putch () - модуль работает «молча» - и убираю настройки контроллера, относящиеся к настройке передатчика. Модуль не подает при­знаков жизни. Возвращаюсь на исходные позиции. Не помогает.

Изменяю количество байтов, принимаемых в массив записи команды, с 54 до 29 (реальных). И это не помогает.

Возможно, вам быстрее, чём мне, приходит в голову мысль - а что я читаю из файла input. irc? В отладочной про­грамме MPLAB я записывал символы. И читаю, надо пони­мать, символы. А ожидаю числа.

Открываю файл input. irc в НЕХ-редакторе и меняю сим­волы на числа. Пробую:

Outputting raw mode2 data.

Space 10739323

Pulse 3650

Space 732

Pulse 1951

Space 733

Pulse 834

Space 755

Pulse 1983

Space 684

Pulse 859

Space 719

Pulse 2009

Space 667

Pulse 833

Space 759

Pulse 811

Space 740

Pulse 1937

Space 742

Pulse 1977

Space 704

Pulse 844

Space 726

Pulse 1978

Space 705

Pulse 832

Space 2487801

Заголовок 010001000100000101000100

Пытаюсь разобраться с временами, что не сложно, - уменьшить числа в файле input. irc. Меняю коэффициент с 13,8 на 19. Мне не нравится, что первое нажатие клавиши

Телевизор включить не воспроизводит код, требуется по­вторное нажатие. Но времена становятся ближе к исходным.

Делаю попытку включить магнитофон. Неудачно. Одна из причин этого может оказаться в единичности посылки кода. «Родные» коды идут сплошным потоком. А если попробовать четыре повтора с паузой в 24505 мс? Пробую переделать про­грамму для реализации четырех повторов. Делаю паузу меж­ду повторами с помощью цикла for. Заодно пытаюсь понять, отчего и где зависает модуль.

Дополняю еще одно число в файл. ire, чтобы цикл воспро­изведения в программе модуля заканчивался правильно. То есть, чтобы программа не «зависала» на отсутствующем чис­ле длительностью в паузу. Попутно меняю условие заверше­ния чтения с количества чисел (29) на байт завершения фай­ла «00».

В какой-то момент видеомагнитофон даже удается вклю­чать и выключать, нажимая клавишу Телевизор включить. Но модуль продолжает виснуть.

На все это уходит два дня «борьбы с собственной гениально­стью». Но есть и моменты проблесков. Проблема, которой закончилась отладка модуля приема ИК-кодов, превратилась в ясное понимание, что лень не всегда хороша. Чтобы не создавать весь проект полностью, я копирую пре­дыдущий в другую папку, правлю имена файлов и т. д. Но, по­правляя программу при отладке, порой забываю, с какой из папок я работаю. Если бы не лень, я создавал бы новый про­ект, открывал новые файлы... Словом, получилось так, что исходный текст я правил в одной из папок, а компилировал в другую. Даю себе слово впредь в менеджере проекта уда­лять и добавлять все файлы заново. Посмотрим!

За время отладки в голову приходила мысль, что заверше­ние файла байтом «00», может каким-то образом влиять на зависание. Но как? Когда не остается никаких разумных ва­риантов, и я устаю от бесконечного перепрограммирования микросхемы, я меняю в файле input. ire завершающий байт с 00 на FF, а коэффициент - на 25.

Модуль перестает «виснуть», магнитофон исправно вклю­чается и выключается. Программа модуля имеет к этому вре­мени вид, представленный в начале раздела.

В основной программе фрагменты для клавиш Телевизор включить и Телевизор выключить к концу наладки выглядят так:

Private Sub IRemitter01_off_Click() intFH = FreeFileO

Open "D:barbyinput_l. irc" For Input As intFH

Do Until EOF(intFH)

Line Input #intFH# strString

Loop

Forml. MSComml. Output = "I14$5P" For і = 0 To 10000 Next і

Forml. MSComml. Output = strString For і = 0 To 20000000 Next і

Forml. TV_on. Visible = False Forml. TV_off. Visible = True End Sub

Private Sub IRemitter01__on_Click () intFH = FreeFileO

Open "D:barbyinput_l. і re" For Input As intFH

Do Until EOF(intFH)

Line Input tfintFH, strString

Rem strCmnd = strCmnd & strString & vbLf

Loop

Rem Forml. wrem. Caption = strCmnd Forml. MSComml. Output = "I14$5P" For і = 0 To 10000 Next і

Forml. MSComml. Output = strString For і = 0 To 20000000 Next і

Forml. TV_off. Visible = False Forml. TV_on. Visible = True End Sub

И немного назад

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

Dim ext As Boolean

Private Sub mnuWork_Click() Forml. mnuTest. Enabled = False Forml. Commandl. Enabled = False Forml. Commandl. Visible = False 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. PhotoOLoff. Enabled = False Forml. Photo01__of f. Visible = False Forml. IRemitter01_off. Visible = False Forml. IRemitter01_off. Enabled = False Forml. IRemitter01__on. Visible = False Forml. IRemitter01_on. Enabled = False Forml. work End Sub

Sub work()

Forml. Key Preview = True Forml. MSComml. Output = "C14S0S" For і = 0 To 10000000

Next і

StrAnsw = Forml. MSComml. Input Forml. wrem. Enabled = False Forml. wr em. Visible = False Forml. Refresh

Select Case strAnsw

Case "С14$05С14001И Forml. Lamp_off. Visible = False Forml. Lamp_on. Visible = True Foml. Refresh

Case НС14$0$С14129И Forml. Lamp_off. Visible = True Forml. Lamp_on. Visible = False Forml. Refresh

Case "C14$0SC14193" Forml. Torsher_off. Visible = False Forml. Torsher_on. Visible = True Forml. Refresh

Case HC14$0SC14033" Forml. Torsher_off. Visible = True Foml. Tor sher_on. Visible = False Foml. Re fresh

Case HC14$0SC14161" Foml. Bra_off. Visible = False Foml. Bra_on. Visible = True Foml. Refresh

Case "C14$0SC14097" Foml. Br a_off. Visible = True Foml. Br a_on. Visible = False Foml. Re fresh

Case HC14$0SC14065" ext = True End Select

Loop While ext = False

Forml. Commandl. Enabled = True Forml. Commandl. Visible = True Forml. Refresh End Sub

Переделка касается добавления функции work (), где про­грамма «крутится» в цикле после включения режима Работа, ожидая ввода ИК-команд с пульта. Команды включают и вы­ключают «лампы» на форме. Модуль приема системных ИК - команд я проверял и полагал, что с ним не возникнет про­блем. Я ошибался!

При тестировании модуля он правильно отвечал на ИК - команды. Но, когда запросы пошли часто, во время прохож­дения бесконечного цикла основной команды модуль стал «виснуть». Пришлось вернуться к его наладке. В итоге про­грамма модуля приобрела вид, представленный в начале опи­сания модуля.

Теперь модуль не «виснет», основная программа «крутится» в цикле. По командам с пульта лампочки на форме включаются и выключаются, а, нажав на цифру «3» на пульте, я покидаю режим работы и могу выключить основную программу.

Здесь тоже есть момент, который меня не устраивает, но с ним, я думаю, можно разобраться позже. Он относится к выходу из цикла в основной программе. Если я пытаюсь оста­новить программу с помощью меню или закрыть ее привыч­ным для Windows образом, ничего не получается. Проблема в том, что программа «крутится» в цикле, из которого может выйти только по событиям, включенным в этот цикл. А един­ственное событие - прием команды, отправляемой клави­шей «3» с пульта. Я думаю, это решаемый вопрос, но к его решению мы вернемся позже.

Текст основной программы на языке Visual Basic

Dim strAnsw As String Dim ext As Boolean

Sub work() Do

Forml. Key Preview = True Forml. MSComml. Output = "D14$0S"

For і = 0 То 10000000 Next і

StrAnsw = Forml. MSComml. Input

Rem Forml. wrem. Caption = strAnsw

Forml. wrem. Enabled = False

Forml. wrem. Visible = False

Forml. Refresh

Select Case strAnsw

Case "С14$05С14001И

Forml. Lamp_off. Visible = False

Forml. Lamp_on. Visible = True

Forml. Refresh

Case "C14$0SC14129"

Forml. Lamp_off. Visible = True

Forml. Lamp_on. Visible = False

Forml. Re fresh

Case "C14$0SC1419311

Forml. Torsher_off. Visible = False

Forml. Torsher_on. Visible = True

Forml. Re fresh

Case nC14$0SC14033"

Forml. Torsher_off. Visible = True

Forml. Torsher_on. Visible = False

Forml. Refresh

Case "C14$0SC14161"

Forml. Bra_off. Visible = False

Forml. Bra_on. Visible = True

Forml. Refresh

Case "C14$0SC14097"

Forml. Bra_off. Visible = True

Forml. Br a^_on. Visible = False

Forml. Refresh

Case "D14$0SD14240"

Ext = True

End Select

Loop While ext = False

Forml. Commandl. Enabled = True Forml. Commandl. Visible = True Forml. Refresh End Sub

Private Sub Commandl_Click()

Forml. Commandl. Caption = "Test run" Forml. Commandl. Enabled = True Forml. wrem. Caption = и Forml. MSComml. Output = "R14$1N" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input Forml. wrem. Caption = strAnsw Forml. Commandl. Caption = "Test R" Forml. Commandl. Enabled = True End Sub

Private Sub IRemitter01_off_Click() intFH = FreeFileO

Open "D:barbyinput_JL. irc" For Input As intFH

Do Until EOF(intFH)

Line Input #intFH, strString

Loop

Forml. MSComml. Output = ИІ14$5Р" For і = 0 To 10000 Next і

Forml. MSComml. Output = strString For і = 0 To 20000000 Next і

Forml. TV_on. Visible = False Forml. TV_off. Visible = True End Sub

Private Sub IRemitter01_on_Click() intFH = FreeFileO

Open "D:barbyinput_Jl. irc" For Input As intFH

Do Until EOF(intFH)

Line Input #intFH, strString

Rem strCmnd = strCmnd & strString & vbLf

Loop

Rem Forml. wrem. Caption = strCmnd Forml. MSComml. Output = ИІ14$5РИ For і = 0 To 10000 Next і

Forml. MSComml. Output = strString For і = 0 To 20000000 Next і

Forml. TV_off. Visible = False

Forml. TV_on. Visible = True End Sub

Private Sub mnuStop_Click() Forml. mnuTest. Enabled = True Forml. mnuWork. Enabled = False Forml. MSComml. PortOpen = False End Sub

Private Sub mnuTest_Click() Forml. mnuWork. Enabled = True Forml. MSComml. CommPort = 1 Forml. MSComml. Set tings = "2400,N,8,1" Forml. MSComml. PortOpen = True 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. Phot o01_off. Enabled = True Forml. Photo01_off. Visible = True End Sub

Private Sub mnuWork_Click() Forml. mnuTest. Enabled = False Forml. Commandl. Enabled = False Forml. Commandl. Visible = False 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. Phot o01_on. Enabled = False Forml. Photo01_on. Visible = False Forml. Photo01_off. Enabled = False Forml. Photo01_off. Visible = False Forml. IRemitter01_off. Visible = False Forml. IRemitter01_off. Enabled = False Forml .IRemitter01_on. Visible = False Forml. IRemitter01_on. Enabled = False Forml. work End Sub

Private Sub Photo01_off_Click() Forml. IRcmnd_on. Visible = False Forml. IRcmnd_off. Visible = True End Sub

Private Sub Photo01_on_Click() Forml. wrem. Caption = " Forml. MSComml. Output = "C14$0S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input If strAnsw = "C14$0SC14001" Then Forml. IRcmnd_off .Visible = False Forml. IRcmnd_on. Visible = True Forml. wrem. Caption = strAnsw Else

Forml. IRcmnd_on. Visible = False Forml. IRcmnd_off. Visible = True Forml. wrem. Caption = strAnsw End If

If strAnsw = "C14$0SC14129" Then Forml. Lamp_on. Visible = True Forml. Lamp_off .Visible = False

Forml. wrem. Cape ion = strAnsw End If End Sub

Private Sub Reley01_of f_Click () Forml. MSComml. Output = "R14$0F" Forml. MSComml. Output = "R14$0S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input If strAnsw = I, R14$0FR14$0SR14#0F11 Then Forml. Lamp_on. Visible = False Forml. Lamp_off. Visible = True End If End Sub

Private Sub Reley01_on_Click () Forml. MSComml. Output = "R14$0N" Forml. MSComml. Output = "R14$0S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input

If strAnsw = l, R14$0NR14$0SR14#0N11 Then

Forml. Lamp_off. Visible = False

Forml. Lamp_on. Visible = True

End If

End Sub

Private Sub Reley02_off_C 1 іck О Forml. MSComml. Output = "R14$1F" Forml. MSComml. Output = "R14$1S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input Forml. wrem. Caption = strAnsw If strAnsw = I, R14$1FR14$1SR14#1F1' Then Forml. Tor sher_on. Visible = False Forml. Tor sher_off. Visible = True End If End Sub

Private Sub Reley02_on_Click() Forml. MSComml. Output = "R14$1N"

Forml. MSComml. Output = "R14$1S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input If strAnsw = "R14$1NR14$1SR14#1N" Then Forml. Tor sher_off. Visible = False Forml. Tor sher^on. Visible = True End If End Sub

Private Sub Reley03_offjClick () Forml. MSComml. Output = "R14$2F" Forml. MSComml. Output = "R14$2S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input

If strAnsw = l, R14$2FR14$2SR14#2F" Then

Forml. Bra_on. Visible = False

Forml. Bra_off. Visible = True

End If

End Sub

Private Sub Reley03_on_Click() Forml. MSComml. Output = "R14$2N" Forml. MSComml. Output = "R14$2S" For і = 0 To 10000000 Next і

StrAnsw = Forml. MSComml. Input

If strAnsw = I, R14$2NR14$2SR14#2N" Then

Forml. Bra_off. Visible = False

Forml. Bra_on. Visible = True

End If

End Sub

Умный дом

Практическое применение триака в модулях системы

Хотя на протяжении всей книги я старался подчеркнуть, что все модули системы, как и сама система, предназначены для проведения экспериментов за компьютером или за столом, думаю, среди читателей найдутся желающие …

Оператор предшествования

Есть одна «заморочка» в использовании встроенных опера­торов - при комбинации нескольких операторов в одном выражении порядок выполнения операций определяется предустановленным уровнем приоритетности для каждого. Например, результат выражения 5 + 2*10 …

Дополнительные замечания по ИК-управлению

Программа WinLIRC позволяет не только считывать ИК- коды, но и воспроизводить прочитанные команды. Воспро­изведение - чисто программное, возможно, по этой причи­не оно показалось мне не слишком уверенным. Но оно работает, …

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

Украина:
г.Александрия
тел. +38 05235 7 41 13 Завод
тел./факс +38 05235  77193 Бухгалтерия
+38 067 561 22 71 — гл. менеджер (продажи всего оборудования)
+38 067 2650755 - продажа всего оборудования
+38 050 457 13 30 — Рашид - продажи всего оборудования
e-mail: msd@inbox.ru
msd@msd.com.ua
Скайп: msd-alexandriya

Схема проезда к производственному офису:
Схема проезда к МСД

Представительство МСД в Киеве: 044 228 67 86
Дистрибьютор в Турции
и странам Закавказья
линий по производству ПСВ,
термоблоков и легких бетонов
ооо "Компания Интер Кор" Тбилиси
+995 32 230 87 83
Теймураз Микадзе
+90 536 322 1424 Турция
info@intercor.co
+995(570) 10 87 83

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

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