СИГНАЛИЗАЦИЯ
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Знакомый попросил сделать простейшую сигнализацию на автомобиль(на мое пожелание, чтобы он купил себе простейшую сигналку с обратной связью ответил как то не очень.....)
На машине уже установлена простейшая сигналка с брелком.
Так же знакомый отдал свой старый тлф самсунг х100, питание на него, вернее на контакты АБ он подавал 5В(должно быть максимум 4.2В)....но работает и ладно
Вообщем чтобы не лезть в схему авто решил подцепить контроль- на срабатывание сирены, ну и попутно контроль уровня заряда АБ, также в машине есть очень древняя секретка, заведена на реле бензонасоса, тумблер был убран далеко далеко и уже давно не использовался, вот на него и заведу блокировку движка.
Телефон разобрал, оставил материнку, экран, модуль антены(кстати- при включенном экране жрет 200мА, при режиме ожидания по нулям). Завел четыре провода для управления(вызов, сброс вызова, и вибро +-), управляется минусом(минус 2.9В, но и -5В то же нормально рулит, на выходе вибро всегда есть плюс, минус появляется при входящем вибро.На телефоне площадки были не графитные, т.е подпаялся без проблем(ЛТИ-120).
Должен подойти в ближайшем будующем PIR сенсор, еще его и установлю в салон, пока все построенно на наличие на сирене 12В.
Вообщем все собрал, воткнули ее для эксперемента на авто- в 21.00 поставили, все отрабатывает нормально, но в 9.20 был вызов. т.к у него нет пейджера, не смог понять- может это было и самопроизвольное срабатывание, а может кто и пнул...вообщем сегодня на работе все завел и посмотрю - будут ли завтра ложные срабатывания.
Смущает, что на ардуино для измерения напруги общий ноль, а для управления тлф общий плюс....
Когда вибро не сработал- показывает на ардуино на А2 30В, при срабатывании вибро показания падают до 15В(хотя реально должно быть максимум 5В.), и чтобы опять вернуть все на исходную необходимо или тлф или ардуино перегрузить
Вот код.
/* ЗАДУМКА 1. Снимаются показания напряжения с сирены и АБ, -при наличии 12В. на сирене более 7 секунд, проходит вызов. -при падении напряжения на АБ ниже 10В., моргает светодиод 2. При входящем вызове- срабатывает реле2 и размыкает цепь авто на ардуино собрано три вольтметра: - первый и второй делитель 1Мом-380Ком (измерям "+") измеряем сирену и АБ (А0, А1) - третий без делителя (А2),т.к с вибро приходит минус -2,9В Телефон управляется "-", заведены кнопки вызов, сброс вызова, и вход с вибро -кнопка CALL заведена на пин5 -кнопка DIScall на пин3 -вибро заведен на А0 -общий "+" */ #define LED1 8 // сигнализации охраны #define LED2 9 // сигнализация Аб #define RelayChn1 2 // канал 1-Включение телефона при включении ардуино, контакты замыкаются #define RelayChn2 4 // канал 2-Блокировка двигателя при входящем вызове, контакты размыкаются #define DISCALL 3 // Сброс вызова(общий плюс снимаем с вибро) #define CALL 5 //вызов //Вольтметр 1_канал 1 Контроль уровня заряда аккумулятора //------------------------------------------------ const int analogInPin_Battery = 0; // А0 Вход вольтметра канал контроля Аб -делитель 1Мом и 380 Ком float outputValue_Battery = 0; long previousMillis_Battery = 0; // храним время последнего переключения светодиода previousMillis_battery long interval_Battery = 200; // интервал моргания LED2 int flag_Battery = 0; //Вольтметр 2 канал Сирена //------------------------------------------- const int analogInPin_Sirena = 1; // А1 Вход вольтметра канал охраны 1(сирена) - точное значение 9-12В__делитель 1Мом и 280 Ком float outputValue_Sirena = 0; int flag_Sirena = 0; // флаг срабатывания сирены int i=0; // для цикла вызова(вызов длятся 20 секунд) int call_kol_vo=0; //количество вызовов //-------------------------------------------- //Вольтметр 3 канал ВИБРО //------------------------------------------- const int analogInPin_Vibro = 2; // А2 Вход вольтметра канал охраны 3(Вибро) float outputValue_Vibro = 0; int flag_Vibro = 0; // флаг срабатывания вибро int vibro_kol_vo= 0; //------------------------------------------- int ledState1 = LOW; int ledState2 = LOW; int buttonState = 0; // состояние кнопки long previousMillis1 = 0; // храним время последнего переключения светодиода long interval_1 = 1500; // интервал между включение/выключением светодиода (1 секунда) long previousMillis2 = 0; // храним время последнего переключения светодиода long interval_2 = 1000; // охрана откл long time_START_sirena=0; //начало срабатывания сирены, время long time_STOP_sirena=0; //сирена отключилась, время long time_sirena=0; // сколько времени сирена работала void setup() { pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(CALL, OUTPUT); pinMode(DISCALL, OUTPUT); analogWrite(CALL, 255); analogWrite(DISCALL, 255); pinMode(RelayChn1,OUTPUT); digitalWrite(RelayChn1,HIGH); pinMode(RelayChn2,OUTPUT); digitalWrite(RelayChn2,HIGH); Serial.begin(9600); //ВКЛЮЧИТЬ ТЕЛЕФОН delay(3000); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(RelayChn1,LOW); delay(6000); digitalWrite(RelayChn1,HIGH); delay(10000); // Serial.print("vkl tlf "); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); } void loop() { unsigned long currentMillis1 = millis(); unsigned long currentMillis_Battery = millis(); // Снимаем показания напряжения АБ //-------------------------------------- outputValue_Battery = float(analogRead(analogInPin_Battery))*7.9719667/245; // снимаем уровень напряжения АБ //Serial.print("Voltage_Battery = " ); //Serial.println(outputValue_Battery); delay(80); //------------------------------------- // Снимаем показания напряжения Вибро //-------------------------------------- outputValue_Vibro = float(analogRead(analogInPin_Vibro))*7.9719667/245; // снимаем уровень напряжения Вибро //Serial.print("Voltage_Vibro = " ); //Serial.println(outputValue_Vibro); delay(80); //------------------------------------- //снимаем показания сирены //--------------------------------------- outputValue_Sirena = float(analogRead(analogInPin_Sirena))*7.9719667/265; // снимаем уровень напряжения сирены //Serial.print("Voltage_Sirena = " ); //Serial.println(outputValue_Sirena); delay(80); digitalWrite(LED2, LOW); // включаем сигнализацию //-------------------------------------------------------------------- if((currentMillis1 - previousMillis1 > interval_1)&&(flag_Sirena==0)) { // режим сигнализации включен, моргаем LED1 previousMillis1 = currentMillis1; if (ledState1 == LOW) ledState1 = HIGH; else ledState1 = LOW; digitalWrite(LED1, ledState1); } //----------------------------------------------------------------------- //Напряжение батареи ниже 10,0В. if((outputValue_Battery < 10.0)&&(outputValue_Battery > 7.0)) { digitalWrite(LED2, LOW); flag_Battery=1; // Напряжение батареи упало ниже 10,0В , флаг батареи поднят } else { flag_Battery=0; } // Serial.print("flag_Battery = " ); // Serial.println(flag_Battery); // флаг батареи поднят, моргаем светодиодом LED2 if((currentMillis_Battery - previousMillis_Battery > interval_Battery)&&(flag_Battery==1)&&(flag_Sirena==0)) { previousMillis_Battery = currentMillis_Battery; if (ledState2 == LOW){ ledState2 = HIGH; } else { ledState2 = LOW; } //устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(LED2, ledState2); } delay(100); //------------------------------------------------- // СИРЕНА //Напряжение на сирене выше 9 вольт в течении 7сек. if((outputValue_Sirena > 9.0)&&(flag_Sirena==0)) { time_START_sirena=millis(); // ВРЕМЯ НАЧАЛА СРАБАТЫВАНИЯ СИРЕНЫ flag_Sirena=1; // Сирена сработала, флаг СИРЕНЫ включен digitalWrite(LED1, HIGH); // Горит LED1 SIRENA(); // Serial.println("VXOD IZ SIRENA"); delay(100); } //Serial.print("flag_Sirena = "); //Serial.println(flag_Sirena); delay(50); //------------------------------------------------- // ВХОДЯЩИЙ ВЫЗОВ- БЛОКИРОВКА //Напряжение на сирене выше 9 вольт в течении 4сек. if(outputValue_Vibro < 18.0) { //time_START_sirena=millis(); flag_Vibro=1; // Сирена сработала, флаг СИРЕНЫ включен digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); VIBRO(); // Serial.println("VXOD IZ SIRENA"); //delay(1000); } //Serial.print("flag_Sirena = "); //Serial.println(flag_Sirena); delay(500); } void SIRENA(){ //Serial.println("vxod sirena" ); while(flag_Sirena ==1) { digitalWrite(LED1, HIGH); outputValue_Sirena = float(analogRead(analogInPin_Sirena))*7.9719667/245; // снимаем уровень напряжения сирены if((outputValue_Sirena > 9.0)&&(time_sirena < 7000)) { flag_Sirena=1; time_STOP_sirena=millis(); //ОКОНЧАНИЕ СРАБАТЫВАНИЯ СИРЕНЫ time_sirena=time_STOP_sirena-time_START_sirena; Serial.println("time sirena_if__= " ); Serial.println(time_sirena); }else{ flag_Sirena=0; time_STOP_sirena=millis(); //ОКОНЧАНИЕ СРАБАТЫВАНИЯ СИРЕНЫ //Serial.println("2time sirena_if__= " ); //Serial.println(time_sirena); } } //Serial.println(" EXIT while "); delay(50); time_sirena=time_STOP_sirena-time_START_sirena; // ПОДСЧЕТ времени работы сирены //--------------------------------------------------------------------------------- // телефон делает два ВЫЗОВа // если сирена работает более 7 секунд if((time_sirena > 7000)&&(call_kol_vo <= 7)){ digitalWrite(RelayChn2,LOW); // блокировка двигателя, контакты размыкаются digitalWrite(LED2, HIGH); // второй диод(он же моргает при севшей АБ) analogWrite(DISCALL, -255); // телефон в ждущем режиме, выводим из ждущего режима delay(500); analogWrite(DISCALL, 255); delay(500); analogWrite(DISCALL, -255); delay(500); analogWrite(DISCALL, 255); delay(500); analogWrite(CALL, -255); // ПЕРВЫЙ ВЫЗОВ, два раза нажимаем клавишу вызова delay(500); analogWrite(CALL, 255); delay(500); analogWrite(CALL, -255); delay(500); analogWrite(CALL, 255); delay(500); call_kol_vo= call_kol_vo+1; // подсчитываем количество вызовов //Serial.print("11111 "); delay(20000); // вызов длится 20сек(если связь неустойчивая, вызов бывает проходит очень долго(10сек)) //Serial.print("20 sec "); analogWrite(DISCALL, -255); // вызов прошел, ложим трубку delay(500); analogWrite(DISCALL, 255); delay(20000); // пауза между вызовами 20 секунд // --------------------------------------------------------- analogWrite(CALL, -255); //ВТОРОЙ ВЫЗОВ delay(500); analogWrite(CALL, 255); delay(500); analogWrite(CALL, -255); delay(500); analogWrite(CALL, 255); delay(500); call_kol_vo= call_kol_vo+1; // подсчитываем количество вызовов //Serial.print("222222 "); delay(20000); // вызов длится 20 секунд //Serial.print("20 sec "); analogWrite(DISCALL, -255); // ложим трубку delay(500); analogWrite(DISCALL, 255); delay(200); flag_Sirena=0; } //Serial.print(" EXIT SIRENA "); } //------------------------------------------------------------------- void VIBRO(){ if(vibro_kol_vo <= 1){ // лишнее //Serial.print("VXOD VIBRO "); digitalWrite(RelayChn2,LOW); // входящий вызов-срабатывает реле блокировки двигателя, контакты реле2 размыкаются delay(2000); analogWrite(DISCALL, -255); // два раза жмем кнопку сброса вызова телефона delay(500); analogWrite(DISCALL, 255); delay(500); analogWrite(DISCALL, -255); delay(500); analogWrite(DISCALL, 255); delay(500); analogWrite(CALL, -255); // реле2 сработало, ардуино отзванивается delay(500); analogWrite(CALL, 255); delay(500); analogWrite(CALL, -255); delay(500); analogWrite(CALL, 255); delay(20000); //Serial.print("20 sec "); analogWrite(DISCALL, -255); delay(500); analogWrite(DISCALL, 255); delay(500); //Serial.print("exit vibro"); delay(500); vibro_kol_vo=vibro_kol_vo+1; //лишнее } flag_Vibro=0; }
что то кода не увидел
Много букав. Но вообще не понятно о чем написано. Толи человек хвастается чем. Толи помощь нужна. Какой то набор слов с частым повторением слова сигнализация.
хвастаться здесь нечем, обычный вольтметр и все...слово сигнализация встречается два раза.
Цешкой на входе ардуино(от вибро), при срабатывании вибро наруга 2,9В(срабатывает минусом).
а вот ардуино показывает -Когда вибро нет, ардуино показывает 30В., при срабатывании вибро - показывает 16В., и когда вибро перестает срабатывать, напруга так и остается-16В. Когда перегружаешь или тлф или ардуино,нормализуется- опять 30В. На ардуино, у вольметров общий минус, у тлф общий плюс, есть ли смысл запитать отдельно тлф от ардуино? Сейчас запитано от одного источника и ардуино и тлф.
Одно ложное срабатывание(дала вызов) за 5 часов, показало, что было 12 В. более 7секунд.. В коде нет крамолы?