PDA

Просмотр полной версии : Непримитивная сигнализация


Animal
02.03.2008, 16:27
Подходит ко мне братан и говорит:"Сделай мне сигнализацию для гаража." Ну, я ему, как прожженый конструктор:"Пишите ТЗ, товарищ! Причем по ГОСТ-ам!". Нормальная такая фраза, когда делать чего нибудь не хочется. :) А он мне:"Не сделаешь - к компьютеру хрен больше подойдешь!" Вот эта фраза меня сильно простимулировала. :)
Итак, исходные данные:
На двери будет стоять герконовый датчик, а в помещении, так называемый датчик "объема" TEXECOM REFLEX (классная штука кстати, и стоит всего рублей 300).
http://img131.imageshack.us/img131/1697/reflexmlt8.th.gif (http://img131.imageshack.us/my.php?image=reflexmlt8.gif)
В рабочем положении оба датчика замкнуты (TEXECOM через сопротивление 18 Ом, кстати). В помещении будет стоять штатный извещатель (какой - не знаю, бирки на нем стерты), в нем пьезоизлучатель с генератором к нему (уши закладывает - мама не горюй! :) и лампа (из трех светодиодов, каждый - размером с палец). У лампы и излучателя раздельное питание. Будет кнопка "постановка на охрану" на ящике "сейфового типа, в котором все "кишки" спрятаны и потайная кнопка "снять с охраны". Так же на ящике будет светодиод (просто чтобы был :).
Схема устройства:
http://img127.imageshack.us/img127/745/63135783gy5.th.jpg (http://img127.imageshack.us/my.php?image=63135783gy5.jpg)

В тексте подробные комментарии, но, на всякий случай, опишу алгоритм работы на "пальцах".
После подачи питания контроллер инициализируется и ждет 10 сек (это надо датчику "объема")
do{ бесконечный цикл
ждем 10 сек перед постановкой на охрану и смотрим кнопку "снять с охраны"
если датчики в норме
{ Ждем срабатывания датчиков
Ждем 10 сек или кнопку "снять с охраны"
Включаем тревогу и смотрим кнопку "снять с охраны"
}
иначе даем сигнал неудачной постановки и ждем кнопку "снять с охраны"
ждем кнопку "постановки на охрану"
}while(true);

Animal
02.03.2008, 16:35
Это пипец! Я не могу текст программы оправить! Он мне постоянно выдает
"500 Internal Server Error". Ни с тегами CODE, ни тупо текстом! Че за фигня и как с ней справиться?

iddqd
02.03.2008, 16:53
ога, я тоже с этим столкнулся
не могу запостить большой объём текста- приходится разбивать на несколько постов

Animal
02.03.2008, 16:56
Текст программы, часть 1:

#include <16F676.h> //Выбираем контроллер
#use delay(clock=4000000) //Частота внутр генератора 4МГц
#use Fast_IO(A) //Ручная установка регистров TRIS
#use Fast_IO(C)
#fuses nowdt, nomclr,intrc_IO //отключаем сторожевой таймер,
//отключаем внешний сброс
//работа от внутреннего генератора
//без тактовых импульсов на RA4
#define DAT1 Pin_A5 // первый датчик (объем)
#define DAT2 Pin_A4 // второй датчик (контакт)
#define Sec_On Pin_A3 // кнопка "поставить на охрану"
#define Sec_Off Pin_C5 // кнопка "снять с охраны" секретная :)
#define Out_Siren Pin_A0 // выход на сирену
#define Out_Lamp Pin_A1 // выход на лампу
#define Out_Led Pin_A2 // выход на светодиод

