Схемы, программы, прошивки Непримитивная сигнализация

Discussion in 'Электроника и Фрикинг' started by Animal, 2 Mar 2008.

  1. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Подходит ко мне братан и говорит:"Сделай мне сигнализацию для гаража." Ну, я ему, как прожженый конструктор:"Пишите ТЗ, товарищ! Причем по ГОСТ-ам!". Нормальная такая фраза, когда делать чего нибудь не хочется. :) А он мне:"Не сделаешь - к компьютеру хрен больше подойдешь!" Вот эта фраза меня сильно простимулировала. :)
    Итак, исходные данные:
    На двери будет стоять герконовый датчик, а в помещении, так называемый датчик "объема" TEXECOM REFLEX (классная штука кстати, и стоит всего рублей 300).
    [​IMG]
    В рабочем положении оба датчика замкнуты (TEXECOM через сопротивление 18 Ом, кстати). В помещении будет стоять штатный извещатель (какой - не знаю, бирки на нем стерты), в нем пьезоизлучатель с генератором к нему (уши закладывает - мама не горюй! :) и лампа (из трех светодиодов, каждый - размером с палец). У лампы и излучателя раздельное питание. Будет кнопка "постановка на охрану" на ящике "сейфового типа, в котором все "кишки" спрятаны и потайная кнопка "снять с охраны". Так же на ящике будет светодиод (просто чтобы был :).
    Схема устройства:
    [​IMG]

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

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Это пипец! Я не могу текст программы оправить! Он мне постоянно выдает
    "500 Internal Server Error". Ни с тегами CODE, ни тупо текстом! Че за фигня и как с ней справиться?
     
  3. iddqd

    iddqd Banned

    Joined:
    19 Dec 2007
    Messages:
    637
    Likes Received:
    519
    Reputations:
    19
    ога, я тоже с этим столкнулся
    не могу запостить большой объём текста- приходится разбивать на несколько постов
     
  4. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Текст программы, часть 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);           //пауза при включении питания (для датчика объема)
                                       //при сбросе питания система 
                                     //попытается встать на охрану
       }
    
     
  5. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Текст программы, часть 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()
     
  6. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Текст программы, часть 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
     
    1 person likes this.
  7. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Вот такой вот получился девайс. Собрал на монтажке за час.
    [​IMG]
    и сама платка
    [​IMG]

    [​IMG]

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

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    На монтажке за час!!!

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

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

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Просто рука набита. :) А секрет,наверное, в оптимальном и продуманном расположении элементов. :)
     
  10. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    Везет тебе! вот я всегда сделаю и схему и програму и в протеусе отлично работает, а как доходит до паяния так все лень. Хоть и работы на пару часов, но пока заставлю себя :) Может когда то поменяется характер :))))))))
     
  11. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Братан потихоньку начинает хотеть "таблетку" вместо секретной кнопки, так что с далласами мы еще поработаем. :)
     
  12. Demius

    Demius Elder - Старейшина

    Joined:
    27 Nov 2006
    Messages:
    112
    Likes Received:
    20
    Reputations:
    0
    Тогда ешё чтобы и СМС отправляла на телефон что гараж вскрыли.
     
    1 person likes this.
  13. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Вот это точно лишнее... Да и GSM-модули нынче удовольствие дорогое пока... Хотя, можно взять какую нибудь древнюю мобилку и кидать туда АТ-команды. Кто нибудь такое реализовывал?
     
  14. spy-profi

    spy-profi Banned

    Joined:
    12 Dec 2007
    Messages:
    230
    Likes Received:
    19
    Reputations:
    -15
    Animal - можна твою асю? (Просто поинтересоваться....)
     
    1 person likes this.
  15. MegaDeth

    MegaDeth Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    192
    Likes Received:
    72
    Reputations:
    13
    это прикольна =)))
    только действительно секретная кнопачка это от бомжей разве что защитит =)))
    я бы сделал со sleep() :rolleyes:
     
    1 person likes this.
  16. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Смотря, на сколько она секретная. :)))
    Цель должна оправдывать средства. А тут на содержимое банковские взломщики не позарятся. машины там нет, хлам один. :)
    sleep() -это что такое?
     
    #16 Animal, 3 Mar 2008
    Last edited: 3 Mar 2008
    1 person likes this.
  17. MegaDeth

    MegaDeth Elder - Старейшина

    Joined:
    8 Nov 2006
    Messages:
    192
    Likes Received:
    72
    Reputations:
    13
    :rolleyes: ну это МК в спячку впадает и потребляет намного меньше. пробуждается по прерыванию, ктоторое может быть вызвано изменением уровня на входах, переполнение таймера итд...
    такой способ еще в пультах например применяется, ато иначе батарейки быстро сдохнут =)))
    для сигнализации самое то имхо :rolleyes:
     
    3 people like this.
  18. Animal

    Animal Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    221
    Likes Received:
    89
    Reputations:
    6
    Млять! Я уж что-то страшное подумал. :)))) Sleep конечно идеален для батареечных вариантов, это ты абсолютно прав. Только у меня туда 220 все равно приходит и снаружи его подрезать невозможно, да и снутри непросто. :) Пущай себе от сети питается.
     
    2 people like this.
  19. presidentua

    presidentua милиционер Античата

    Joined:
    4 Nov 2007
    Messages:
    305
    Likes Received:
    236
    Reputations:
    15
    В одном из выпусков Хакера пацыки это делали там и инфу вылаживалы по этому. Статья называется Длинная рука контроля. У меня диск был, но к сожалению саму статью не читал. Но думаю управлять не особо и сложно там. Все таки РС232. Насколько я понял из листинга проги (там на АСМЕ), то мобила напрямую подсоединяется к порту UART. Там на Атмеловской Меге делали. Наверно буду такое себе цеплять на диплом.
     
  20. Demius

    Demius Elder - Старейшина

    Joined:
    27 Nov 2006
    Messages:
    112
    Likes Received:
    20
    Reputations:
    0
    А я и говорил про трубу. Модуль дорого хотя он и с описанием и с примерами иногда идёт. Вот нашёл ссылки про GSM т.е. как подключить и как использовать:
    http://forum.modlabs.net/topic4124.html
    а это адапторы
    http://nmt.btv.ru/index.php?page=adap
    а это буржуйское
    http://www.embedtronics.com/nokia/fbus.html
     
    1 person likes this.