Pull to refresh

Домашняя автоматизация

Reading time 6 min
Views 32K
Накопил немного информации с инета по схемотехнике, контроллерам, различным примерам. Как подтверждение моему небольшому развивающемуся проекту, решил написать сею статью…

Итак имеем:
Роутер dir-320( с dd-wrt, процесс установки описан на нашем личном блоге, если нужно статью дополню ссылками на блог), контроллер ATmega8535, небольшая схема управления на оптодрайвере, обьект управления ( настольная лампа, усилитель звуковой, домашний водонагреватель ), немного проводов, паяльник, свободное время.
Что хотелось бы получить: программное управление питанием обьектов, питающихся от сети ~220 В.

На Хабре был целый цикл статей про «как включать настольную лампу от LPT» и прочее… НО! Здесь предлагается более-менее продвинутая, безопасная и автономная система по управлению.

Для небезлимитов — под катом картинки.

Собственно управление объектом производится следующим образом:

Мобильный телефон->мобильный браузер->wifi(мобильный)->wifi(роутера dir-320)-> установленный lightpd->обработчик на perl->uart(роутера)->uart(контроллера mega8535)->управляющий сигнал(+5в контроллера)->управляющий сигнал(+5в оптодрайвера)-> управляемый сигнал(~220в оптодрайвера)->объект управления.
В данной схеме можно заменить «Мобильный телефон->мобильный браузер->wifi(мобильный)->» на ноутбук, рабочий комп и тп.

Также имеется возможность управления через wan порт, подключенный к инет сети, опять же посредством обращения к lightpd.

Какие + данной схемы управления:

  • Не нужно вставать с кровати для включение отключения света, так как управление либо с ноута, либо с мобилы.
  • Есть возможность экономии энергии посредством отключения/включения водонагревателя, даже если вы не дома – через инет.
  • Комплексное включение/отключение устройств(подходя к дому, можно заранее включить например свет везде где нужно. в том числе и эл. чайник перед приходом)
  • Часто забываю отключать устройства от сети перед уходом. это становится возможно в любой момент.


Какие – данной схемы управления:

  • Возможно достаточно не удобно будет доставать или держать каждый раз в руке мобильный телефон для включения/отключения света. Но это решается путем параллельного включения оптодрайвера с физическим выключателем. Но опять же будет не отключить удаленно, если включатель включен.
  • К каждому устройству идет дополнительный провод и устройство на оптодрайвере. Провода нужно как-то крепить к стене или прятать в стену, что влечет за собой смену обоев ))))) Оптодрайвер же нужно както прятать в розетку, дай бог если там хватит места )
  • Исключительная ситуация, когда мобила села, ноут не включается, а компьютер сломался. Решается лишь параллельным включением физических средств управления.

Какие возможности дополнения данной схемы управления:
  • Поставить датчики движения для включения света. На контроллере сделать регулируемую задержку отключения (3-5минут по усмотрению).
  • Беспроводное управление посредством toshiba микросхем, но придется дополнять схемой питания от ~220в.


Ну собственно на практике будем делать следующее:

Для начала необходимо определиться с ПО роутера.
Поскольку у нас linux на борту dir-320, то работа с физическими портами не доставляет никаких проблем – софта полно, можно ставить и использовать.
Наш интерфейс UART роутера с программной точки зрения висит на /dev/tts/0.
В него то мы и будем писать данные, которые будут передаваться контроллеру.
Вообще я не кодер и писать проги на Сях для работы с устройствами, имхо есть штатные средства. Например перенаправление вывода в shell:

echo «данные» > /dev/tts/0

Собственно команда отошлет строку в порт, что нам и нужно.
Перед использованием порта, его необходимо настроить. ( стоповые биты, контроль передачи, скорость )
В данном случае будет использоваться 8 бит данных, 1 стоповый бит, 300 бод(а нам больше и не надо).

stty -crtscts 300 < /dev/tts/0

Для управления был разработан простейший протокол:

Строка начинается с символа !, затем идет слово port, затем указание порта контроллера( в данном случае на mega8535 их 4 – A,B,C,D ). Затем номер пина ( их 8 штук, от 0 до 7). Затем байт n или f (n – соответственно подать +5в на пин, f – не подавать на пин +5В )

Прим:

!porta1n – включит второй пин порта А на контроллере.
!portс4f – отключит пятый пин порта С на контроллере.
! – символ означает начала команды, те контроллер будет ждать начало команды только с символа!
port – для «контроля данных», мало ли какие наводки будут(хотя очень маловероятно).

Для этого был написан небольшой скрипт на перле вида:

#!/opt/usr/bin/perl
$cmd=$ARGV[0];
`echo !port$cmd > /dev/tts/0`;


Запуск его выполняется в формате «do.pl a1n», что включит на контроллере пин 1 порта А.
lighttpd и будет запускать скрипт do.pl

Ставим lighttpd:

ipkg-opt update
ipkg-opt install lighttpd
ipkg-opt install mod-fastcgi


Далее редактируем /opt/etc/lighttpd/lighttpd.conf
Выставляем настройку порта – 8080 (можете выбрать по своему усмотрению).
!!! МЕНЯЕМ
# server.event-handler = «freebsd-kqueue» # needed on OS X
на
server.event-handler = «poll» # needed on OS X
иначе будет ругаться при запуске.

/opt/etc/init.d/S80lighttpd start

Корневая директория будет /opt/share/www. Пишем скрипт на пхп для запуска perl скрипта с параметрами. ( Весьма ресурсоемко и я бы даже сказал «глупо» использовать такие вложения перла в пхп, но все же пример рабочий. )