//переменные****************************** **************************
Boolean Stat_Dat1, //состояние первого датчика
//true, если датчик замкнут (на охране)
Stat_Dat2, //состояние второго датчика
//true, если датчик замкнут (на охране)
Stat_On, //состояние кнопки "поставить на охрану" true, если была нажата
Stat_Off; //состояние кнопки "снять с охраны" true, если была нажата
Unsigned int16 Time; //это время, "тикает" с тактом 0.01 секунды
//прерывания****************************** ****************************
#Int_Timer0 // обработка прерывания
void Timer0_Isr()
{ ++Time; // добавляем единицу к счетчику времени, 1 счет=0.01 сек
Delay_us(13);
Set_Timer0(100); }
//функции************************************ ***********************
void Initial() //функция настройки контроллера
{ setup_adc_ports(NO_ANALOGS); //все выводы "цифровые"
setup_adc(ADC_OFF); // отключаем АЦП
setup_timer_0(RTCC_Internal|RTCC_Div_64); // настройка таймера 0
setup_timer_1(T1_DISABLED); //отключение таймера 1
setup_comparator(NC_NC); //отключение компаратора
setup_vref(FALSE); //отключение порогового напряжения компаратора
Set_Tris_A(0b11111000); //выводы RA0, RA1, RA2 - выходы
Set_Tris_C(0b11111111); //весь порт С настроен на вход
enable_interrupts(Global); //Запускаем счетчик времени
enable_interrupts(Int_Timer0);
output_low(Out_Siren); //Отключаем сирену и индикацию
output_low(Out_Lamp);
output_high(Out_Led);
Stat_On=false; //кнопки считаем отключенными
Stat_Off=false;
delay_ms(10000); //пауза при включении питания (для датчика объема)
//при сбросе питания система
//попытается встать на охрану
}

Animal
02.03.2008, 16:58
Текст программы, часть 2:

boolean Read_Dat1() //возвращает true, если датчик 1 замкнут
{ if (input(Dat1))
{ delay_ms(30);
if (input(Dat1))
{ delay_ms(30);
if(input(Dat1))
{return false;}
else return true;
}else return true;
}else return true;
} //end Read_Dat1()

boolean Read_Dat2() //возвращает true, если датчик 2 замкнут
{ if (input(Dat2))
{ delay_ms(30);
if (input(Dat2))
{ delay_ms(30);
if(input(Dat2))
{return false;}
else return true;
}else return true;
}else return true;
} //end Read_Dat2()

boolean Read_Sec_On() //возвращает true, если кнопка постановки на охрану нажата
{ if (!input(Sec_On))
{ delay_ms(30);
if (!input(Sec_On))
{ delay_ms(30);
if(!input(Sec_On))
{return true;}
else return false;
}else return false;
}else return false;
} //end Read_Sec_On()

boolean Read_Sec_Off() //возвращает true, если кнопка снятия с охраны нажата
{ if (!input(Sec_Off))
{ delay_ms(30);
if (!input(Sec_Off))
{ delay_ms(30);
if(!input(Sec_Off))
{return true;}
else return false;
}else return false;
}else return false;
} //end Read_Sec_Off()

Animal
02.03.2008, 17:00
Текст программы, часть 3:

