Всем привет!
На Хабре появляются и появляются статьи о реализации Умного дома. Самой главной проблемой (ну или только для меня) получается включение/выключение света в санузле. Вроде и вещь не хитрая — а сколько есть вариантов. Прочитав статьи, в том числе, тут и тут, я подумал «А ведь все могло быть проще».
Этот червячок точил меня около полугода. И вот, когда стало свободнее с работой, я созрел.
Скажу, что и программированием, и радиоконструированием я люблю заняться еще со школы. Микроконтроллеры подарили настоящую радость — все и сразу. А Arduino тут нет не потому, что я его ненавижу он для этой задачи избыточен, или потому, что хочу быть не как все, просто я до него еще не добрался (или он до меня).
Вернемся к нашим баранам (ну или к нашему свету, или к нашему туалету). Лично для меня нарисовать в голове ТЗ (да-да, нарисовать, это когда еще даже сформулировать не можешь, не то, что на бумагу записать) гораздо сложнее, чем его потом реализовать. После недель раздумий вот что примерно у меня получилось:
- свет должен включаться когда я открываю дверь (захожу например);
- свет должен включаться когда я закрываю дверь (зашел в санузел с открытой дверью и закрыл за собой);
- свет должен включаться когда я захожу не трогая дверь (заглянул руки помыть);
- автовыключение света через определенное время;
- свет не должен выключаться когда я внутри и даже не шевелюсь.
Вроде как все логично и просто, но ни в одной из встреченных статей я не нашел красивого решения. Самое простое — это датчик движения. Он включает свет когда кто-то есть и выключает через некоторое время. Для моих целей ему не хватает в пару лишь геркона — следить, открыта дверь или закрыта.
Не понимаю, почему до сих пор производители до этого не дошли. Или дошли, а не дошло до меня?
Алгоритм прост:
- если сработал датчик движения — включить свет;
- если изменилось состояние геркона (дверь открылась/закрылась) — включить свет;
- если сработал датчик движения при закрытой двери (геркон замкнут) — не выключать свет пока дверь не откроют;
- ну и выключить свет через какое-то время.
Вот теперь ТЗ понятно, мне необходимы:
- датчик движения;
- геркон;
- МК для управления этим бардаком.
Был куплен самый дешевый ДД (инфракрасный), какой-то геркон, ATTiny2313.
Разбираем датчик движения, видим внутри:
плата управления с инфракрасным приемником и зеркалом посередине и:
БП и реле. Мне повезло, в ДД есть все, что нужно: реле, транзистор для согласования, остальная обвязка (даже диод). При срабатывании датчика выдается сигнал TTL, достаточно его перехватить, а сигнал с моего МК передать вместо него.
В ISIS нарисовал схему (если делать, то красиво)
в BASCOM-AVR написал программулину:
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Porta = Output
Config Portb = Output
Config Portd = Output
Config Portd.2 = Input
Config Portd.3 = Input
Config Int0 = Rising
Config Int1 = Change
Enable Interrupts
Enable Int0
Enable Int1
Config Debounce = 300
On Int0 Dd
On Int1 Gerkon
Dim Timecount As Integer
Dim Timelock As Bit
Timecount = 0
Timelock = 0
Portb.0 = 0
Portb.1 = 0
Do
If Timecount < 200 Then
Portb.0 = 1
Else
Portb.0 = 0
End If
If Timelock = 0 Then
Timecount = Timecount + 1
End If
If Timecount > 250 Then
Timecount = 250
End If
Waitms 100
Loop
Dd:
Disable Interrupts
Timecount = 0
If Pind.3 = 1 Then
Timelock = 1
End If
Enable Interrupts
Return
Gerkon:
Disable Interrupts
Timecount = 0
If Pind.4 = 0 Then
Timelock = 0
End If
Enable Interrupts
Return
Сделал эмуляцию, вроде как все работает (после отладки, конечно). Собрал макет и проверил (собирать такие макетки не так сложно, главное начать):
Режем в ДД дороги и подключаем согласно воспаленному воображению принципиальной схеме:
Проверил — заработало. Автоматическое отключение примерно через 1 мин 20 сек (не почему-то, просто сразу так получилось, а меня устроило), остальная работа согласно заранее придуманной логике.
Тут сделаю отступление. Дело в том, что я паяю с тех времен, когда в ходу были транзисторы МП39 и МП42. Спаяно и написано было немало. Когда разработанная мною схема (а тем более программа) начинает работать с первого раза — я чувствую дискомфорт, так редко это со мной бывает. На тестирование была убита пара часов, багов не нашел, продолжало работать.
Собрал в рабочий вариант (ЛУТ не пригодился):
При помощи скотча и чьей-то матери все это заизолировал и закрепил в корпусе. В итоге полученный экземпляр внешне не отличается от исходного, не изменилась даже схема подключения (разве что добавилась пара проводов для геркона):
Главное — после каждого шага проверять работоспособность, плавали — знаем.
Монтаж и прочие банальности упущу.
Жена восприняла без энтузиазма и назвала «херней» (ерунда, еще оценит — а куда ей деваться).
Бюджет:
— ДД — 250 р. (дешевле не нашел),
— геркон — 38 р.,
— ATTiny2313 — 140 р. (цена конская, но ведь хотелось еще вчера).
За конструктивную критику заранее спасибо.
Автор: Sergey_Morozov