<?php
$do=$_GET['do'];
if (!isset($do)) { print "no command"; exit(0);}
passthru("/opt/bin/perl /opt/home/do.pl do");
?>


ВНИМАНИЕ!!! хочу заметить, что использование данных примеров – удар по безопасности… имхо нужно будет проверять переменную do.

Теперь, обращаясь по адресу http://:8080/test.php?do=a1n – отправит данные на контроллер Включится 2ой пин порта А.

Теперь рассмотрим физическое подключении роутера с контроллером.



Как видно из изображения – уарт у нас внизу – 5 выводов крайние – приемник и передатчик второй земля средний 3.3 В, но он нам не нужен.


В контроллере же используются для приема/передачи 14 и 15 порты.
Соответственно соединяем RX роутера и TX контроллера, и наоборот TX роутера с RX контроллера.
Если вы питаете контроллер от источника питания роутера(роутер питается от 5 В), то нужно лишь 2 провода. НО! если же вы питаете контроллер от других источников питание, необходимо объединить GND 3им проводом!!!
В итоге у меня получилось следующее.



Кстати, роутер от МТС, беленький ))
Как видим контроллер находится сверху, в крышке сделаны 4 отверстия D=1мм для проводов, 2 -уарт, 2- питание контроллера. ( питание роутера 5В, кто мешает взять нам питание для контроллера прямо с порта роутера :) )
Удобно для модернизации прошивки контроллера, тк контроллер на панельке.
Также, выводы пинов контроллера подключены к дополнительной плате с клемниками(синенькие), откуда и идет управляющий ток на оптодрайверы.

Итак контроллер.

Собственно здесь только прошивка. Все писалось в CodeVisionStudio.
Пример прошивки на Сях.
В генераторе кода включаем все порты на вывод.
В панели UART включаем прерывание, буфер на 8 символов. Скорость 300 бод, 8 бит данных, 1 стоповый.

Часть программы:

int port(char port,char num,char is)
{

if (port=='a')
{
putchar('A');
if (num=='0') {if ( (PINA.0==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+1;} if ( (PINA.0==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-1;} }
if (num=='1') {if ( (PINA.1==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+2;} if ( (PINA.1==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-2;} }
if (num=='2') {if ( (PINA.2==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+4;} if ( (PINA.2==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-4;} }
if (num=='3') {if ( (PINA.3==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+8;} if ( (PINA.3==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-8;} }
if (num=='4') {if ( (PINA.4==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+16;} if ( (PINA.4==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-16;} }
if (num=='5') {if ( (PINA.5==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+32;} if ( (PINA.5==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-32;} }
if (num=='6') {if ( (PINA.6==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+64;} if ( (PINA.6==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-64;} }
if (num=='7') {if ( (PINA.7==0) && (is=='n') ) {putchar('N'); PORTA=PORTA+128;} if ( (PINA.7==1) && (is=='f') ) {putchar('F'); PORTA=PORTA-128;} }
}

return 0;
}


Для других портов по аналогии.

В функции main:

while (1)
{
k = getchar();
if (k=='!')
{
for (i=0;i<=6;i++)
{
buf[i]=getchar();
}
if ( (buf[0]=='p') && (buf[1]=='o') && (buf[2]=='r') && (buf[3]=='t') )
{
port(buf[4],buf[5],buf[6]);
}
}
}


На данном этапе имеем возможность управлять выводами через веб роутера!!!
Теперь нам необходимо как-то управлять нагрузкой ~220 в посредством 5В, которые нам дает контроллер.
Конечно можно было бы использовать реле для таких целей + транзистор, тк выходной ток пинов контроллера не способен управлять реле. Опять же нужно было бы использовать дополнительный источник питания для цепи транзитор – реле. Да и не долговечны релюшки.
Ввиду таких обстоятельств пришлось остановиться на оптодрайвере.

Преимущества:

  • Не нужно дополнительного питания.
  • Контакт между цепями 220 и 5 исключительно посредством света ( диод + фотодатчик)
  • Бесшумность
  • Большой ток


Недостатки:

  • Немного дороже, чем реле
  • Симистор греется, нужен радиатор дополнительный
  • Изготовление дольше и сложнее, но не намного


Итак Оптодрайвер.



Нам понадобятся:

  • Резистор 380 Ом
  • Резистор 330 ОМ
  • Резистор 39 Ом
  • Резистор 1 кОм
  • Керамический конденсатор 0.01 мкФ!!! вольт так на 500-600, но не менее 300!!
  • Симистор BT139
  • MOC3041


В итоге должно получиться чтото наподобие вот таких плат.



Данная схема выдерживает ток до 16 ампер, что соответствует 3 киловаттам нагрузки.
С учетом того, что мой водонагреватель – самое потребляемое устройство в квартире, и то потребление идет – 2 киловатта.!!! Но при нагрузке выше киловатта, нужно ставить радиатор на симистор, так как греется.

Вообще по сути можно использовать любое устройство в котором есть UART, а он есть практически во всех видах роутеров. Различие только лишь в том, как его запрограммировать.

ps: Вопросы, предложения?
pps: народ, не пишите комменты вида «вот если бы не руки из опы...» и подобные, тк все проще некуда ;)

ppps: Почитал комменты, хочу сделать небольшой экономический обзор ввиду сравнения стоимости с готовыми изделиями типа ардуины.

  • Роутер был куплен в МТС за 1500 р
  • Контроллер за 150-200р.
  • Каждая схема на симисторе обходится рублей в 100.
  • Провода для разводки если в магазине — 5-10 р. за метр.
  • Прочее барахло — 100 р.
Tags:
Hubs:
+74
Comments 78
Comments Comments 78

Articles