Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Схемы и программы (https://forum.antichat.xyz/forumdisplay.php?f=61)
-   -   Непримитивная сигнализация (https://forum.antichat.xyz/showthread.php?t=63256)

Animal 02.03.2008 16:27

Непримитивная сигнализация
 
Подходит ко мне братан и говорит:"Сделай мне сигнализацию для гаража." Ну, я ему, как прожженый конструктор:"Пишите ТЗ, товарищ! Причем по ГОСТ-ам!". Нормальная такая фраза, когда делать чего нибудь не хочется. :) А он мне:"Не сделаешь - к компьютеру хрен больше подойдешь!" Вот эта фраза меня сильно простимулировала. :)
Итак, исходные данные:
На двери будет стоять герконовый датчик, а в помещении, так называемый датчик "объема" TEXECOM REFLEX (классная штука кстати, и стоит всего рублей 300).
http://img131.imageshack.us/img131/1...lexmlt8.th.gif
В рабочем положении оба датчика замкнуты (TEXECOM через сопротивление 18 Ом, кстати). В помещении будет стоять штатный извещатель (какой - не знаю, бирки на нем стерты), в нем пьезоизлучатель с генератором к нему (уши закладывает - мама не горюй! :) и лампа (из трех светодиодов, каждый - размером с палец). У лампы и излучателя раздельное питание. Будет кнопка "постановка на охрану" на ящике "сейфового типа, в котором все "кишки" спрятаны и потайная кнопка "снять с охраны". Так же на ящике будет светодиод (просто чтобы был :).
Схема устройства:
http://img127.imageshack.us/img127/7...5783gy5.th.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/8...9999il8.th.jpg
и сама платка
http://img167.imageshack.us/img167/7...viewtn7.th.jpg

http://img502.imageshack.us/img502/4...viewhu0.th.jpg

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

presidentua 02.03.2008 20:49

На монтажке за час!!!

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

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

Animal 02.03.2008 21:27

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

presidentua 02.03.2008 23:20

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


Время: 06:12