//***MAIN******************************************* ************
main()
{Initial();
do{ unsigned int16 Temp_Time; //начало главного цикла цикла
Stat_On=false;
Stat_Off=false;
Time=0;
Temp_Time=0;

// 10 секунд пауза перед постановкой на охрану
do{
Temp_Time=Time; //секундный цикл
do{ if(!Stat_Off)Stat_Off=Read_Sec_Off(); //проверяем кнопку снятия
}while(Time<(Temp_Time+100));
output_high(Out_Lamp); //5 сек моргаем лампочкой
if (Time>550) output_high(Out_Siren); //еще 5 сек - лампой и сиреной
Temp_Time=Time; //0.1секундный цикл
do{ if(!Stat_Off)Stat_Off=Read_Sec_Off(); //проверяем кнопку снятия
}while(Time<(Temp_Time+10));
output_low(Out_Lamp);
output_low(Out_Siren);
}while((Time<1000)&&!Stat_Off); //конец паузы
// попытка поставиться на охрану
Stat_Dat1=Read_Dat1(); //проверяем состояние датчиков
Stat_Dat2=Read_Dat2();
if (Stat_Dat1&&Stat_Dat2&&!Stat_Off) //если датчики в норме
{ do{ if (Stat_dat1) Stat_Dat1=Read_Dat1(); //и кнопку снятия не нажимали
if (Stat_dat2) Stat_Dat2=Read_Dat2(); //ждем срабатывания датчиков
delay_ms(900);
output_high(Out_Led); //подмигиваем светодиодом
delay_ms(100);
output_low(Out_Led);
}while(Stat_dat1&&Stat_Dat2); //один из датчиков сработал
Time=0;
do{ //перед тревогой пауза 10 сек
//для нажатия кнопки "снять"
Temp_Time=Time; //секундный цикл
do{ if(!Stat_Off)Stat_Off=Read_Sec_Off(); //проверяем кнопку снятия
}while(Time<(Temp_Time+100));
output_high(Out_Lamp);
if (Time>=550) output_high(Out_Siren);
delay_ms(100);
output_low(Out_Lamp);
output_low(Out_Siren);
}while((Time<1000)&&!Stat_Off);
while(!Stat_Off){ // ТРЕВОГА
output_high(Out_Lamp);
output_High(Out_Siren);
Temp_Time=Time;
do{ if(!Stat_Off)Stat_Off=Read_Sec_Off();
}while(Time<(Temp_Time+50));
output_low(Out_Lamp);
output_low(Out_Siren);
Temp_Time=Time;
do{ if(!Stat_Off)Stat_Off=Read_Sec_Off();
}while(Time<(Temp_Time+50));
}//конец тревоги
}
else //при попытке установки на охрану
//оказались разомкнуты датчики
//или нажата кнопка "снять с охраны"
while(!Stat_Off){ if (!Stat_Off) Stat_Off=Read_Sec_Off();
output_high(Out_Lamp);
output_high(Out_Siren); //сигналим о неудавшейся постановке
delay_ms(100);
output_low(Out_Lamp);
output_low(Out_Siren);
delay_ms(400);
}
// ожидание постановки на охрану
output_high(Out_Led); //зажигаем светодиод
do{ if(!Stat_On) Stat_On=Read_Sec_On(); //и ждем команду постановки на охрану
}while(!Stat_On);
output_low(Out_Led);
}while(1); //главный цикл
} //main

Animal
02.03.2008, 19:11
Вот такой вот получился девайс. Собрал на монтажке за час.
http://img502.imageshack.us/img502/8715/50199999il8.th.jpg (http://img502.imageshack.us/my.php?image=50199999il8.jpg)
и сама платка
http://img167.imageshack.us/img167/7282/topviewtn7.th.jpg (http://img167.imageshack.us/my.php?image=topviewtn7.jpg)

http://img502.imageshack.us/img502/4046/botviewhu0.th.jpg (http://img502.imageshack.us/my.php?image=botviewhu0.jpg)

Братан тестировал - сказал, что все работает отлично. Только возможно паузу перед постановкой на охрану придется увеличить до 15 сек - датчик "объема" долго в штатный режим переходит. Вот. :)

presidentua
02.03.2008, 20:49
На монтажке за час!!!

Вот это скорость сборки. Поделись секретом! :)

А по сути. То сейчас розбираюсь со схемой и с немного с прогой :). Спасибо

Animal
02.03.2008, 21:27
Просто рука набита. :) А секрет,наверное, в оптимальном и продуманном расположении элементов. :)

presidentua
02.03.2008, 23:20
Везет тебе! вот я всегда сделаю и схему и програму и в протеусе отлично работает, а как доходит до паяния так все лень. Хоть и работы на пару часов, но пока заставлю себя :) Может когда то поменяется характер :))))))))

Animal
03.03.2008, 00:55
Братан потихоньку начинает хотеть "таблетку" вместо секретной кнопки, так что с далласами мы еще поработаем. :)

Demius
03.03.2008, 09:09
Тогда ешё чтобы и СМС отправляла на телефон что гараж вскрыли.

Animal
03.03.2008, 10:58
Тогда ешё чтобы и СМС отправляла на телефон что гараж вскрыли.
Вот это точно лишнее... Да и GSM-модули нынче удовольствие дорогое пока... Хотя, можно взять какую нибудь древнюю мобилку и кидать туда АТ-команды. Кто нибудь такое реализовывал?

spy-profi
03.03.2008, 16:16
Animal - можна твою асю? (Просто поинтересоваться....)

