habrahabr

Моя реализация автоматического включения света в туалете (и без Arduino)

  • четверг, 13 марта 2014 г. в 06:06:34

http://habrahabr.ru/post/215383/

Всем привет!
На Хабре появляются и появляются статьи о реализации Умного дома. Самой главной проблемой (ну или только для меня) получается включение/выключение света в санузле. Вроде и вещь не хитрая — а сколько есть вариантов. Прочитав статьи, в том числе, тут и тут, я подумал «А ведь все могло быть проще».

Этот червячок точил меня около полугода. И вот, когда стало свободнее с работой, я созрел.
Скажу, что и программированием, и радиоконструированием я люблю заняться еще со школы. Микроконтроллеры подарили настоящую радость — все и сразу. А Arduino тут нет не потому, что я его ненавижу он для этой задачи избыточен, или потому, что хочу быть не как все, просто я до него еще не добрался (или он до меня).
Вернемся к нашим баранам (ну или к нашему свету, или к нашему туалету). Лично для меня нарисовать в голове ТЗ (да-да, нарисовать, это когда еще даже сформулировать не можешь, не то, что на бумагу записать) гораздо сложнее, чем его потом реализовать. После недель раздумий вот что примерно у меня получилось:

  • свет должен включаться когда я открываю дверь (захожу например);
  • свет должен включаться когда я закрываю дверь (зашел в санузел с открытой дверью и закрыл за собой);
  • свет должен включаться когда я захожу не трогая дверь (заглянул руки помыть);
  • автовыключение света через определенное время;
  • свет не должен выключаться когда я внутри и даже не шевелюсь.


Вроде как все логично и просто, но ни в одной из встреченных статей я не нашел красивого решения. Самое простое — это датчик движения. Он включает свет когда кто-то есть и выключает через некоторое время. Для моих целей ему не хватает в пару лишь геркона — следить, открыта дверь или закрыта.
Не понимаю, почему до сих пор производители до этого не дошли. Или дошли, а не дошло до меня?
Алгоритм прост:

  • если сработал датчик движения — включить свет;
  • если изменилось состояние геркона (дверь открылась/закрылась) — включить свет;
  • если сработал датчик движения при закрытой двери (геркон замкнут) — не выключать свет пока дверь не откроют;
  • ну и выключить свет через какое-то время.


Вот теперь ТЗ понятно, мне необходимы:

  • датчик движения;
  • геркон;
  • МК для управления этим бардаком.


Был куплен самый дешевый ДД (инфракрасный), какой-то геркон, ATTiny2313.

Разбираем датчик движения, видим внутри:

плата управления с инфракрасным приемником и зеркалом посередине и:

БП и реле. Мне повезло, в ДД есть все, что нужно: реле, транзистор для согласования, остальная обвязка (даже диод). При срабатывании датчика выдается сигнал TTL, достаточно его перехватить, а сигнал с моего МК передать вместо него.
В ISIS нарисовал схему (если делать, то красиво)

Схема


в BASCOM-AVR написал программулину:

Код
$regfile = «attiny2313.dat»
$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 р. (цена конская, но ведь хотелось еще вчера).

За конструктивную критику заранее спасибо.