Подходит ко мне братан и говорит:"Сделай мне сигнализацию для гаража." Ну, я ему, как прожженый конструктор:"Пишите ТЗ, товарищ! Причем по ГОСТ-ам!". Нормальная такая фраза, когда делать чего нибудь не хочется. А он мне:"Не сделаешь - к компьютеру хрен больше подойдешь!" Вот эта фраза меня сильно простимулировала. Итак, исходные данные: На двери будет стоять герконовый датчик, а в помещении, так называемый датчик "объема" TEXECOM REFLEX (классная штука кстати, и стоит всего рублей 300). В рабочем положении оба датчика замкнуты (TEXECOM через сопротивление 18 Ом, кстати). В помещении будет стоять штатный извещатель (какой - не знаю, бирки на нем стерты), в нем пьезоизлучатель с генератором к нему (уши закладывает - мама не горюй! и лампа (из трех светодиодов, каждый - размером с палец). У лампы и излучателя раздельное питание. Будет кнопка "постановка на охрану" на ящике "сейфового типа, в котором все "кишки" спрятаны и потайная кнопка "снять с охраны". Так же на ящике будет светодиод (просто чтобы был . Схема устройства: В тексте подробные комментарии, но, на всякий случай, опишу алгоритм работы на "пальцах". После подачи питания контроллер инициализируется и ждет 10 сек (это надо датчику "объема") do{ бесконечный цикл ждем 10 сек перед постановкой на охрану и смотрим кнопку "снять с охраны" если датчики в норме { Ждем срабатывания датчиков Ждем 10 сек или кнопку "снять с охраны" Включаем тревогу и смотрим кнопку "снять с охраны" } иначе даем сигнал неудачной постановки и ждем кнопку "снять с охраны" ждем кнопку "постановки на охрану" }while(true);
Это пипец! Я не могу текст программы оправить! Он мне постоянно выдает "500 Internal Server Error". Ни с тегами CODE, ни тупо текстом! Че за фигня и как с ней справиться?
ога, я тоже с этим столкнулся не могу запостить большой объём текста- приходится разбивать на несколько постов
Текст программы, часть 1: Code: #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); //пауза при включении питания (для датчика объема) //при сбросе питания система //попытается встать на охрану }
Текст программы, часть 2: Code: 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()
Текст программы, часть 3: Code: //***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
Вот такой вот получился девайс. Собрал на монтажке за час. и сама платка Братан тестировал - сказал, что все работает отлично. Только возможно паузу перед постановкой на охрану придется увеличить до 15 сек - датчик "объема" долго в штатный режим переходит. Вот.
На монтажке за час!!! Вот это скорость сборки. Поделись секретом! А по сути. То сейчас розбираюсь со схемой и с немного с прогой . Спасибо
Везет тебе! вот я всегда сделаю и схему и програму и в протеусе отлично работает, а как доходит до паяния так все лень. Хоть и работы на пару часов, но пока заставлю себя Может когда то поменяется характер )))))))
Братан потихоньку начинает хотеть "таблетку" вместо секретной кнопки, так что с далласами мы еще поработаем.
Вот это точно лишнее... Да и GSM-модули нынче удовольствие дорогое пока... Хотя, можно взять какую нибудь древнюю мобилку и кидать туда АТ-команды. Кто нибудь такое реализовывал?
это прикольна =))) только действительно секретная кнопачка это от бомжей разве что защитит =))) я бы сделал со sleep()
Смотря, на сколько она секретная. )) Цель должна оправдывать средства. А тут на содержимое банковские взломщики не позарятся. машины там нет, хлам один. sleep() -это что такое?
ну это МК в спячку впадает и потребляет намного меньше. пробуждается по прерыванию, ктоторое может быть вызвано изменением уровня на входах, переполнение таймера итд... такой способ еще в пультах например применяется, ато иначе батарейки быстро сдохнут =))) для сигнализации самое то имхо
Млять! Я уж что-то страшное подумал. ))) Sleep конечно идеален для батареечных вариантов, это ты абсолютно прав. Только у меня туда 220 все равно приходит и снаружи его подрезать невозможно, да и снутри непросто. Пущай себе от сети питается.
В одном из выпусков Хакера пацыки это делали там и инфу вылаживалы по этому. Статья называется Длинная рука контроля. У меня диск был, но к сожалению саму статью не читал. Но думаю управлять не особо и сложно там. Все таки РС232. Насколько я понял из листинга проги (там на АСМЕ), то мобила напрямую подсоединяется к порту UART. Там на Атмеловской Меге делали. Наверно буду такое себе цеплять на диплом.
А я и говорил про трубу. Модуль дорого хотя он и с описанием и с примерами иногда идёт. Вот нашёл ссылки про GSM т.е. как подключить и как использовать: http://forum.modlabs.net/topic4124.html а это адапторы http://nmt.btv.ru/index.php?page=adap а это буржуйское http://www.embedtronics.com/nokia/fbus.html