MegaDeth
03.03.2008, 18:11
это прикольна =)))
только действительно секретная кнопачка это от бомжей разве что защитит =)))
я бы сделал со sleep() :rolleyes:

Animal
03.03.2008, 20:07
только действительно секретная кнопачка это от бомжей разве что защитит =)))
я бы сделал со sleep() :rolleyes:
Смотря, на сколько она секретная. :)))
Цель должна оправдывать средства. А тут на содержимое банковские взломщики не позарятся. машины там нет, хлам один. :)
sleep() -это что такое?

MegaDeth
03.03.2008, 20:57
Смотря, на сколько она секретная. :)))
Цель должна оправдывать средства. А тут на содержимое банковские взломщики не позарятся. машины там нет, хлам один. :)
sleep() -это что такое?
:rolleyes: ну это МК в спячку впадает и потребляет намного меньше. пробуждается по прерыванию, ктоторое может быть вызвано изменением уровня на входах, переполнение таймера итд...
такой способ еще в пультах например применяется, ато иначе батарейки быстро сдохнут =)))
для сигнализации самое то имхо :rolleyes:

Animal
03.03.2008, 21:27
Млять! Я уж что-то страшное подумал. :)))) Sleep конечно идеален для батареечных вариантов, это ты абсолютно прав. Только у меня туда 220 все равно приходит и снаружи его подрезать невозможно, да и снутри непросто. :) Пущай себе от сети питается.

presidentua
04.03.2008, 02:38
Вот это точно лишнее... Да и GSM-модули нынче удовольствие дорогое пока... Хотя, можно взять какую нибудь древнюю мобилку и кидать туда АТ-команды. Кто нибудь такое реализовывал?
В одном из выпусков Хакера пацыки это делали там и инфу вылаживалы по этому. Статья называется Длинная рука контроля. У меня диск был, но к сожалению саму статью не читал. Но думаю управлять не особо и сложно там. Все таки РС232. Насколько я понял из листинга проги (там на АСМЕ), то мобила напрямую подсоединяется к порту UART. Там на Атмеловской Меге делали. Наверно буду такое себе цеплять на диплом.

Demius
04.03.2008, 07:40
А я и говорил про трубу. Модуль дорого хотя он и с описанием и с примерами иногда идёт. Вот нашёл ссылки про GSM т.е. как подключить и как использовать:
http://forum.modlabs.net/topic4124.html
а это адапторы
http://nmt.btv.ru/index.php?page=adap
а это буржуйское
http://www.embedtronics.com/nokia/fbus.html

Animal
04.03.2008, 16:15
С GSM я пока связываться не буду - времени нет :(. Но если кто нибудь реализует - очень интересно было бы посмотреть. :) У Demiusa последняя ссылка очень уж толковая, понравилась.
Сегодня прикупил себе ключ "стандартный", как президент выразился :). Правда не DS, а аналог STM Smart Button какой-то (всего 40р.). Испытаю-отпишусь.

presidentua
05.03.2008, 09:23
Ждем отчета :) Кстати, а продаются разьемы для подключения в них таблеток?

Demius
05.03.2008, 10:14
Да конечно почти всё можно купить в конторах, которые занимаются установкой систем видеонаблюдения и доступа в помещения.

