Многие защищают свои дачные участки от непрошеных гостей используя дешевые GSM-сигнализации. Основная ее задача напугать злоумышленника, привлечь внимание окружающих и сообщить хозяину строения, что на даче стоит проверить все ли в порядке. Серьезных грабителей конечно она не остановит, но добыча дачных воров таких людей, как правило, не интересует. Конечно такую сигнализацию можно сделать самому используя контроллер и gsm-модуль, но мне удобнее пользоваться заводским изделием. Такие сигнализации имеют интерфейс для подключения как проводных, так и беспроводных датчиков. Основная проблема — малая дальность беспроводных, и необходимость тянуть провода для проводных. В данном обзоре будем устранять эти недостатки. Любителей поделок (Arduino, платы, код) приглашаю под кат.
На моем дачном участке, помимо дома, есть еще баня и сарай. В них тоже хотелось бы поставить датчики появления людей с единым центром управления в доме. Вариантов тут два: радиоканал (15-20 метров проблематичны для передачи через кирпичные стены и металлочерепицу), отдельный провод к каждому датчику (не хотелось копать и тянуть и разводить провода между строениями). Еще одним вариантом была бы установка на каждом объекте своей сигнализации — что уже не бюджетно, и добавляет неудобств (3 брелка и тп). При этом между баней и домом, а также между баней и сараем у меня под землей проложена витая пара для работы иных моих электронных поделок. Более того, на каждом объекте стоит свитч переделанный под раздачу пассивного POE (12V по витой паре, на неиспользуемых жилах). Поэтому решение стало очевидным — снабдить проводными и беспроводными датчиками сарай и баню, а данные передавать через Ethernet в дом, где преобразовывать это дело в формат понятный сигнализации. Помимо этого, я решил добавить уведомления через интернет и связать видеонаблюдение с сигнализацией (например, скидывать снимки на почту в момент срабатывания). Все это и будет решать разработанное в обзоре устройство.
Моя сигнализация куплена
здесь. Года полтора назад.
Для примера из нескольких датчиков был выбран обозреваемый беспроводной герконовый датчик, предназначенный для распознавания открывания дверей и окон.
Фото:
С обратной стороны:
Антенна выдвигается, размеры:
Вскрытие (крышечка легко открывается):
Датчик приехал с уже установленной батарейкой типа 23A. Изготовление типичное для китайских устройств, флюс не смыт. Видим передатчик 433 MHz, геркон, антенну, микросхему SC1527L и обвязку. Визуальный интерфейс прибора очень простой: два светодиода верхний сигнализирует о срабатывании датчика (в это время идет посылка на главный блок по радиоканалу). Нижний светодиод сигнализирует о необходимости замены батарейки. Дальность связи в помещении порядка 8-10 метров (одна кирпичная стена).
Нам необходимо поймать сигнал от этого или подобного устройства (например в бане) и передать через Ethernet на устройство в доме, которое либо выдаст код в эфир, либо проводом сообщит головной сигнализации о срабатывании. Приступим к изготовлению. Для простоты изготовления и из-за некритичности габаритов я взял Arduino Pro Mini и готовые модули реализующие заданные функции.
Для устройства в программе Sprint Layout была разработана печатная плата:
На плате присутствуют:
— Arduino Pro Mini
— Приемник и передатчик 433 MHz
— Сетевой модуль ENC28J60 mini
— Импульсный DC-DC преобразователь cn1584
— 3 электролитических конденсатора в цепи питания на 470 mF и керамический на 100 nF
— Линейный стабилизатор ams1117 на 3.3 V, для питания сетевого модуля
— Светодиод с токоограничивающим резистором. для индикации наличия питания
— Подтягивающие резисторы на 10 KOhm
На данной плате используются и готовые модули и smd-компоненты, мне так показалось удобнее. Эта плата универсальная, содержит и приемник и передатчик. На стороне датчиков можно ограничиться приемником, а на стороне головного устройства сигнализации — передатчиком. Универсальное устройство позволит, например, управлять перезагрузкой каких-либо устройств посылая сигнал
устройству из прошлого обзора.
Изготовление устройства
Печатаем на желтой бумаге для термотрансфера:
Готовим заготовку:
В дело вступает надежный, тяжелый отечественный утюг:
Рисунок на заготовке:
Хлорное железо кушает лишнюю медь:
Две платы после лужения:
Напаиваем компоненты и тестируем:
Обратная сторона (до смывки флюса):
Теперь можно подключать USB-TTL-конвертер и сетевой кабель:
Обратная сторона со смытым флюсом:
В качестве антенн, припаиваем проводки длиной около 17 см:
Желающие повторить устройство могут
скачать плату в формате .lay.
Далее самое интересное, программная составляющая.
Нам потребуется
библиотека rc-switch, которая позволит извлекать закодированную этими датчиками информацию. Загружаем типовой пример:
получение кода
/*
Simple example for receiving
https://github.com/sui77/rc-switch/
*/
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
}
void loop() {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == 0) {
Serial.print("Unknown encoding");
} else {
Serial.print("Received ");
Serial.print( mySwitch.getReceivedValue() );
Serial.print(" / ");
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( mySwitch.getReceivedProtocol() );
}
mySwitch.resetAvailable();
}
}
И отсоединяя магнит от геркона видим отчаянный крик в эфире:
Код нашего устройства: 1022617
пишем код распознающий срабатывание нашего датчика
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
}
void loop() {
if (mySwitch.available()) {
unsigned long value = mySwitch.getReceivedValue();
if (value == 1022617) {
Serial.println("Detected");
}
mySwitch.resetAvailable();
}
}
После загрузки этого кода, каждое отсоединение магнита приведет к следующим сообщениям в консоли:
На каждое событие датчик делает 19 посылок.
Осталось это передать по сети. Для модуля ENC28J60 нам потребуется библиотека
ethercard. Пишем нехитрый код:
Отправка в центр данных о событии
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// yurok (last change 19.04.2016)
// Signal (433) control (draft)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <EtherCard.h>
#include <RCSwitch.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PIN configuration
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define ETHERNET_PIN 10
#define ETHERNET_RST_PIN 14
// buffer size for get and send network messages
#define NETWORK_BUFFER_SIZE 700
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Network configuration
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ethernet mac address - must be unique on your network
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x34 };
// ethernet interface ip address
static byte myip[] = { 192,168,0,31 };
static byte gwip[] = { 192,168,0,1 };
static byte dnsip[] = { 192,168,0,1 };
static byte mymask[] = { 255,255,255,0 };
const char website[] PROGMEM = "192.168.0.44";
byte Ethernet::buffer[NETWORK_BUFFER_SIZE]; // tcp/ip send and receive buffer
BufferFiller EtherBufferFiller; // prepare the webpage by writing the data to the tcp send buffer
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
// Ethernet init
if(ether.begin(sizeof Ethernet::buffer, mymac, ETHERNET_PIN) == 0){
Serial.println( "Failed to access Ethernet controller");
exit(0);
}else{
Serial.println( "Ethernet controller ok");
};
digitalWrite(ETHERNET_RST_PIN, LOW);
delay(20);
digitalWrite(ETHERNET_RST_PIN, HIGH);
ether.staticSetup(myip, gwip, dnsip, mymask);
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
if (!ether.dnsLookup(website)) Serial.println("DNS failed");
ether.printIp("SRV: ", ether.hisip);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
}
// called when the client request is complete
static void my_callback (byte status, word off, word len) {
Serial.println(">>>");
Ethernet::buffer[off+300] = 0;
Serial.print((const char*) Ethernet::buffer + off);
Serial.println("...");
}
void loop() {
ether.packetLoop(ether.packetReceive());
if (mySwitch.available()) {
unsigned long value = mySwitch.getReceivedValue();
if (value == 1022617) {
Serial.println("Detected");
ether.browseUrl(PSTR("/index.html"), "", website, my_callback);
}
mySwitch.resetAvailable();
}
}
Подключаем устройство к домашней сети, запускаем на ноутбуке (192.168.0.44) апач (просто он был), видим в консоли:
Данные надписи говорят о том, что мы сумели распознать срабатывание датчика, передать данную информацию по сети и получить положительный ответ от веб-сервера. В лог-файлах веб сервера присутствуют наши запросы:
На основе данного кода легко организовать удаленную обработку срабатывания датчиков через Ethernet. Причем все датчики от этих сигнализаций работают по одному принципу: распознали событие и многократно шлют в эфир свой код. Проводные датчики можно подключить к специально оставленным входам нашей платы и также передавать информацию о событиях по сети. Конечно приведенный код — это только прототип, но основные моменты все присутствуют. Естественно нужно добавить защиту от повторов и тд, но каждый это сам вполне может проделать.
На этом заканчиваю. Спасибо тем кто дочитал до конца, надеюсь кому-то информация окажется полезной! Если будет интересно, продолжу писать про дачное творчество.
Конечно пишите, многим будет актуально.
Недавно еле раздобыл себе полтора литра.
Кстати, в России частично тоже
Павбывав бы!
А если смотреть в интернет магазинах аптек, то почти везде есть в наличии, а если спросил и ответили нет — просто не понравился продавцу.
в строительных магазинах пока есть
я думаю — желающие нанюхаться вполне найдут средства и без ацетона
Я бы закупился :)
Недавно купил канистрочку ацетона 2,5 кг всего за 29 рублей, уценка понимаете ли. Помята немного емкость была.
Взял в стекле 4 бутылки 0.5 по 63 руб — мне так удобнее
Такими темпами скоро хабр прикроют за ненадобностью :)
я по крайней мере такое пишу… что самому надо
и снова в закладки)
в пределах одного строения вполне нормально — а с этим решением больше и не нужно
А супергетеродин для приема дискретных сигналов в радиусе 10-50м использовать — это кагбэ… Жирно будет!
а для 433 МГц все давно посчитано и проверено, и кстати — антенна совсем не обязательно штырь, некоторые геметрические формы творят чудеса в увеличении дальности.
ebay.com/itm/251980631242
aliexpress.com/item/3pcs-superheterodyne-433mhz-rf-Wireless-receiver-Module-small-size-low-power-For-remote-control/32320064143.html
aliexpress.com/item/1piece-superheterodyne-433mhz-rf-Wireless-transmitter-Module-small-size-low-power-For-remote-control/32477505292.html
aliexpress.com/item/1set-RF-module-433-Mhz-superheterodyne-receiver-and-transmitter-Support-ASK-OOK-small-size-low-power/32571703475.html
одной кнопки управления для срабатывания реле на 15 метров прямого расстояния достаточно))
Может можно блютус или вайфай модули прилампичить к сигнализации и датчикам?
или там в комплекте идёт ещё какой-то приёмник?
не раз натыкался на эту «фигатень» в продаже по словами GSM, но пробежавшись по описанию и поняв, что в ней нет ничего общего с GSM закрывал её нафиг))
причём у Вас тоже в заголовке есть присутствие GSM, но в отличии от продавцов тут есть упоминание об охранном комплексе работающем на GSM, к которому этот передатчик через ещё как минимум двух посредников должен достучаться, а оно уже сработает на GSM… я так это понял)) хотя неправильно это как-то ассоциируется с данным девайсом, так как изучаешь обзор, чтобы понять откудо же в нём GSM))
не совсем понял зачем в вашей сборке устройств присутствие передатчика? передача же осуществляется по NET? а для приёма сигнала от датчика нужен только приёмник… или это на будущее для целей ваших «перезагрузок» устройств? так опять же, непонятно, что оно будет перегружать, так как до других сооружений не достанет, а зайдя в сооружение с наличием данной сборки, перезагрузку проще рукой по тумблеру сделать))
возможно я банально туплю уже, 4е сутки с инета не вылажу по изучению разной инфы во время отпуска, но реально не понятно, два раза перечитал, поясните плизз))
и данный девайс(датчик-передатчик) будет работать с любым приёмником или ему нужно как-то прописать в приёмник тот индефикатор, который вы вычислили?))
1 — на плате есть приемник и передатчик (плата универсальная), приемник, например принял сигнал от датчика в сарае, передал его по сети в дом, а там такая же плата в эфир пошлет его код — у сигнализации ощущение, что датчик сработал совсем рядом
2 — перезагрузка устройств из другого обзора — делается так: по сети передатчик принимает команду и отправляет в эфир код — нужный приемник перезагружает устройство. Ходить не требуется
в приемнике требуется прописать — код и процедуры приведены в обзоре