ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|
Непримитивная сигнализация |

02.03.2008, 16:27
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Непримитивная сигнализация
Подходит ко мне братан и говорит:"Сделай мне сигнализацию для гаража." Ну, я ему, как прожженый конструктор:"Пишите ТЗ, товарищ! Причем по ГОСТ-ам!". Нормальная такая фраза, когда делать чего нибудь не хочется.  А он мне:"Не сделаешь - к компьютеру хрен больше подойдешь!" Вот эта фраза меня сильно простимулировала. 
Итак, исходные данные:
На двери будет стоять герконовый датчик, а в помещении, так называемый датчик "объема" TEXECOM REFLEX (классная штука кстати, и стоит всего рублей 300).

В рабочем положении оба датчика замкнуты (TEXECOM через сопротивление 18 Ом, кстати). В помещении будет стоять штатный извещатель (какой - не знаю, бирки на нем стерты), в нем пьезоизлучатель с генератором к нему (уши закладывает - мама не горюй!  и лампа (из трех светодиодов, каждый - размером с палец). У лампы и излучателя раздельное питание. Будет кнопка "постановка на охрану" на ящике "сейфового типа, в котором все "кишки" спрятаны и потайная кнопка "снять с охраны". Так же на ящике будет светодиод (просто чтобы был  .
Схема устройства:
В тексте подробные комментарии, но, на всякий случай, опишу алгоритм работы на "пальцах".
После подачи питания контроллер инициализируется и ждет 10 сек (это надо датчику "объема")
do{ бесконечный цикл
ждем 10 сек перед постановкой на охрану и смотрим кнопку "снять с охраны"
если датчики в норме
{ Ждем срабатывания датчиков
Ждем 10 сек или кнопку "снять с охраны"
Включаем тревогу и смотрим кнопку "снять с охраны"
}
иначе даем сигнал неудачной постановки и ждем кнопку "снять с охраны"
ждем кнопку "постановки на охрану"
}while(true);
|
|
|

02.03.2008, 16:35
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Это пипец! Я не могу текст программы оправить! Он мне постоянно выдает
"500 Internal Server Error". Ни с тегами CODE, ни тупо текстом! Че за фигня и как с ней справиться?
|
|
|

02.03.2008, 16:53
|
|
Banned
Регистрация: 19.12.2007
Сообщений: 924
Провел на форуме: 4192567
Репутация:
2145
|
|
ога, я тоже с этим столкнулся
не могу запостить большой объём текста- приходится разбивать на несколько постов
|
|
|

02.03.2008, 16:56
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Текст программы, часть 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); //пауза при включении питания (для датчика объема)
//при сбросе питания система
//попытается встать на охрану
}
|
|
|

02.03.2008, 16:58
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Текст программы, часть 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()
|
|
|

02.03.2008, 17:00
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Текст программы, часть 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
|
|
|

02.03.2008, 19:11
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Вот такой вот получился девайс. Собрал на монтажке за час.

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

02.03.2008, 20:49
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 331
Провел на форуме: 1724067
Репутация:
806
|
|
На монтажке за час!!!
Вот это скорость сборки. Поделись секретом!
А по сути. То сейчас розбираюсь со схемой и с немного с прогой  . Спасибо
|
|
|

02.03.2008, 21:27
|
|
Moderator - Level 7
Регистрация: 19.10.2007
Сообщений: 225
Провел на форуме: 1260519
Репутация:
298
|
|
Просто рука набита.  А секрет,наверное, в оптимальном и продуманном расположении элементов. 
|
|
|

02.03.2008, 23:20
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 331
Провел на форуме: 1724067
Репутация:
806
|
|
Везет тебе! вот я всегда сделаю и схему и програму и в протеусе отлично работает, а как доходит до паяния так все лень. Хоть и работы на пару часов, но пока заставлю себя  Может когда то поменяется характер  )))))))
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|