Animal
05.03.2008, 15:08
Ждем отчета :) Кстати, а продаются разьемы для подключения в ним таблеток?
http://img126.imageshack.us/img126/8054/ibuttonvq6.th.jpg (http://img126.imageshack.us/my.php?image=ibuttonvq6.jpg)
Нормальный DS1990A стоит примерно руб 70-80, просто их небыло :( Ответный контакт я купил за 150 руб.

Demius
21.03.2008, 10:27
Ну что всё проект встал?

Animal
21.03.2008, 19:16
Ну что всё проект встал?
Ну почему же? Вот отчитываюсь по I-Button:
алгоритм вкратце:
определяем наличие ключа;
передаем команду чтения ROM;
читаем код семейства ключа (для 1990А =01h);
читаем шесть байт собственно ключа (начиная с младшего);
читаем контрольную сумму CRC.
Используемые функции:

boolean Touch_Present() //
{ boolean present; //1-ключ обнаружен, 0-нет.
output_low(TOUCH_PIN);
output_drive(Touch_Pin);
delay_us(500);
output_float(TOUCH_PIN);
delay_us(5);
if(!input(TOUCH_PIN))
return(FALSE);
delay_us(60);
present=!input(TOUCH_PIN);
delay_us(250);
if(present) return(TRUE);
else return(FALSE);
}

void Touch_Write_Byte(unsigned int8 data) //передача байта ключу
{ unsigned int8 i;
for(i=1;i<=8;++i)
{ output_low(TOUCH_PIN);
output_drive(Touch_Pin);
delay_us(10);
if(shift_right(&data,1,0))
{ output_high(TOUCH_PIN);
delay_us(60);
}
else
{ output_low(TOUCH_PIN);
delay_us(60);
}
output_high(TOUCH_PIN);
delay_us(10);
}
}

unsigned int8 Touch_Read_Byte() //чтение байта от ключа
{ BYTE i,data;
for(i=1;i<=8;++i)
{ output_low(TOUCH_PIN);
output_drive(Touch_Pin);
delay_us(10);
output_float(TOUCH_PIN);
delay_us(10);
shift_right(&data,1,input(TOUCH_PIN));
delay_us(100);
}
return(data);
}

А вот сам модуль считывающий данные:

if(Touch_Present()==true) //если обнаружен ключ
{ Touch_Write_Byte(0x0F); //передаем команду считывания ROM
Fam=Touch_Read_Byte(); //читаем код семейства
temp=0;
do{Temp++; //читаем 6 байт серийного номера
Data[Temp]=Touch_Read_Byte();
}while(Temp!=6);
CRC=Touch_Read_Byte(); //читаем контрольную сумму

В очередной раз не удивило, что у CCS стандартные функции для работы с тач-мемори оказались кривыми, пришлось доработать. CRC не считал, просто лень.:) Лучше два раза код считать для верности. Экспериментировал, пытаясь получить неверный код имитируя плохой контакт:сложновато, примерно на 20-ый раз код читается неверно. Вот вообщем-то и все...
Demius, а ты кроме GSM какие еще видишь продолжения проекта? Думаю GSM сам по себе проект не простой будет. :)

presidentua
23.03.2008, 05:21
Ccs - это что? На первый взгляд смахивает на КодеВизион :). Но некоторых функций по другому называются.

Вот смотрю и радуюсь. "С" - это сила. Перекинуть твою прогу для роботы АВР очень легко, лишь пару функий дописать для совместимости и все :)

Animal
23.03.2008, 16:02
CCS PICC - компилятор С для PIC-микроконтроллеров. Те, кто профессионально пользуются, его не очень жалуют(больше Hi-Tech и компилятор от микрочипа), но я к нему привык очень. :) Содержит генератор начального кода и драйвера (можно сказать библиотеки) для работы с различными устройствами и мат.методами (часто кривыми). Вобщем-то ничего особенного в нем нет, но для "начинающего" это лучший вариант, т.к. полностью "отвязан" от использования регистров МК, да и вообще обладает большей "понятностью", по сравнению с другими компиляторами. Есть своя IDE (визуальная среда разработки), так-же более удобная, чем MP-Lab.
P.S: считал данные из таблетки и вывел на индикатор. Все полностью совпало с выгравированной на таблетке информацией. :)

http://img183.imageshack.us/img183/5581/86566725du4.th.jpg (http://img183.imageshack.us/my.php?image=86566725du4.jpg)

Demius
23.03.2008, 20:15
Demius, а ты кроме GSM какие еще видишь продолжения проекта? Думаю GSM сам по себе проект не простой будет. :)

ну можно было бы добавить:
1. в схему режим бесперебойного питания с информированием контролера что идёт питание от аккумулятора и с отправкой СМС что идёт работа по аккумулятору.
2. можно сделать управление замками любыми
3. можно сделать несколько объектов.
4. можно сделать табло с выводом разной инфы, по датчикам табло можно использовать от нокии.

ну вроде пока всё что приходит на мой мозг :D

Animal
23.03.2008, 21:54
1. тьфу-тьфу, но проблем с электричеством последние два года дома вообще не наблюдалось(гараж имеет общую стену с домом). И опять приходим к GSM. :(
2. Можно, это дельно, особенно после подключения i-button. Можно контакт вывести наружу. Ставим еще один узел, как на сирене и лампочке, а в качестве нагрузки - реле. И управляем замками любыми. :)
3. Не понял. По конкретнее. Почему не сделать на каждый объект свой модуль?
4. На много легче купить дисплей и не париться с протоколом обмена. Или,всмысле, по AT-командам? На данный момент это для меня темный лес. Дисплюй на последней картинке стоит 200р всего.

Demius
24.03.2008, 07:42
1. вам повезло
2. согласен
3. ну можно сделать чтобы 1 контролер проверял шлейфы, т.е. несколько устройств исполнительных и контролер проверяет их. Но вообще это тогда уже нормальная охранная система получается, и делать её как-то смысла нету, можно купить готовый блок и ставить.
4. дисплей в принципе можно любой, он служить только для отображения инфы что например при постановке на охрану всё гуд. Тогда датчик на двери должен ставиться через минуту или полминуты чтобы можно было посмотреть состояние всех шлейфов. Но тогда опять же это получается готовый блок который можно купить.
Хотя цена этих блоков слишком завышена по сравнению с таким самодельным устройством. Но если посчитать во что выльется это устройство, то получиться себестоимость готовых блоков.

Animal
24.03.2008, 11:50
Помоему все... дальнейшая модернизация нецелесообразна. :) Проект можно считать законченным.

Demius
26.03.2008, 07:48
Значит нужно теперь всё собрать в едино и выложить на критику наших участников.

Demius
01.05.2008, 10:53
Вот ешё нашёл такую ссылку
___http://www.telesys.ru/products/avr/avr.php

Можно объединить тогда вообше интересно получаеться.

Demius
07.06.2008, 07:45
Animal так где проект чтобы люди могли повторить сами всё? :)

Animal
10.06.2008, 22:17
Ээээ, не понял? А что еще требуется то? Схема - есть, прога - есть. А писать, как ставить MP-Lab и ССS и собирать программатор, некогда и, честно говоря, лень. :) К тому же здесь MegaDeach много этому внимания уделял.
Тебя самого то проект заинтересовал? Сам то сделать хочешь? Может тогда и возмешься за подробное описание? :)

Demius
25.06.2008, 08:15
Не я про то что у тебя получилось с ключами ибитон или нет. Если да то выкладывай проект.

Animal
25.06.2008, 11:57
Да все получилось (см 28 пост). Берем гнездо для таблетки, сигнльный контакт прям на ногу контроллера и подтягиваем к +5В через резистор 5.1кОм, земляной контакт, соответственно, к земле. Пользуем функции, приведенные в 26 посте. Получаем код семейства, собственно код ключа (серийный номер) и контрольную сумму Crc. А дальше обрабатывай эти данные так, как тебе хочется.
Вот вобщем-то и весь проект...

Demius
01.07.2008, 08:05
Вот ешё нашёл очень много схем в принцепе всё оказалось просто.
__http://eldigi.ru/site/guard/index.php

AHTOLLlKA
01.07.2008, 08:49
в этой теме вообще не шарю.. но прочел все с удовольствием... интересненько так то ;)
мануалы аля "сделай сам"
были бы очень интересны ;)

Animal
01.07.2008, 14:31
в этой теме вообще не шарю.. но прочел все с удовольствием... интересненько так то ;)
мануалы аля "сделай сам"
были бы очень интересны ;)
Ну, просто надо с чего нибудь начать. :) А начать лучше с приобретения пары контроллеров и сборки (покупки) программатора. :) В остальном, поможем, чем можем.

Demius
03.07.2008, 08:04
АГА согласен, а вообше с контролерами всё очень просто и можно всё что угодно сделать. Самый простой вариант это термометр с сайта __http://arv.radioliga.com/index.php я его собрал и супер, теперь вот хочу поробовать собрать на 2-5 температурных датчиках, чтобы контролировать температуру в автомобиле.