Автоматический запуск двигателя автомобиля

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

зачем вы стродаете со старыми телефонами? ствим GSM M590, и например при отправке сообщения Report получаем смс с температурой двигателя, состоянием сигнализации, и т.д. еще цепляем RTC и можно даже сохранять время сработки датчика удара!! разве это не лудше чем колхозить с мобилками??? и всегда есть возможность добавить функционал просто прошивкой!!! если смс недостаточно берем GSM sim800L !!!

Роман728
Offline
Зарегистрирован: 06.12.2015

trembo пишет:

Я вам о том говорю что машина может стоять на скорости но не на ручнике,
а вы о том как простейшие сигналы считывать.....
Сигнал с ручника никак не подтверждает факт что машина не может поехать....


Это все понятно что на включенной передаче машина поедет будет контроль положения рычага КПП Или надо как-то скоммутировать сигнал с датчика ABS и привязать его к скейчу

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

нельзя разве сделать как на обычных сигнализациях, если вытянут ручник реле зажигания подтянуто, вытаскиваешь ключь-машина работает, закрываешь двери, ставишь на охрану машина глохнет и становится в режим удаленного автозапуска, если какой то шаг был нарушен- режим автозапуска блокируется (становится невозможным)???

помойму все просто....

Роман728
Offline
Зарегистрирован: 06.12.2015

Anton_Kos87 пишет:

зачем вы стродаете со старыми телефонами? ствим GSM M590, и например при отправке сообщения Report получаем смс с температурой двигателя, состоянием сигнализации, и т.д. еще цепляем RTC и можно даже сохранять время сработки датчика удара!! разве это не лудше чем колхозить с мобилками??? и всегда есть возможность добавить функционал просто прошивкой!!! если смс недостаточно берем GSM sim800L !!!

Я бы например не против , но только одно но : логика я справляюсь делать руки могут паяльником в принципе дружу , написать программу я не смогу Поэтому приходится просто довольствуются тем что уже люди придумали и написали

Роман728
Offline
Зарегистрирован: 06.12.2015

Anton_Kos87 пишет:

нельзя разве сделать как на обычных сигнализациях, если вытянут ручник реле зажигания подтянуто, вытаскиваешь ключь-машина работает, закрываешь двери, ставишь на охрану машина глохнет и становится в режим удаленного автозапуска, если какой то шаг был нарушен- режим автозапуска блокируется (становится невозможным)???

помойму все просто....


Ну почему же нельзя ? Тому кто разбирается может переправить этот же скетч и все будет прекрасно . Это уже обсуждалось Я только не помню В этой ветке или в соседней какой-либо .Раз уж мы проектируем и пытаемся собрать сами то хотелось бы такого же удобства как на автомате , и не парится. С логической нейтралью

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

я думаю ребята помогут с интерграцией м590 сам бы себе такую сигнализацию собрал.... интресно можно же и брилок привязать от сигнализации старлайн например она помойму старых версий работает на 433mHz интересно... ;)

Роман728
Offline
Зарегистрирован: 06.12.2015

Кто-то чистит тему? Комментарии были и не стало .?!

Роман728
Offline
Зарегистрирован: 06.12.2015

Пардон это что-то мобильный Интернет тупит

fyodor.m
Offline
Зарегистрирован: 28.12.2015

constantinoff пишет:
То есть с 13 по 41 строки просто удаляем из скетча. На днях в радиоточку зайду за недостающими оптопарой и резисторами и приступлю к сборке. За доработку огромное спасибо. Наш проэкт потихоничку лишается недостатков.

В скетче который в первом посте 125 и 423-445 строка не нужна. А в поправленном скетче который я вам послал сейчас другие строки. Вы их там легко найдете. Смысл главно поняли.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Anton_Kos87 пишет:

зачем вы стродаете со старыми телефонами? ствим GSM M590, и например при отправке сообщения Report получаем смс с температурой двигателя, состоянием сигнализации, и т.д. еще цепляем RTC и можно даже сохранять время сработки датчика удара!! разве это не лудше чем колхозить с мобилками??? и всегда есть возможность добавить функционал просто прошивкой!!! если смс недостаточно берем GSM sim800L !!!

Если честно то мне не хочется смски писать, я лучше машине позвоню и сброшу после двух гудков, а она мне перезвонит, 

К тому же сладкое слово холява, жалко хорошую вещь (телефончик)  выбрасывать.

constantinoff
Offline
Зарегистрирован: 27.12.2015

Согласен. Лежал телефон без дела жаль было выбросить. А теперь пользу будет приносить. И ещё на многих операторах есть бесплатные исходящие внутри сети, а смс платные у всех. Так что +1 к запуску по звонку.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Поправленный код, опрос датчика температуры теперь не каждый цикл, а через каждые 10 мин. И время когда начинает опрашиваться датчик вибрации тоже увеличено до 10 мин после выключения двигателя. А то если выбегаешь из машины не на долго. Потом садишься хлопаешь дверью и она начинает тебе названивать. 



// регистрируем библиотеку датчика температуры
#include <OneWire.h>
#include <DallasTemperature.h>
// именуем входы выходы ардуины
#define ONE_WIRE_BUS 10
#define bat_charge 15 // выход на зарядку телефона
#define LOW_INTERVAL 72000000 // сколько времени выдавать LOW зарядка телефона выключена 44 часа 158400000, 20 часов 72000000
#define HIGH_INTERVAL 18000000 // сколько времени выдавать HIGH зарядка телефона включена 4 часа 14400000
#define LOW_INTERVAL1 400UL  //периудики моргания led status blink
#define HIGH_INTERVAL1 5000  //периудики моргания led status blink когда не моргает
#define V_LOW_INTERVAL 25  //периудики моргания led status blink
#define IGN2sec 14 // выход на зажигание 2
#define vibr_sensor 2 // d2 arduino контакт вибросенсора
#define hand_brake_in 3  //d3 adruino Контакт педали тормоза "+"
#define start_in 4  //d4 adruino Сигнал команды на старт от мобильного телефона вибро звонка
#define sharging_in 5  //d5 adruino
#define starter_out  6  //d6 adruino реле стартера
#define engine_out 7  //d7 adruino зажигание
#define secpower_out 8  //d8 цепи вторичного питания печка, фары итд
#define status_out 9  //d9 светодиод статуса системы  промаргивает = система готова к работе(включена). одно мигание запущен с первой попытки 2 со второй 3 с третьей 
#define seat_heat_out  13 //d13 цепь обогрева сидений для включения сидений. 
#define ACC_in 16  //d16 вход от ACC

OneWire oneWire(ONE_WIRE_BUS);
//Настройки 
unsigned long ENGINE_WARM_TIME = 900000; //15 min В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
const int ENGINE_START_MAX_TIME = 4; //В секундах масимальное время работы стартера типично 3 -10 сек
const int MIN_AIR_TEMP = -24; //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-24/

DallasTemperature sensors(&oneWire); 
float temp = 0; // текущее значение температуры
const byte sharging_on = 1; // 1 когда во время работы генератора или от датчика давления масла на этом входе высокое состояние , 0 когда  при работе генератора низкое состояние
const byte hand_brake_on = 0; //  0= не нажатая педаль тормоза , 1=  не нажата педаль тормоза

//переменная для фактического режима
byte actual_mode = 0; //  2 двигатель начал работать 
byte left_start_try = 0;  // переменная для хранения остатка числа попыток запуска 
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок 
byte flag_phone = 0; // переменная входного звонка с телефона
byte x = 0; // переменная количества звонков
byte y = 0; // переменная сигнала на запуск от телефона
byte z = 0; // переменная сигнала разрешения запуска по температуре
byte t = 0; // переменная флага запуска по температуре
byte c = 0; // переменная флага исходящих звонков
byte b = 0; // переменная количества нажатий на кнопку "зеленая трубка" телефона
unsigned long d = 0; // переменная запомненного времени остановки двигателя или выключения ключа в OFF 
byte ring_button = LOW; // переменная состояния кнопки исходящего звонка
unsigned long previousMillis = 0; // запомненное время исходящего звонка
int interval = 700; // интервал мультивибратора для исходящего звонка
byte ACC_IN_LOW = 0; // переменная флаг момента остановки двигателя или выключения ключа в OFF 
  
void setup() {
//--//-- настройка входов и выходов контроллера --------------  
// init selected pins
  pinMode(hand_brake_in, INPUT); // enable input 3
//  digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
// digitalWrite(hand_brake_in, HIGH);
  
 pinMode(start_in, INPUT); // enable input 4 вход с телефона на запуск
//  digitalWrite(start_in, HIGH); //pullup resistor
//  digitalWrite(start_in, LOW); 

 pinMode(sharging_in, INPUT); // enable input 5 
//  digitalWrite(sharging_in, HIGH); //generator LOW normaly
//  digitalWrite(sharging_in, HIGH);
 pinMode (vibr_sensor, INPUT); //вход от вибродатчика 2
digitalWrite(vibr_sensor, HIGH); //  необходимо подтянуть к питанию, так как сигнал с вибродатчика земля
// init outputs
pinMode(11, OUTPUT); // сигнал на дозвон по телефону
  digitalWrite(11, LOW); //set digital 0
//************реле обходчика***************  
 pinMode(12, OUTPUT); // enable output реле обходчика
 digitalWrite(12,LOW ); //set digital 0
 //*************обогрев сидений*************
 pinMode(seat_heat_out, OUTPUT);  //enable output relay seat heater 13
 digitalWrite(seat_heat_out, LOW);  //set digital 0
//*******************************************
  pinMode(starter_out, OUTPUT); // enable output 6
  digitalWrite(starter_out, LOW); //set digital 0
 
  pinMode(engine_out, OUTPUT); // enable output 7
  digitalWrite(engine_out, LOW); //set digital 0
 
  pinMode(secpower_out, OUTPUT); // enable output 8
  digitalWrite(secpower_out, LOW); //set digital 0 

  pinMode(IGN2sec, OUTPUT); // enable output 14
  digitalWrite(IGN2sec, LOW); //set digital 0 

  pinMode(status_out, OUTPUT); // enable output 9
  digitalWrite(status_out, LOW); //set digital 0 

  pinMode(bat_charge, OUTPUT); // enable output 15
  digitalWrite(bat_charge, LOW); //set digital 0

  pinMode(ACC_in, INPUT); // enable input 16

  
  //---- конец настройки входов и выходов контроллера --------------    
sensors.begin();
Serial.begin(9600);

}
void loop()
{
  //---- собственно это и есть весь код программы --------------
 
if (actual_mode < 2 )    //если двигатель не запущен
        {
        check_start();  //Управляем режимом запуска
        }
//код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены        
//но хорошая привычка фигурные скобки ставить всегда      
else   // иначе
        {
        check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
        } 
 
 set_status_led(); //независимо от режима Управляем светодиодом статуса
 check_phone_signal(); // независимо от режима проверяем входящие звонки с телефона
 check_do_call(); // независимо от режима ожидаем сигнал для звонка хозяину и звоним если завелся двигатель или заглох или пришел сигнал с датчика вибрации
 check_vibro_signal(); // проверяем сигнал от датчика вибрации 
 phone_charging_check(); // заряжаем телефон периодически например 4 часа зарядка 44 часа перерыв. 
 check_time_eng_stop(); // запоминаем время остановки двигателя.
  
  //------------------конец основного кода -----------------
 }

  //---- дальше идут используемые функции и подфункции -------------- 

void check_start() 
{
 { // опрос температуры 
  static unsigned long prevMillis3 = 0; // static позволяет сохранять значение при выходе из функции
  if( (millis()-prevMillis3)>600000) // задаем время между опросами датчика температуры раз в 10 мин (600000 милисек)
  {
    prevMillis3=millis();
    sensors.requestTemperatures();
    temp = sensors.getTempCByIndex(0);
 //Serial.println(temp);
  }
 }
  if (digitalRead(hand_brake_in) != hand_brake_on || digitalRead(sharging_in) == sharging_on ) //с нажатой педалью тормоза или с запущеным двигателем не делаем запуск
    {
      actual_mode = 0; // заканчиваем попытки запустить движек
      left_start_try = 0; 
      return;  
    }

  if (y == 1 && left_start_try == 0 ) //запуск по сигналу от телефона и еще  по температуре 
  {
   left_start_try = 3; // указываем что нужно попытаться трижды запустить движок 
   y = 0; // сбрасываем сигнал на запуск от телефона 
   x = 0;// сбрасываем количество звонков 
  } 
  if (temp  < MIN_AIR_TEMP && left_start_try == 0 && z == 1 && t == 0 ) // если температура меньше положенной и запуск по температуре разрешен, запускаем. 
  {
   y = 1;// запускаем 
   t = 1; // устанавливаем флаг запуска по температуре на 1 чтобы если не завелся по темп с трех раз больше не заводился по температуре  
   }
   
 // 
 
 if ( left_start_try > 0 )   
 {
    digitalWrite(12, HIGH);//включаем реле обходчика
    digitalWrite(engine_out, HIGH);   //включаем зажигание 
    digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь 
    digitalWrite(secpower_out, HIGH); //включаем печку фары итд
    delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление, все датчики включились
    do_start(); // пытаемся запустить движок
       left_start_try = left_start_try - 1 ; //уменьшаем число попыток

    if (left_start_try == 0 ) 
        actual_mode = 2;// заканчиваем попытки запустить движок
          

 }   
} // конец процедуры старта
 
 ////////////////////////////////////////////////////////
void do_start()
{
 //тут будет запуск движка    
 //   digitalWrite(engine_out, HIGH);   //включаем зажигание 
 //   digitalWrite(secpower_out, HIGH); //включаем печку фары итд
 //   delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление
    
    digitalWrite(secpower_out, LOW); //выключаем печку фары итд
    digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь

//----------------------------------------------------------------------------------- цикл стартера 
    digitalWrite(starter_out, HIGH); //включаем стартер 
    for (int secs=0; secs <= ENGINE_START_MAX_TIME ; secs++) // 
      {
      delay(1000); // и продолжаем его держать включенным 1 сек
      if (digitalRead(sharging_in) == sharging_on) //если зарядка пошла то 
               break;  // прерываем цикл
      }
//----------------------------------------------------------------------------------- 
    digitalWrite(starter_out, LOW); //отключаем стартер 

    if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что  зарядка пошла  
    {
      actual_mode = 2; //Запоминаем что движок запущен
      last_start_time = millis(); // запоминаем время запуска движка 
      c = 1; // звоним  хозяину что двигатель заведен
      digitalWrite(secpower_out, HIGH); //включаем печку фары итд
      digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь
      digitalWrite(12, LOW);         // реле обходчика выключаем
      if (temp < 5) //проверяем температуру для включения реле обогрева сидений
      { 
      digitalWrite(seat_heat_out, HIGH); //включаем обогрев сидений
      delay(300);             // останавливаем код на время сигнала на обогрев сидений, достаточно 0.3 секунды
      digitalWrite(seat_heat_out, LOW); // выключаем выход на обогрев сидений
      }
      t = 0;  // сбрасываем флаг запуска по температуре для последующих запусков по температуре 
    }
    else
    {
      digitalWrite(engine_out, LOW);   //выключаем зажигание чтбы разблокировать реле стартера
      digitalWrite(secpower_out, LOW); //выключаем печку фары итд
      digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
      digitalWrite(12,LOW);  // выключаем реле обходчика
      delay(5000); // останавливаем код на 5 секунд для передышки
    }
   
}
////////////////////////////////////////////////////////////////////  
void check_for_shutdown() 
{
   //сюда мы попадаем когда контроллер считает что движок работает
 
    if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что движок случайно не заглох  или  нажата педаль тормоза
   {         do_shutdown(); 
          left_start_try =0; // и больше не заводим
   }        
    
    
    //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время
 
 
   if (actual_mode != 0  ) //значит не выключили заглохший двигатель только что 
    { 
    if (millis() < last_start_time) // 49 days arduino reset millis fix
        {
          last_start_time = 0;
        }
    if (millis() > last_start_time+ENGINE_WARM_TIME)  // если текущее время больше чем время старта + время прогрева
         
        {
         do_shutdown();
         left_start_try =0; // и больше не заводим
        }
    }
 }
//////////////////////////////////////////////////////////////////////
void do_shutdown()
{       
        digitalWrite(secpower_out, LOW); //выключаем печку фары итд 
        digitalWrite(12,LOW);//реле обходчика выключить
        digitalWrite(engine_out, LOW); //вырубаем зажигание
        digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
        actual_mode = 0;  // движок выключили запомним это
        last_start_time = 0; // ну и забудем о том что он был включен
        left_start_try =0; // и больше не заводим
        c = 1; // звоним хозяину что двигатель заглушен
        x = 0; // сбрасываем счетчик кол-ва звонков
}
/////////////////////////////////////////////////////////////////////
void set_status_led()
{
  if (digitalRead(hand_brake_in) != hand_brake_on)
    { 
    digitalWrite(status_out, LOW);
    return;
    }

  
if (actual_mode ==  2) //Движок запущен
   {  
    status_led_flash(); // показываем с какой попытки был прошлый запуск
   }
  else if (digitalRead(hand_brake_in) == hand_brake_on &&  digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in)!= HIGH) // зажигаем статус если не в пути, нечего в пути мигать 
   {
    led_pulse(); // промаргивает  - показываем что готов к следующему запуску
   }
}
////////////////////////////////////////////////////////////////////////
void status_led_flash()
{
static unsigned long big_interval = 0;
static unsigned long flash_interval = 0;
unsigned long flash_count = 0;
flash_count = 3 - left_start_try;  //сколько раз мигать

//1 секундный интервал
if (millis() > flash_interval + 1000L)
      flash_interval = millis() ; //задаем счетчие от 0 до 1 секунды

//задаем 6 секунд 
if (millis() > big_interval + 6000L)
     {
      big_interval = millis() ;  //задаем счетчие от 0 до 10секунд
      flash_interval = big_interval;
     }  

if (millis() <  big_interval  +  flash_count * 1000L) // делим 6 секндный интервал на два периода, в первый мигаем количество раз соответствующее числу израсходованных попыток
  { //мигает 
    if (millis() > flash_interval + 500L) 
      digitalWrite(status_out, HIGH);
    else
      digitalWrite(status_out, LOW); // не горит
  } 
else 
  {                                                // не горит
    digitalWrite(status_out, LOW); //set digital 0 
  }
}
/////////////////////////////////////////////////////////////////////
// проверка  количества звонков (срабатывания вибромоторчика) с телефона, эдакое меню на четыре позиции. Практически это выглядит так, звонишь на машину, ждешь два гудка и сбрасываешь 
// машина завелась. Если надо заглушить- звонишь и сбрасываешь после первого гудка. Если надо включить режим запуска по температуре -садишся в машину заводишь двигатель, жмешь на педаль тормоза и звонишь
// и сбрасываешь после третьего гудка (теперь машина будет заводиться по температуре). Если сбросить  после четвертого гудка  режим сбросится и не будет запускаться по температуре больше. 
void check_phone_signal()  
{  
if ( digitalRead(hand_brake_in) != hand_brake_on) // сбрасываем счетчик звонков-гудков на 0 при любом  нажатии на тормоз
   {
    x=0;
   }
  
if (digitalRead(start_in) == 1 && flag_phone == 0) 
  {
    flag_phone = 1;
    x++;
    
    if ( x > 17 ) // ограничеваем количество виброзвонков семнадцатью, это соответствует четырем гудкам в телефоне звонящего ( это справедливо и настроено только для конкретного телефона 
                  // в других телефонах конечно другое количество соответствия виброзвонков гудкам 
    {
       x = 0 ;
    }
  }
if (digitalRead(start_in) == 0 && flag_phone == 1) 
   {
    flag_phone = 0; 
   }
if ( x == 1 && digitalRead(sharging_in) == sharging_on )   //на первый  гудок в телефоне звонящего вырубает двигатель если он был запущен.
   {
    do_shutdown();  
   }
if ( x == 6 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) != HIGH )  //запускает двигатель на 6 виброзвонков это два гудка в телефоне звонящего 
   {
    y=1; // флаг запуска 
   }
if (x == 11 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на три гудка включает разрешение режима на запуск по
  // температуре (настройка включения режима запуска по температуре)
    //делается в положении ключа зажигания ACC на не запущеном двигателе
   {
    z = 1; // флаг разрешения режима запуска по температуре
    y = 0;
   }
if (x == 17 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на четыре гудка выключает разрешение режима на запуск по температуре 
   // режим запуска по температуре настраивается только с ключом зажигания в положении АСС тоесть не меняются во время запуска и остановки двигателя по звонку  
   {
    z = 0;
    y = 0;
   }
}
///////////////////////////////////////////////////////////////////////
// звонок хозяину
void check_do_call() 
{  if( c == 0 )
   {
    return;
   } 
   if( millis() - previousMillis > interval)
   {
      previousMillis =  millis(); 
      if (ring_button == LOW)
     {
      ring_button = HIGH;
      b++;
     }
    else
       ring_button = LOW ;
 
    digitalWrite(11 , ring_button ); //  устанавливаем состояния выхода, чтобы включить или выключить кнопку телефона,
    digitalWrite(status_out , ring_button ); // подмигиваем статусом всякий раз когда звоним хозяину
    //для выполнения набора надо три раза поменять состояние кнопки  "зеленую трубка"   будет набор на послетний принятый или набранный номер
     }
    if( b == 4 ) // заканчиваем звонить и подмигивать
   {
    b = 0;
    c = 0; 
    digitalWrite(11 , LOW );
    digitalWrite(status_out , LOW );
    } 
}
/////////////////////////////////////////////////////////////////
// ожидание сигнала с датчика вибрации
void check_vibro_signal()
{    if (digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == LOW && millis()- d > 600000) //
         { if (digitalRead(vibr_sensor) == LOW   ) // проверяем датчик вибрации на незапущеном двигателе и на ACC питания нет и только после 10 мин после выключения двигателя
              {
               c = 1; // звоним хозяину что кто то пинает колесо 
              }
         }
}
///////////////////////////////////////////////////////////////////
// периодически заряжаем телефон, например 4 часа зарядка, 20 часа перерыв
void phone_charging_check()
{ static unsigned long period = LOW_INTERVAL; // текущий интервал включения( выключения), static позволяет сохранить значение переменной при каждом выходе из функции
  static unsigned long prevMillis = 0;
  if( millis() < prevMillis)
  {
    prevMillis = 0;
  }
  if( (millis()-prevMillis)>period)
  {
    prevMillis=millis();
     digitalWrite(bat_charge,!digitalRead(bat_charge));
     // меняем интервал через сколько нужно сработать в следующий раз
     period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL, эта конструкция  в ардуино звучит как 
     // if (period == LOW_INTERVAL)
     // {
     //  period=HIGH_INTERVAL
     // }
     // else period=LOW_INTERVAL;
  } 
}
///////////////////////////////////////////////////////////////////////////
void led_pulse()
{ static unsigned long period1 = LOW_INTERVAL1; 
  static unsigned long period2 = V_LOW_INTERVAL; //
  static unsigned long prevMillis1 = 0;
  static unsigned long prevMillis2 = 0;
  
   if( (millis()-prevMillis1)>period1)
  {
    prevMillis1=millis();
    period1=(period1==LOW_INTERVAL1)?HIGH_INTERVAL1: LOW_INTERVAL1;
  } 
  if ( period1 == LOW_INTERVAL1)
  { if( (millis()-prevMillis2)>period2)
      { prevMillis2=millis();
        digitalWrite(status_out,!digitalRead(status_out));
      }
  }
 if (  period1 == HIGH_INTERVAL1)
 {                               
      digitalWrite(status_out, LOW);
 }                                 
}
////////////////////////////////////////////////////////////////////
//запоминаем время остановки двигателя независимо почему он выключился или от ключа или от сигнала с телефона,
// это запомненное время используем при проверке датчика удара чтобы вибродатчик начал работать с временной задержкой например 10 мин и мы могли  не боятся хлопнуть дверью.
// если не сделать задержку то машина будет вам звонить при любой вибрации и ударе когда двигатель заглушен, а вы например еще не покинули автомобиль.
void check_time_eng_stop()
{
  if (digitalRead(ACC_in) == HIGH && ACC_IN_LOW == 0)// на АСС питание присутствует
  { 
    ACC_IN_LOW = 1; 
  }
  if (digitalRead(ACC_in) == LOW && ACC_IN_LOW == 1) // на
  {
     ACC_IN_LOW = 0;
     d = millis();
  }
 
}


     

 

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Anton_Kos87 пишет:

нельзя разве сделать как на обычных сигнализациях, если вытянут ручник реле зажигания подтянуто, вытаскиваешь ключь-машина работает, закрываешь двери, ставишь на охрану машина глохнет и становится в режим удаленного автозапуска, если какой то шаг был нарушен- режим автозапуска блокируется (становится невозможным)???

помойму все просто....

Действительно не сложно, еще один провод от ручника протянуть. А код добавить не трудно.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

constantinoff пишет:
Согласен. Лежал телефон без дела жаль было выбросить. А теперь пользу будет приносить. И ещё на многих операторах есть бесплатные исходящие внутри сети, а смс платные у всех. Так что +1 к запуску по звонку.

За исходящий звонок без понятия трубки не берет никто.

constantinoff
Offline
Зарегистрирован: 27.12.2015

Точно... Ха ха, я как то уж и забыл что трубку то не поднимает система)))

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

провод идет уже на приборку, пиктограмма колодок и восклицательный знак, так что тянуть ничего не нужно просто врезатся и сделать развязку там помойму при вытягивании ручника провод коротит на массу

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

еще привязать акселерометр то при постановке на охрану можно будет сохранять положение автомобиля, если его поднимит эвакуатор то бегом званить хозяину!! и слать смс "Забери меня хозяин"

по поводу бесплатных вызовов на м590 можно сделать что бы хозяин определялся по номеру но трубка не поднималась так что автозапуск будет работать бесплатно :)

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

https://sites.google.com/site/hobbyarduino/project-updates/arduhome/car-...

вот опытный образец можно что нибудь взять отсюда

constantinoff
Offline
Зарегистрирован: 27.12.2015

Anton_Kos87 пишет:

https://sites.google.com/site/hobbyarduino/project-updates/arduhome/car-...

вот опытный образец можно что нибудь взять отсюда

От туда все уже взято и доработанно. Если посмотрите первое сообщение в ветке и пройдете по ссылке там то все поймете, что и от куда взято.

constantinoff
Offline
Зарегистрирован: 27.12.2015

я использую ардуино нано, атут проэкт построен на ардуино про мини, от сюда у меня возникло куча вопростов в процессе моделирования данной схемы в протеусе.

вопрос первый есть ли различия в названиях выходов? потому что у ардуино про мини их меньше

вот так они выглядят в протеусе

вот так ардуино про мини выглядет на схеме у Федора.

и вопрос к Федору- в скетче в начале когда обзываются входы и выходы, для зарядки телефона выделен 15 контакт? Верно? или я что то путаю, а на ардуино не на нано не на про мини нет такого контакта.Уважаемый Федор, вопрос к вам, на сколько я понял ардуино нано и про мини, отличается только количеством, входов выходов и способом заливания скетча, в остальном они вроде бы должны быть одинаковы. Это так? И не могли бы мне помочь адаптировать скетч к адруино нано, если между нашими девайсами есть какая то существенная разница?

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

увы микросхемы тоже разные

-==ATmega168==- Pro Mini

ППЗУ (Flash Memory): 16 K, из них 2 К используются загрузчиком

ОЗУ (SRAM): 1 Кбайт 

ПЗУ (EEPROM): 512 байт



-==ATmega328==- Nano

ППЗУ (Flash Memory): 32 К, из них 2 К используются загрузчиком 

ОЗУ (SRAM): 2 Кбайт 

ПЗУ (EEPROM): 1024 байт

и по количеству пинов они разные!

15 контакт это вроде A1

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Anton_Kos87 пишет:

увы микросхемы тоже разные

-==ATmega168==- Pro Mini

ППЗУ (Flash Memory): 16 K, из них 2 К используются загрузчиком

ОЗУ (SRAM): 1 Кбайт 

ПЗУ (EEPROM): 512 байт



-==ATmega328==- Nano

ППЗУ (Flash Memory): 32 К, из них 2 К используются загрузчиком 

ОЗУ (SRAM): 2 Кбайт 

ПЗУ (EEPROM): 1024 байт

и по количеству пинов они разные!

15 контакт это вроде A1

все тоже самое, вы ошибаетесь заказывал такие 

Pro Mini Module Atmega328 5V 16M For Arduino Compatible Nano,

все должно совпадать

fyodor.m
Offline
Зарегистрирован: 28.12.2015

constantinoff пишет:

я использую ардуино нано, атут проэкт построен на ардуино про мини, от сюда у меня возникло куча вопростов в процессе моделирования данной схемы в протеусе.

вопрос первый есть ли различия в названиях выходов? потому что у ардуино про мини их меньше

вот так они выглядят в протеусе

вот так ардуино про мини выглядет на схеме у Федора.

и вопрос к Федору- в скетче в начале когда обзываются входы и выходы, для зарядки телефона выделен 15 контакт? Верно? или я что то путаю, а на ардуино не на нано не на про мини нет такого контакта.Уважаемый Федор, вопрос к вам, на сколько я понял ардуино нано и про мини, отличается только количеством, входов выходов и способом заливания скетча, в остальном они вроде бы должны быть одинаковы. Это так? И не могли бы мне помочь адаптировать скетч к адруино нано, если между нашими девайсами есть какая то существенная разница?

15 это и есть A1

constantinoff
Offline
Зарегистрирован: 27.12.2015

а где  можно найти полный список обозначений ног в скетче и на плате?

fyodor.m
Offline
Зарегистрирован: 28.12.2015

https://www.youtube.com/watch?v=pyUlxqtuFoc ссылка на видео по запуску.

Видео удалил

fyodor.m
Offline
Зарегистрирован: 28.12.2015

constantinoff пишет:

а где  можно найти полный список обозначений ног в скетче и на плате?

Все не сложно, аналоговые входы А0, А1, А2 используем как цифровые 14, 15, 16. Чисто цифровых мне не хватило. Смотри в скетче.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Пришел GY-521 MPU-6050 mpu6050 модуль 3 оси датчики аналоговый гироскоп акселерометр модуль.

Есть у кого нибудь идеи как его подключить в качестве датчика начала движения.

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Доброе день всем. Использую эту схемку на своем авто уже год, все работает. Немного изменил схемку и скетч:

1. Убрал аккумулятор из телефона и запитал  его напрямую от блочка питания как у constantinoff. Все что относилось к зарядке телефона в скетче закомментировал. Автоматику включения тедефона после реконнекта батареи авто делать не стал поленился еще один провод мострячить на кнопку включения телефона.

2. В скетче добавил  задержку времени 5мс чтобы победить помеху сигнала от генератора (sharging_in). Иногда двигатель в режиме 15-и минутного прогрева вырубался раньше времени по этой помехе. Теперь нормально.

Ну вобщем то и все. Так и не реализовал идею использовать трехосевой гироскоп в качестве датчика начала движения  машины для ручных коробок. може кто поможет и идеи есть?

Еще раз выкладываю скетч доработанный.

[code]
// регистрируем библиотеку датчика температуры
#include <OneWire.h>
#include <DallasTemperature.h>
// именуем входы выходы ардуины
#define ONE_WIRE_BUS 10
#define bat_charge 15 // выход на зарядку телефона
#define LOW_INTERVAL 72000000 // сколько времени выдавать LOW зарядка телефона выключена 44 часа 158400000, 20 часов 72000000
#define HIGH_INTERVAL 18000000 // сколько времени выдавать HIGH зарядка телефона включена 4 часа 14400000
#define LOW_INTERVAL1 400UL  //периудики моргания led status blink
#define HIGH_INTERVAL1 5000  //периудики моргания led status blink когда не моргает
#define V_LOW_INTERVAL 55  //периудики моргания led status blink
#define IGN2sec 14 // выход на зажигание 2
#define vibr_sensor 2 // d2 arduino контакт вибросенсора
#define hand_brake_in 3  //d3 adruino Контакт педали тормоза "+"
#define start_in 4  //d4 adruino Сигнал команды на старт от мобильного телефона вибро звонка
#define sharging_in 5  //d5 adruino
#define starter_out  6  //d6 adruino реле стартера
#define engine_out 7  //d7 adruino зажигание
#define secpower_out 8  //d8 цепи вторичного питания печка, фары итд
#define status_out 9  //d9 светодиод статуса системы  промаргивает = система готова к работе(включена). одно мигание запущен с первой попытки 2 со второй 3 с третьей 
#define seat_heat_out  13 //d13 цепь обогрева сидений для включения сидений. 
#define ACC_in 16  //d16 вход от ACC

OneWire oneWire(ONE_WIRE_BUS);
//Настройки 
unsigned long ENGINE_WARM_TIME = 900000; //15 min В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
const int ENGINE_START_MAX_TIME = 4; //В секундах масимальное время работы стартера типично 3 -10 сек
const int MIN_AIR_TEMP = -24; //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-24/

DallasTemperature sensors(&oneWire); 
float temp = 0; // текущее значение температуры
const byte sharging_on = 1; // 1 когда во время работы генератора или от датчика давления масла на этом входе высокое состояние , 0 когда  при работе генератора низкое состояние
const byte hand_brake_on = 0; //  0= не нажатая педаль тормоза , 1=  не нажата педаль тормоза

//переменная для фактического режима
byte actual_mode = 0; //  2 двигатель начал работать 
byte left_start_try = 0;  // переменная для хранения остатка числа попыток запуска 
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок 
byte flag_phone = 0; // переменная входного звонка с телефона
byte x = 0; // переменная количества звонков
byte y = 0; // переменная сигнала на запуск от телефона
byte z = 0; // переменная сигнала разрешения запуска по температуре
byte t = 0; // переменная флага запуска по температуре
byte c = 0; // переменная флага исходящих звонков
byte b = 0; // переменная количества нажатий на кнопку "зеленая трубка" телефона
unsigned long d = 0; // переменная запомненного времени остановки двигателя или выключения ключа в OFF 
byte ring_button = LOW; // переменная состояния кнопки исходящего звонка
unsigned long previousMillis = 0; // запомненное время исходящего звонка
int interval = 700; // интервал мультивибратора для исходящего звонка
byte ACC_IN_LOW = 0; // переменная флаг момента остановки двигателя или выключения ключа в OFF 
  
void setup() {
//--//-- настройка входов и выходов контроллера --------------  
// init selected pins
  pinMode(hand_brake_in, INPUT); // enable input 3
//  digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
// digitalWrite(hand_brake_in, HIGH);
  
 pinMode(start_in, INPUT); // enable input 4 вход с телефона на запуск
//  digitalWrite(start_in, HIGH); //pullup resistor
//  digitalWrite(start_in, LOW); 

 pinMode(sharging_in, INPUT); // enable input 5 
//  digitalWrite(sharging_in, HIGH); //generator LOW normaly
//  digitalWrite(sharging_in, HIGH);
 pinMode (vibr_sensor, INPUT); //вход от вибродатчика 2
digitalWrite(vibr_sensor, HIGH); //  необходимо подтянуть к питанию, так как сигнал с вибродатчика земля
// init outputs
pinMode(11, OUTPUT); // сигнал на дозвон по телефону
  digitalWrite(11, LOW); //set digital 0
//************реле обходчика***************  
 pinMode(12, OUTPUT); // enable output реле обходчика
 digitalWrite(12,LOW ); //set digital 0
 //*************обогрев сидений*************
 pinMode(seat_heat_out, OUTPUT);  //enable output relay seat heater 13
 digitalWrite(seat_heat_out, LOW);  //set digital 0
//*******************************************
  pinMode(starter_out, OUTPUT); // enable output 6
  digitalWrite(starter_out, LOW); //set digital 0
 
  pinMode(engine_out, OUTPUT); // enable output 7
  digitalWrite(engine_out, LOW); //set digital 0
 
  pinMode(secpower_out, OUTPUT); // enable output 8
  digitalWrite(secpower_out, LOW); //set digital 0 

  pinMode(IGN2sec, OUTPUT); // enable output 14
  digitalWrite(IGN2sec, LOW); //set digital 0 

  pinMode(status_out, OUTPUT); // enable output 9
  digitalWrite(status_out, LOW); //set digital 0 

  pinMode(bat_charge, OUTPUT); // enable output 15
  digitalWrite(bat_charge, LOW); //set digital 0

  pinMode(ACC_in, INPUT); // enable input 16

  
  //---- конец настройки входов и выходов контроллера --------------    
sensors.begin();
Serial.begin(9600);

}
void loop()
{
  //---- собственно это и есть весь код программы --------------
 
if (actual_mode < 2 )    //если двигатель не запущен
        {
        check_start();  //Управляем режимом запуска
        }
//код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены        
//но хорошая привычка фигурные скобки ставить всегда      
else   // иначе
        {
        check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
        } 
 
 set_status_led(); //независимо от режима Управляем светодиодом статуса
 check_phone_signal(); // независимо от режима проверяем входящие звонки с телефона
 check_do_call(); // независимо от режима ожидаем сигнал для звонка хозяину и звоним если завелся двигатель или заглох или пришел сигнал с датчика вибрации
 check_vibro_signal(); // проверяем сигнал от датчика вибрации 
// phone_charging_check(); // заряжаем телефон периодически например 4 часа зарядка 44 часа перерыв.  функция выключена
 check_time_eng_stop(); // запоминаем время остановки двигателя.
  
  //------------------конец основного кода -----------------
 }

  //---- дальше идут используемые функции и подфункции -------------- 

void check_start() 
{
 { // опрос температуры 
  static unsigned long prevMillis3 = 0; // static позволяет сохранять значение при выходе из функции
   if (millis() < prevMillis3) // 49 days arduino reset millis fix
  {
    prevMillis3 = 0;  
  }
   if( (millis()-prevMillis3)>600000) // задаем время между опросами датчика температуры раз в 10 мин (600000 милисек)
  {
    prevMillis3=millis();
    sensors.requestTemperatures();
    temp = sensors.getTempCByIndex(0);
 //Serial.println(temp);
  }
 }
  if (digitalRead(hand_brake_in) != hand_brake_on || digitalRead(sharging_in) == sharging_on ) //с нажатой педалью тормоза или с запущеным двигателем не делаем запуск
    {
      actual_mode = 0; // заканчиваем попытки запустить движек
      left_start_try = 0; 
      return;  
    }

  if (y == 1 && left_start_try == 0 ) //запуск по сигналу от телефона и еще  по температуре 
  {
   left_start_try = 3; // указываем что нужно попытаться трижды запустить движок 
   y = 0; // сбрасываем сигнал на запуск от телефона 
   x = 0;// сбрасываем количество звонков 
  } 
  if (temp  < MIN_AIR_TEMP && left_start_try == 0 && z == 1 && t == 0 ) // если температура меньше положенной и запуск по температуре разрешен, запускаем. 
  {
   y = 1;// запускаем 
   t = 1; // устанавливаем флаг запуска по температуре на 1 чтобы если не завелся по темп с трех раз больше не заводился по температуре  
   }
   
 // 
 
 if ( left_start_try > 0 )   
 {
    digitalWrite(12, HIGH);//включаем реле обходчика
    digitalWrite(engine_out, HIGH);   //включаем зажигание 
    digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь 
    digitalWrite(secpower_out, HIGH); //включаем печку фары итд
    delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление, все датчики включились
    do_start(); // пытаемся запустить движок
       left_start_try = left_start_try - 1 ; //уменьшаем число попыток

    if (left_start_try == 0 ) 
        actual_mode = 2;// заканчиваем попытки запустить движок
          

 }   
} // конец процедуры старта
 
 ////////////////////////////////////////////////////////
void do_start()
{
 //тут будет запуск движка    
 //   digitalWrite(engine_out, HIGH);   //включаем зажигание 
 //   digitalWrite(secpower_out, HIGH); //включаем печку фары итд
 //   delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление
    
    digitalWrite(secpower_out, LOW); //выключаем печку фары итд
    digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь

//----------------------------------------------------------------------------------- цикл стартера 
    digitalWrite(starter_out, HIGH); //включаем стартер 
    for (int secs=0; secs <= ENGINE_START_MAX_TIME ; secs++) // 
      {
      delay(1000); // и продолжаем его держать включенным 1 сек
      if (digitalRead(sharging_in) == sharging_on) //если зарядка пошла то 
               break;  // прерываем цикл
      }
//----------------------------------------------------------------------------------- 
    digitalWrite(starter_out, LOW); //отключаем стартер 

    if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что  зарядка пошла  
    {
      actual_mode = 2; //Запоминаем что движок запущен
      last_start_time = millis(); // запоминаем время запуска движка 
      c = 1; // звоним  хозяину что двигатель заведен
      digitalWrite(secpower_out, HIGH); //включаем печку фары итд
      digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь
      digitalWrite(12, LOW);         // реле обходчика выключаем
      if (temp < 8) //проверяем температуру для включения реле обогрева сидений в данном случае +8С
      { 
      digitalWrite(seat_heat_out, HIGH); //включаем обогрев сидений
      delay(300);             // останавливаем код на время сигнала на обогрев сидений, достаточно 0.3 секунды
      digitalWrite(seat_heat_out, LOW); // выключаем выход на обогрев сидений
      }
      t = 0;  // сбрасываем флаг запуска по температуре для последующих запусков по температуре 
    }
    else
    {
      digitalWrite(engine_out, LOW);   //выключаем зажигание чтбы разблокировать реле стартера
      digitalWrite(secpower_out, LOW); //выключаем печку фары итд
      digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
      digitalWrite(12,LOW);  // выключаем реле обходчика
      delay(5000); // останавливаем код на 5 секунд для передышки
    }
   
}
////////////////////////////////////////////////////////////////////  
void check_for_shutdown() 
{
   //сюда мы попадаем когда контроллер считает что движок работает
 
    if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что движок случайно не заглох  или  нажата педаль тормоза
   {        
     delay(5);                                                                                    //защита от помех задержка 5 милисекунд
     if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) 
          do_shutdown(); 
          left_start_try =0; // и больше не заводим
   }        
    
    
    //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время
 
 
   if (actual_mode != 0  ) //значит не выключили заглохший двигатель только что 
    { 
    if (millis() < last_start_time) // 49 days arduino reset millis fix
        {
          last_start_time = 0;
        }
    if (millis() > last_start_time+ENGINE_WARM_TIME)  // если текущее время больше чем время старта + время прогрева (задается в настройках) 
         
        {
         do_shutdown();
         left_start_try =0; // и больше не заводим
        }
    }
 }
//////////////////////////////////////////////////////////////////////
void do_shutdown()
{       
        digitalWrite(secpower_out, LOW); //выключаем печку фары итд 
        digitalWrite(12,LOW);//реле обходчика выключить
        digitalWrite(engine_out, LOW); //вырубаем зажигание
        digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
        actual_mode = 0;  // движок выключили запомним это
        last_start_time = 0; // ну и забудем о том что он был включен
        left_start_try =0; // и больше не заводим
        c = 1; // звоним хозяину что двигатель заглушен
        x = 0; // сбрасываем счетчик кол-ва звонков
}
/////////////////////////////////////////////////////////////////////
void set_status_led()
{
  if (digitalRead(hand_brake_in) != hand_brake_on)
    { 
    digitalWrite(status_out, LOW);
    return;
    }

  
if (actual_mode ==  2) //Движок запущен
   {  
    status_led_flash(); // показываем с какой попытки был прошлый запуск
   }
  else if (digitalRead(hand_brake_in) == hand_brake_on &&  digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in)!= HIGH) // зажигаем статус если не в пути, нечего в пути мигать 
   {
    led_pulse(); // промаргивает  - показываем что готов к следующему запуску
   }
}
////////////////////////////////////////////////////////////////////////
void status_led_flash()
{
static unsigned long big_interval = 0;
static unsigned long flash_interval = 0;
unsigned long flash_count = 0;
flash_count = 3 - left_start_try;  //сколько раз мигать

//1 секундный интервал
if (millis() > flash_interval + 1000L)
      flash_interval = millis() ; //задаем счетчие от 0 до 1 секунды

//задаем 6 секунд 
if (millis() > big_interval + 6000L)
     {
      big_interval = millis() ;  //задаем счетчие от 0 до 10секунд
      flash_interval = big_interval;
     }  

if (millis() <  big_interval  +  flash_count * 1000L) // делим 6 секндный интервал на два периода, в первый мигаем количество раз соответствующее числу израсходованных попыток
  { //мигает 
    if (millis() > flash_interval + 500L) 
      digitalWrite(status_out, HIGH);
    else
      digitalWrite(status_out, LOW); // не горит
  } 
else 
  {                                                // не горит
    digitalWrite(status_out, LOW); //set digital 0 
  }
}
/////////////////////////////////////////////////////////////////////
// проверка  количества звонков (срабатывания вибромоторчика) с телефона, эдакое меню на четыре позиции. Практически это выглядит так, звонишь на машину, ждешь два гудка и сбрасываешь 
// машина завелась. Если надо заглушить- звонишь и сбрасываешь после первого гудка. Если надо включить режим запуска по температуре -садишся в машину заводишь включаеш в ACC и звонишь
// и сбрасываешь после третьего гудка (теперь машина будет заводиться по температуре). Если сбросить  после четвертого гудка  режим сбросится и не будет запускаться по температуре больше. 
void check_phone_signal()  
{  
if ( digitalRead(hand_brake_in) != hand_brake_on) // сбрасываем счетчик звонков-гудков на 0 при любом  нажатии на тормоз
   {
    x=0;
   }
  
if (digitalRead(start_in) == 1 && flag_phone == 0) 
  {
    flag_phone = 1;
    x++;
    
    if ( x > 17 ) // ограничеваем количество виброзвонков семнадцатью, это соответствует четырем гудкам в телефоне звонящего ( это справедливо и настроено только для конкретного телефона 
                  // в других телефонах конечно другое количество соответствия виброзвонков гудкам 
    {
       x = 0 ;
    }
  }
if (digitalRead(start_in) == 0 && flag_phone == 1) 
   {
    flag_phone = 0; 
   }
if ( x == 1 && digitalRead(sharging_in) == sharging_on )   //на первый  гудок в телефоне звонящего вырубает двигатель если он был запущен.
   {
    do_shutdown();  
   }
if ( x == 6 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) != HIGH )  //запускает двигатель на 6 виброзвонков это два гудка в телефоне звонящего 
   {
    y=1; // флаг запуска 
   }
if (x == 11 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на три гудка включает разрешение режима на запуск по
  // температуре (настройка включения режима запуска по температуре)
    //делается в положении ключа зажигания ACC на не запущеном двигателе
   {
    z = 1; // флаг разрешения режима запуска по температуре
    y = 0;
   }
if (x == 17 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на четыре гудка выключает разрешение режима на запуск по температуре 
   // режим запуска по температуре настраивается только с ключом зажигания в положении АСС тоесть не меняются во время запуска и остановки двигателя по звонку  
   {
    z = 0;
    y = 0;
   }
}
///////////////////////////////////////////////////////////////////////
// звонок хозяину
void check_do_call() 
{  if( c == 0 )
   {
    return;
   } 
   if( millis() - previousMillis > interval)
   {
      previousMillis =  millis(); 
      if (ring_button == LOW)
     {
      ring_button = HIGH;
      b++;
     }
    else
       ring_button = LOW ;
 
    digitalWrite(11 , ring_button ); //  устанавливаем состояния выхода, чтобы включить или выключить кнопку телефона,
    digitalWrite(status_out , ring_button ); // подмигиваем статусом всякий раз когда звоним хозяину
    //для выполнения набора надо три раза поменять состояние кнопки  "зеленую трубка"   будет набор на послетний принятый или набранный номер
     }
    if( b == 4 ) // заканчиваем звонить и подмигивать
   {
    b = 0;
    c = 0; 
    digitalWrite(11 , LOW );
    digitalWrite(status_out , LOW );
    } 
}
/////////////////////////////////////////////////////////////////
// ожидание сигнала с датчика вибрации
void check_vibro_signal()
{    if (digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == LOW && millis()- d > 900000) //
         { if (digitalRead(vibr_sensor) == LOW   ) // проверяем датчик вибрации на незапущеном двигателе и на ACC питания нет и только после 15 мин после выключения двигателя
              {
               c = 1; // звоним хозяину что кто то пинает колесо 
              }
         }
}
///////////////////////////////////////////////////////////////////
// периодически заряжаем телефон, например 4 часа зарядка, 20 часа перерыв. Эта функция выключена.
//void phone_charging_check()
//{ static unsigned long period = LOW_INTERVAL; // текущий интервал включения( выключения), static позволяет сохранить значение переменной при каждом выходе из функции
//  static unsigned long prevMillis = 0;
//  if( millis() < prevMillis)
//  {
//  }
//  if( (millis()-prevMillis)>period)
//  {
//    prevMillis=millis();
//     digitalWrite(bat_charge,!digitalRead(bat_charge));
//     // меняем интервал через сколько нужно сработать в следующий раз
//     period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL, эта конструкция  в ардуино звучит как 
//     // if (period == LOW_INTERVAL)
//     // {
//     //  period=HIGH_INTERVAL
//     // }
//     // else period=LOW_INTERVAL;
//  } 
//}
///////////////////////////////////////////////////////////////////////////
void led_pulse()
{ static unsigned long period1 = LOW_INTERVAL1; 
  static unsigned long period2 = V_LOW_INTERVAL; //
  static unsigned long prevMillis1 = 0;
  static unsigned long prevMillis2 = 0;
  
   if( (millis()-prevMillis1)>period1)
  {
    prevMillis1=millis();
    period1=(period1==LOW_INTERVAL1)?HIGH_INTERVAL1: LOW_INTERVAL1;
  } 
  if ( period1 == LOW_INTERVAL1)
  { if( (millis()-prevMillis2)>period2)
      { prevMillis2=millis();
        digitalWrite(status_out,!digitalRead(status_out));
      }
  }
 if (  period1 == HIGH_INTERVAL1)
 {                               
      digitalWrite(status_out, LOW);
 }                                 
}
////////////////////////////////////////////////////////////////////
//запоминаем время остановки двигателя независимо почему он выключился или от ключа или от сигнала с телефона,
// это запомненное время используем при проверке датчика удара чтобы вибродатчик начал работать с временной задержкой например 15 мин и мы могли  не боятся хлопнуть дверью.
// если не сделать задержку то машина будет вам звонить при любой вибрации и ударе когда двигатель заглушен, а вы например еще не покинули автомобиль.
void check_time_eng_stop()
{
 if (digitalRead(ACC_in) == HIGH && ACC_IN_LOW == 0)// на АСС питание присутствует
  { 
    ACC_IN_LOW = 1; 
  }
  if (digitalRead(ACC_in) == LOW && ACC_IN_LOW == 1) // на
  {
     ACC_IN_LOW = 0;
     d = millis();
  }
 
}


     


[/code]

 

 

constantinoff
Offline
Зарегистрирован: 27.12.2015

Давно меня тут нибыло. Забросил проект потому что машину сменил и на ней был автозапуск. Теперь опять машину меняю и возможно в этот раз автозапуск не будет. Буду опять браться за проект. Начинаю рассматривать управление ао смс. Есть у кого соображения по этому поводу? Кто то тут советовал использовать GSM модуль. Очень интересно было бы сейчас попробовать что то подобное. GSM M590GPRS SIM900 GSM SMS GPRS связи слот флип карты заменить SIM900 Через neoway M590 для Arduino
http://s.aliexpress.com/yMRbYRna
(from AliExpress Android)

whoami
Offline
Зарегистрирован: 01.12.2016

Я вот немного не пойму, как работает ардуино если авто поставлено на сигналку. Вот если я поставил на сигналку и ушел, она не даст завести мотор. То есть если делать автозапуск с ардуино, то двери с ключа закрывать без сигналки?

fyodor.m
Offline
Зарегистрирован: 28.12.2015

Ардуино-автозапуск работает независимо от сигналки. Сигналки разные бывают. Например на хюндай ай30 родная сигналка не препятствует запуску автомобиля, а только орет если двери или капот взломать. А на многих машинах вообще нет сигналки с завода, только центральный замок и на ключе кнопочки.

constantinoff
Offline
Зарегистрирован: 27.12.2015

Здравствуйте Федор! Я забросил проект по причине смены машины, теперь я вновь поменял машину и на сей раз автозапуска нет, но есть робот, и для того что бы завести эту машину нужно выжать педаль тормоза. Ни как не могу прописать еще один выход который бы давал сигнал на один из выходов арду, который нужен для имитации нажатия на тормоз, после запуска двигателя данный сигнал должен пропасть. . Не могли бы вы мне помочь в этом вопросе?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

constantinoff пишет:
Давно меня тут нибыло. Забросил проект потому что машину сменил и на ней был автозапуск. Теперь опять машину меняю и возможно в этот раз автозапуск не будет. Буду опять браться за проект. Начинаю рассматривать управление ао смс. Есть у кого соображения по этому поводу? Кто то тут советовал использовать GSM модуль. Очень интересно было бы сейчас попробовать что то подобное. GSM M590GPRS SIM900 GSM SMS GPRS связи слот флип карты заменить SIM900 Через neoway M590 для Arduino http://s.aliexpress.com/yMRbYRna (from AliExpress Android)

есть уже готовое решение управление автозапуском по звонку, т.е. звонишь на модуль идет проверка номера, номер наш, сбрасываем пошел запуск, запустился звонит, сбрасываем если не перезвонила значит запустился двигатель, иначе если не запустился будет наяривать пока трубку не возьмем. трубку взяли дуина скидывает вызов. и больше не звонит. тек же возможно управление по смс, но это дорого. если допустим хотим узнать почему не завелась, посылаем start on начинается снова запуск, и если не завелас пишет "stoit na skorosy"( у меня стоит геркон на рычаге кпп),  либо "popitki zapuska konchilis" ,либо если завилась то пишет "ZAVEDENA USPESHNO" если интересно могу скинуть скетч но там еще много мусора, доработок, глюков пару всего, у меня еще реализован подключение брелка 24 битного со статическим кодом, для управления центральным замком и багажником, так же путем подбора времени закрываются стеклоподъемники но без токовой защиты, тупо реле на время замыкается при закрытии авто. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

constantinoff пишет:
Здравствуйте Федор! Я забросил проект по причине смены машины, теперь я вновь поменял машину и на сей раз автозапуска нет, но есть робот, и для того что бы завести эту машину нужно выжать педаль тормоза. Ни как не могу прописать еще один выход который бы давал сигнал на один из выходов арду, который нужен для имитации нажатия на тормоз, после запуска двигателя данный сигнал должен пропасть. . Не могли бы вы мне помочь в этом вопросе?

если хотите использовать код Федора 


// регистрируем библиотеку датчика температуры
#include <OneWire.h>
#include <DallasTemperature.h>
// именуем входы выходы ардуины
#define ONE_WIRE_BUS 10
#define bat_charge 15 // выход на зарядку телефона
#define LOW_INTERVAL 72000000 // сколько времени выдавать LOW зарядка телефона выключена 44 часа 158400000, 20 часов 72000000
#define HIGH_INTERVAL 18000000 // сколько времени выдавать HIGH зарядка телефона включена 4 часа 14400000
#define LOW_INTERVAL1 400UL  //периудики моргания led status blink
#define HIGH_INTERVAL1 5000  //периудики моргания led status blink когда не моргает
#define V_LOW_INTERVAL 55  //периудики моргания led status blink
#define IGN2sec 14 // выход на зажигание 2
#define vibr_sensor 2 // d2 arduino контакт вибросенсора
#define hand_brake_in 3  //d3 adruino Контакт педали тормоза "+"
#define start_in 4  //d4 adruino Сигнал команды на старт от мобильного телефона вибро звонка
#define sharging_in 5  //d5 adruino
#define starter_out  6  //d6 adruino реле стартера
#define engine_out 7  //d7 adruino зажигание
#define secpower_out 8  //d8 цепи вторичного питания печка, фары итд
#define status_out 9  //d9 светодиод статуса системы  промаргивает = система готова к работе(включена). одно мигание запущен с первой попытки 2 со второй 3 с третьей 
#define seat_heat_out  13 //d13 цепь обогрева сидений для включения сидений. 
#define ACC_in 16  //d16 вход от ACC

OneWire oneWire(ONE_WIRE_BUS);
//Настройки 
unsigned long ENGINE_WARM_TIME = 900000; //15 min В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
const int ENGINE_START_MAX_TIME = 4; //В секундах масимальное время работы стартера типично 3 -10 сек
const int MIN_AIR_TEMP = -24; //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-24/

DallasTemperature sensors(&oneWire); 
float temp = 0; // текущее значение температуры
const byte sharging_on = 1; // 1 когда во время работы генератора или от датчика давления масла на этом входе высокое состояние , 0 когда  при работе генератора низкое состояние
const byte hand_brake_on = 0; //  0= не нажатая педаль тормоза , 1=  не нажата педаль тормоза

//переменная для фактического режима
byte actual_mode = 0; //  2 двигатель начал работать 
byte left_start_try = 0;  // переменная для хранения остатка числа попыток запуска 
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок 
byte flag_phone = 0; // переменная входного звонка с телефона
byte x = 0; // переменная количества звонков
byte y = 0; // переменная сигнала на запуск от телефона
byte z = 0; // переменная сигнала разрешения запуска по температуре
byte t = 0; // переменная флага запуска по температуре
byte c = 0; // переменная флага исходящих звонков
byte b = 0; // переменная количества нажатий на кнопку "зеленая трубка" телефона
unsigned long d = 0; // переменная запомненного времени остановки двигателя или выключения ключа в OFF 
byte ring_button = LOW; // переменная состояния кнопки исходящего звонка
unsigned long previousMillis = 0; // запомненное время исходящего звонка
int interval = 700; // интервал мультивибратора для исходящего звонка
byte ACC_IN_LOW = 0; // переменная флаг момента остановки двигателя или выключения ключа в OFF 
  
void setup() {
//--//-- настройка входов и выходов контроллера --------------  
// init selected pins
  pinMode(hand_brake_in, INPUT); // enable input 3
//  digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
// digitalWrite(hand_brake_in, HIGH);
  
 pinMode(start_in, INPUT); // enable input 4 вход с телефона на запуск
//  digitalWrite(start_in, HIGH); //pullup resistor
//  digitalWrite(start_in, LOW); 

 pinMode(sharging_in, INPUT); // enable input 5 
//  digitalWrite(sharging_in, HIGH); //generator LOW normaly
//  digitalWrite(sharging_in, HIGH);
 pinMode (vibr_sensor, INPUT); //вход от вибродатчика 2
digitalWrite(vibr_sensor, HIGH); //  необходимо подтянуть к питанию, так как сигнал с вибродатчика земля
// init outputs
pinMode(11, OUTPUT); // сигнал на дозвон по телефону
  digitalWrite(11, LOW); //set digital 0
//************реле обходчика***************  
 pinMode(12, OUTPUT); // enable output реле обходчика
 digitalWrite(12,LOW ); //set digital 0
 //*************обогрев сидений*************
 pinMode(seat_heat_out, OUTPUT);  //enable output relay seat heater 13
 digitalWrite(seat_heat_out, LOW);  //set digital 0
//*******************************************
  pinMode(starter_out, OUTPUT); // enable output 6
  digitalWrite(starter_out, LOW); //set digital 0
 
  pinMode(engine_out, OUTPUT); // enable output 7
  digitalWrite(engine_out, LOW); //set digital 0
 
  pinMode(secpower_out, OUTPUT); // enable output 8
  digitalWrite(secpower_out, LOW); //set digital 0 

  pinMode(IGN2sec, OUTPUT); // enable output 14
  digitalWrite(IGN2sec, LOW); //set digital 0 

  pinMode(status_out, OUTPUT); // enable output 9
  digitalWrite(status_out, LOW); //set digital 0 

  pinMode(bat_charge, OUTPUT); // enable output 15
  digitalWrite(bat_charge, LOW); //set digital 0

  pinMode(ACC_in, INPUT); // enable input 16

  
  //---- конец настройки входов и выходов контроллера --------------    
sensors.begin();
Serial.begin(9600);

}
void loop()
{
  //---- собственно это и есть весь код программы --------------
 
if (actual_mode < 2 )    //если двигатель не запущен
        {
        check_start();  //Управляем режимом запуска
        }
//код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены        
//но хорошая привычка фигурные скобки ставить всегда      
else   // иначе
        {
        check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
        } 
 
 set_status_led(); //независимо от режима Управляем светодиодом статуса
 check_phone_signal(); // независимо от режима проверяем входящие звонки с телефона
 check_do_call(); // независимо от режима ожидаем сигнал для звонка хозяину и звоним если завелся двигатель или заглох или пришел сигнал с датчика вибрации
 check_vibro_signal(); // проверяем сигнал от датчика вибрации 
// phone_charging_check(); // заряжаем телефон периодически например 4 часа зарядка 44 часа перерыв.  функция выключена
 check_time_eng_stop(); // запоминаем время остановки двигателя.
  
  //------------------конец основного кода -----------------
 }

  //---- дальше идут используемые функции и подфункции -------------- 

void check_start() 
{
 { // опрос температуры 
  static unsigned long prevMillis3 = 0; // static позволяет сохранять значение при выходе из функции
   if (millis() < prevMillis3) // 49 days arduino reset millis fix
  {
    prevMillis3 = 0;  
  }
   if( (millis()-prevMillis3)>600000) // задаем время между опросами датчика температуры раз в 10 мин (600000 милисек)
  {
    prevMillis3=millis();
    sensors.requestTemperatures();
    temp = sensors.getTempCByIndex(0);
 //Serial.println(temp);
  }
 }
  if (digitalRead(hand_brake_in) != hand_brake_on || digitalRead(sharging_in) == sharging_on ) //с нажатой педалью тормоза или с запущеным двигателем не делаем запуск
    {
      actual_mode = 0; // заканчиваем попытки запустить движек
      left_start_try = 0; 
      return;  
    }

  if (y == 1 && left_start_try == 0 ) //запуск по сигналу от телефона и еще  по температуре 
  {
   left_start_try = 3; // указываем что нужно попытаться трижды запустить движок 
   y = 0; // сбрасываем сигнал на запуск от телефона 
   x = 0;// сбрасываем количество звонков 
  } 
  if (temp  < MIN_AIR_TEMP && left_start_try == 0 && z == 1 && t == 0 ) // если температура меньше положенной и запуск по температуре разрешен, запускаем. 
  {
   y = 1;// запускаем 
   t = 1; // устанавливаем флаг запуска по температуре на 1 чтобы если не завелся по темп с трех раз больше не заводился по температуре  
   }
   
 // 
 
 if ( left_start_try > 0 )   
 {
    digitalWrite(12, HIGH);//включаем реле обходчика
    digitalWrite(engine_out, HIGH);   //включаем зажигание 
    digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь 
    digitalWrite(secpower_out, HIGH); //включаем печку фары итд
    delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление, все датчики включились
    do_start(); // пытаемся запустить движок
       left_start_try = left_start_try - 1 ; //уменьшаем число попыток

    if (left_start_try == 0 ) 
        actual_mode = 2;// заканчиваем попытки запустить движок
          

 }   
} // конец процедуры старта
 
 ////////////////////////////////////////////////////////
void do_start()
{
 //тут будет запуск движка    
 //   digitalWrite(engine_out, HIGH);   //включаем зажигание 
 //   digitalWrite(secpower_out, HIGH); //включаем печку фары итд
 //   delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление
    
    digitalWrite(secpower_out, LOW); //выключаем печку фары итд
    digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь

//----------------------------------------------------------------------------------- цикл стартера 
    digitalWrite(starter_out, HIGH); //включаем стартер 
    for (int secs=0; secs <= ENGINE_START_MAX_TIME ; secs++) // 
      {
      delay(1000); // и продолжаем его держать включенным 1 сек
      if (digitalRead(sharging_in) == sharging_on) //если зарядка пошла то 
               break;  // прерываем цикл
      }
//----------------------------------------------------------------------------------- 
    digitalWrite(starter_out, LOW); //отключаем стартер 

    if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что  зарядка пошла  
    {
      actual_mode = 2; //Запоминаем что движок запущен
      last_start_time = millis(); // запоминаем время запуска движка 
      c = 1; // звоним  хозяину что двигатель заведен
      digitalWrite(secpower_out, HIGH); //включаем печку фары итд
      digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь
      digitalWrite(12, LOW);         // реле обходчика выключаем
      if (temp < 8) //проверяем температуру для включения реле обогрева сидений в данном случае +8С
      { 
      digitalWrite(seat_heat_out, HIGH); //включаем обогрев сидений
      delay(300);             // останавливаем код на время сигнала на обогрев сидений, достаточно 0.3 секунды
      digitalWrite(seat_heat_out, LOW); // выключаем выход на обогрев сидений
      }
      t = 0;  // сбрасываем флаг запуска по температуре для последующих запусков по температуре 
    }
    else
    {
      digitalWrite(engine_out, LOW);   //выключаем зажигание чтбы разблокировать реле стартера
      digitalWrite(secpower_out, LOW); //выключаем печку фары итд
      digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
      digitalWrite(12,LOW);  // выключаем реле обходчика
      delay(5000); // останавливаем код на 5 секунд для передышки
    }
   
}
////////////////////////////////////////////////////////////////////  
void check_for_shutdown() 
{
   //сюда мы попадаем когда контроллер считает что движок работает
 
    if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что движок случайно не заглох  или  нажата педаль тормоза
   {        
     delay(5);                                                                                    //защита от помех задержка 5 милисекунд
     if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) 
          do_shutdown(); 
          left_start_try =0; // и больше не заводим
   }        
    
    
    //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время
 
 
   if (actual_mode != 0  ) //значит не выключили заглохший двигатель только что 
    { 
    if (millis() < last_start_time) // 49 days arduino reset millis fix
        {
          last_start_time = 0;
        }
    if (millis() > last_start_time+ENGINE_WARM_TIME)  // если текущее время больше чем время старта + время прогрева (задается в настройках) 
         
        {
         do_shutdown();
         left_start_try =0; // и больше не заводим
        }
    }
 }
//////////////////////////////////////////////////////////////////////
void do_shutdown()
{       
        digitalWrite(secpower_out, LOW); //выключаем печку фары итд 
        digitalWrite(12,LOW);//реле обходчика выключить
        digitalWrite(engine_out, LOW); //вырубаем зажигание
        digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
        actual_mode = 0;  // движок выключили запомним это
        last_start_time = 0; // ну и забудем о том что он был включен
        left_start_try =0; // и больше не заводим
        c = 1; // звоним хозяину что двигатель заглушен
        x = 0; // сбрасываем счетчик кол-ва звонков
}
/////////////////////////////////////////////////////////////////////
void set_status_led()
{
  if (digitalRead(hand_brake_in) != hand_brake_on)
    { 
    digitalWrite(status_out, LOW);
    return;
    }

  
if (actual_mode ==  2) //Движок запущен
   {  
    status_led_flash(); // показываем с какой попытки был прошлый запуск
   }
  else if (digitalRead(hand_brake_in) == hand_brake_on &&  digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in)!= HIGH) // зажигаем статус если не в пути, нечего в пути мигать 
   {
    led_pulse(); // промаргивает  - показываем что готов к следующему запуску
   }
}
////////////////////////////////////////////////////////////////////////
void status_led_flash()
{
static unsigned long big_interval = 0;
static unsigned long flash_interval = 0;
unsigned long flash_count = 0;
flash_count = 3 - left_start_try;  //сколько раз мигать

//1 секундный интервал
if (millis() > flash_interval + 1000L)
      flash_interval = millis() ; //задаем счетчие от 0 до 1 секунды

//задаем 6 секунд 
if (millis() > big_interval + 6000L)
     {
      big_interval = millis() ;  //задаем счетчие от 0 до 10секунд
      flash_interval = big_interval;
     }  

if (millis() <  big_interval  +  flash_count * 1000L) // делим 6 секндный интервал на два периода, в первый мигаем количество раз соответствующее числу израсходованных попыток
  { //мигает 
    if (millis() > flash_interval + 500L) 
      digitalWrite(status_out, HIGH);
    else
      digitalWrite(status_out, LOW); // не горит
  } 
else 
  {                                                // не горит
    digitalWrite(status_out, LOW); //set digital 0 
  }
}
/////////////////////////////////////////////////////////////////////
// проверка  количества звонков (срабатывания вибромоторчика) с телефона, эдакое меню на четыре позиции. Практически это выглядит так, звонишь на машину, ждешь два гудка и сбрасываешь 
// машина завелась. Если надо заглушить- звонишь и сбрасываешь после первого гудка. Если надо включить режим запуска по температуре -садишся в машину заводишь включаеш в ACC и звонишь
// и сбрасываешь после третьего гудка (теперь машина будет заводиться по температуре). Если сбросить  после четвертого гудка  режим сбросится и не будет запускаться по температуре больше. 
void check_phone_signal()  
{  
if ( digitalRead(hand_brake_in) != hand_brake_on) // сбрасываем счетчик звонков-гудков на 0 при любом  нажатии на тормоз
   {
    x=0;
   }
  
if (digitalRead(start_in) == 1 && flag_phone == 0) 
  {
    flag_phone = 1;
    x++;
    
    if ( x > 17 ) // ограничеваем количество виброзвонков семнадцатью, это соответствует четырем гудкам в телефоне звонящего ( это справедливо и настроено только для конкретного телефона 
                  // в других телефонах конечно другое количество соответствия виброзвонков гудкам 
    {
       x = 0 ;
    }
  }
if (digitalRead(start_in) == 0 && flag_phone == 1) 
   {
    flag_phone = 0; 
   }
if ( x == 1 && digitalRead(sharging_in) == sharging_on )   //на первый  гудок в телефоне звонящего вырубает двигатель если он был запущен.
   {
    do_shutdown();  
   }
if ( x == 6 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) != HIGH )  //запускает двигатель на 6 виброзвонков это два гудка в телефоне звонящего 
   {
    y=1; // флаг запуска 
   }
if (x == 11 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на три гудка включает разрешение режима на запуск по
  // температуре (настройка включения режима запуска по температуре)
    //делается в положении ключа зажигания ACC на не запущеном двигателе
   {
    z = 1; // флаг разрешения режима запуска по температуре
    y = 0;
   }
if (x == 17 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на четыре гудка выключает разрешение режима на запуск по температуре 
   // режим запуска по температуре настраивается только с ключом зажигания в положении АСС тоесть не меняются во время запуска и остановки двигателя по звонку  
   {
    z = 0;
    y = 0;
   }
}
///////////////////////////////////////////////////////////////////////
// звонок хозяину
void check_do_call() 
{  if( c == 0 )
   {
    return;
   } 
   if( millis() - previousMillis > interval)
   {
      previousMillis =  millis(); 
      if (ring_button == LOW)
     {
      ring_button = HIGH;
      b++;
     }
    else
       ring_button = LOW ;
 
    digitalWrite(11 , ring_button ); //  устанавливаем состояния выхода, чтобы включить или выключить кнопку телефона,
    digitalWrite(status_out , ring_button ); // подмигиваем статусом всякий раз когда звоним хозяину
    //для выполнения набора надо три раза поменять состояние кнопки  "зеленую трубка"   будет набор на послетний принятый или набранный номер
     }
    if( b == 4 ) // заканчиваем звонить и подмигивать
   {
    b = 0;
    c = 0; 
    digitalWrite(11 , LOW );
    digitalWrite(status_out , LOW );
    } 
}
/////////////////////////////////////////////////////////////////
// ожидание сигнала с датчика вибрации
void check_vibro_signal()
{    if (digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == LOW && millis()- d > 900000) //
         { if (digitalRead(vibr_sensor) == LOW   ) // проверяем датчик вибрации на незапущеном двигателе и на ACC питания нет и только после 15 мин после выключения двигателя
              {
               c = 1; // звоним хозяину что кто то пинает колесо 
              }
         }
}
///////////////////////////////////////////////////////////////////
// периодически заряжаем телефон, например 4 часа зарядка, 20 часа перерыв. Эта функция выключена.
//void phone_charging_check()
//{ static unsigned long period = LOW_INTERVAL; // текущий интервал включения( выключения), static позволяет сохранить значение переменной при каждом выходе из функции
//  static unsigned long prevMillis = 0;
//  if( millis() < prevMillis)
//  {
//  }
//  if( (millis()-prevMillis)>period)
//  {
//    prevMillis=millis();
//     digitalWrite(bat_charge,!digitalRead(bat_charge));
//     // меняем интервал через сколько нужно сработать в следующий раз
//     period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL, эта конструкция  в ардуино звучит как 
//     // if (period == LOW_INTERVAL)
//     // {
//     //  period=HIGH_INTERVAL
//     // }
//     // else period=LOW_INTERVAL;
//  } 
//}
///////////////////////////////////////////////////////////////////////////
void led_pulse()
{ static unsigned long period1 = LOW_INTERVAL1; 
  static unsigned long period2 = V_LOW_INTERVAL; //
  static unsigned long prevMillis1 = 0;
  static unsigned long prevMillis2 = 0;
  
   if( (millis()-prevMillis1)>period1)
  {
    prevMillis1=millis();
    period1=(period1==LOW_INTERVAL1)?HIGH_INTERVAL1: LOW_INTERVAL1;
  } 
  if ( period1 == LOW_INTERVAL1)
  { if( (millis()-prevMillis2)>period2)
      { prevMillis2=millis();
        digitalWrite(status_out,!digitalRead(status_out));
      }
  }
 if (  period1 == HIGH_INTERVAL1)
 {                               
      digitalWrite(status_out, LOW);
 }                                 
}
////////////////////////////////////////////////////////////////////
//запоминаем время остановки двигателя независимо почему он выключился или от ключа или от сигнала с телефона,
// это запомненное время используем при проверке датчика удара чтобы вибродатчик начал работать с временной задержкой например 15 мин и мы могли  не боятся хлопнуть дверью.
// если не сделать задержку то машина будет вам звонить при любой вибрации и ударе когда двигатель заглушен, а вы например еще не покинули автомобиль.
void check_time_eng_stop()
{
 if (digitalRead(ACC_in) == HIGH && ACC_IN_LOW == 0)// на АСС питание присутствует
  { 
    ACC_IN_LOW = 1; 
  }
  if (digitalRead(ACC_in) == LOW && ACC_IN_LOW == 1) // на
  {
     ACC_IN_LOW = 0;
     d = millis();
  }
 
}


     

 

то надо в строке 171 добавить digitalWrite(10,HIGH);

и в строке 210 добавить digitalWrite(10,LOW);

и на пине 10 будет еденица пока происходит запуск, т.е. нажата педаль тормоза, но надо еще объявить 10 пин в функции setup() то что он выход,

т.е. 

в строках 96,97 дописать 

pinMode(10, OUTPUT); 
   digitalWrite(10, LOW); 

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

народ ищу соочастника для дальнейшего функционала автозапуску посредством приложения на андроид. т.е. этот модуль (NEOWEY M590E) может работать и с интернетом, но я не умею писать андроид приложения и сайты, может есть у кого познания? надо сервак написать точнее а не сайт. и управлять GET запросами. логику программы я построил, но вот сервак и приложение для меня темный лес

 

constantinoff
Offline
Зарегистрирован: 27.12.2015

Пока что жду запчасти. Заказал на али аруино про мини, оптопары. У меня есть арду мини и уно. Но с ними я буду экспериментировать позже. Потому что модуль GSM стоит дешевле чем предложенный вами GSM реле.
Ваше реле стоит 1500 рубликоа
http://s.aliexpress.com/ZnqaYbe2
А модуль для ардуиноНаименьший SIM800L GPRS GSM Модуль Micro Sim-карты Основной Плате Quad-band TTL Последовательный Порт
http://s.aliexpress.com/YBj2677f
(from AliExpress Android) Стоит 250 рублей

Очень интересен модуль gsm800. Хотел бы через него попробовать реализовать запуск, ношение и управление автозапускам

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

constantinoff пишет:
Пока что жду запчасти. Заказал на али аруино про мини, оптопары. У меня есть арду мини и уно. Но с ними я буду экспериментировать позже. Потому что модуль GSM стоит дешевле чем предложенный вами GSM реле. Ваше реле стоит 1500 рубликоа http://s.aliexpress.com/ZnqaYbe2 А модуль для ардуиноНаименьший SIM800L GPRS GSM Модуль Micro Sim-карты Основной Плате Quad-band TTL Последовательный Порт http://s.aliexpress.com/YBj2677f (from AliExpress Android) Стоит 250 рублей Очень интересен модуль gsm800. Хотел бы через него попробовать реализовать запуск, ношение и управление автозапускам

я про такой https://ru.aliexpress.com/item/Free-shipping-M590E-GSM-GPRS-module-Diy-kits-M590-GSM-GPRS-900m-1800m-sms-CPU-MCU/32615051653.html?spm=2114.03010208.3.1.UlaEpL&ws_ab_test=searchweb0_0,searchweb201602_4_10065_10068_10084_10083_10080_10082_10081_10060_10061_10062_10056_10055_10037_10054_10033_10059_10032_10099_10078_10079_10077_10093_10103_10073_10102_10096_10052_10050_10051-10050_10033_10077,searchweb201603_6&btsid=c062c3d4-0e1d-4a8b-9700-2792e57666f4

constantinoff
Offline
Зарегистрирован: 27.12.2015

может поделитесь ссылкой на ваш проэкт. мне наконец то пришли все детальки, начинаю собирать себе автозапуск

 

constantinoff
Offline
Зарегистрирован: 27.12.2015

вот скетч который получился путем добавления к Федину скетчу имитации нажатия на тор

// регистрируем библиотеку датчика температуры
#include <OneWire.h>
#include <DallasTemperature.h>
// именуем входы выходы ардуины
#define ONE_WIRE_BUS 10
#define bat_charge 15 // выход на зарядку телефона
#define LOW_INTERVAL 72000000 // сколько времени выдавать LOW зарядка телефона выключена 44 часа 158400000, 20 часов 72000000
#define HIGH_INTERVAL 18000000 // сколько времени выдавать HIGH зарядка телефона включена 4 часа 14400000
#define LOW_INTERVAL1 400UL  //периудики моргания led status blink
#define HIGH_INTERVAL1 5000  //периудики моргания led status blink когда не моргает
#define V_LOW_INTERVAL 55  //периудики моргания led status blink
#define IGN2sec 14 // выход на зажигание 2
#define vibr_sensor 2 // d2 arduino контакт вибросенсора
#define hand_brake_in 3  //d3 adruino Контакт педали тормоза "+"
#define start_in 4  //d4 adruino Сигнал команды на старт от мобильного телефона вибро звонка
#define sharging_in 5  //d5 adruino
#define starter_out  6  //d6 adruino реле стартера
#define engine_out 7  //d7 adruino зажигание
#define secpower_out 8  //d8 цепи вторичного питания печка, фары итд
#define status_out 9  //d9 светодиод статуса системы  промаргивает = система готова к работе(включена). одно мигание запущен с первой попытки 2 со второй 3 с третьей 
#define seat_heat_out  13 //d13 цепь обогрева сидений для включения сидений. 
#define ACC_in 16  //d16 вход от ACC

OneWire oneWire(ONE_WIRE_BUS);
//Настройки
unsigned long ENGINE_WARM_TIME = 900000; //15 min В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
const int ENGINE_START_MAX_TIME = 4; //В секундах масимальное время работы стартера типично 3 -10 сек
const int MIN_AIR_TEMP = -24; //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-24/

DallasTemperature sensors(&oneWire);
float temp = 0; // текущее значение температуры
const byte sharging_on = 1; // 1 когда во время работы генератора или от датчика давления масла на этом входе высокое состояние , 0 когда  при работе генератора низкое состояние
const byte hand_brake_on = 0; //  0= не нажатая педаль тормоза , 1=  не нажата педаль тормоза

//переменная для фактического режима
byte actual_mode = 0; //  2 двигатель начал работать
byte left_start_try = 0;  // переменная для хранения остатка числа попыток запуска
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок
byte flag_phone = 0; // переменная входного звонка с телефона
byte x = 0; // переменная количества звонков
byte y = 0; // переменная сигнала на запуск от телефона
byte z = 0; // переменная сигнала разрешения запуска по температуре
byte t = 0; // переменная флага запуска по температуре
byte c = 0; // переменная флага исходящих звонков
byte b = 0; // переменная количества нажатий на кнопку "зеленая трубка" телефона
unsigned long d = 0; // переменная запомненного времени остановки двигателя или выключения ключа в OFF
byte ring_button = LOW; // переменная состояния кнопки исходящего звонка
unsigned long previousMillis = 0; // запомненное время исходящего звонка
int interval = 700; // интервал мультивибратора для исходящего звонка
byte ACC_IN_LOW = 0; // переменная флаг момента остановки двигателя или выключения ключа в OFF

void setup() {
  //--//-- настройка входов и выходов контроллера --------------
  // init selected pins
  pinMode(hand_brake_in, INPUT); // enable input 3
  //  digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
  // digitalWrite(hand_brake_in, HIGH);

  pinMode(start_in, INPUT); // enable input 4 вход с телефона на запуск
  //  digitalWrite(start_in, HIGH); //pullup resistor
  //  digitalWrite(start_in, LOW);

  pinMode(sharging_in, INPUT); // enable input 5
  //  digitalWrite(sharging_in, HIGH); //generator LOW normaly
  //  digitalWrite(sharging_in, HIGH);
  pinMode (vibr_sensor, INPUT); //вход от вибродатчика 2
  digitalWrite(vibr_sensor, HIGH); //  необходимо подтянуть к питанию, так как сигнал с вибродатчика земля
  // init outputs
  pinMode(11, OUTPUT); // сигнал на дозвон по телефону
  digitalWrite(11, LOW); //set digital 0
  //************реле обходчика***************
  pinMode(12, OUTPUT); // enable output реле обходчика
  digitalWrite(12, LOW ); //set digital 0
  //*************обогрев сидений*************
  pinMode(seat_heat_out, OUTPUT);  //enable output relay seat heater 13
  digitalWrite(seat_heat_out, LOW);  //set digital 0
  //*******************************************
  pinMode(starter_out, OUTPUT); // enable output 6
  digitalWrite(starter_out, LOW); //set digital 0

  pinMode(engine_out, OUTPUT); // enable output 7
  digitalWrite(engine_out, LOW); //set digital 0

  pinMode(secpower_out, OUTPUT); // enable output 8
  digitalWrite(secpower_out, LOW); //set digital 0

  pinMode(IGN2sec, OUTPUT); // enable output 14
  digitalWrite(IGN2sec, LOW); //set digital 0

  pinMode(status_out, OUTPUT); // enable output 9
  digitalWrite(status_out, LOW); //set digital 0

  pinMode(bat_charge, OUTPUT); // enable output 15
  digitalWrite(bat_charge, HIGH); //включаем выход кнопку
  delay (3000); // 3 сек
  digitalWrite(bat_charge, LOW);  // отпускаем кнопку

  pinMode(10, OUTPUT); //включение тормоза при заводе
  digitalWrite(10, LOW);


  pinMode(ACC_in, INPUT); // enable input 16


  //---- конец настройки входов и выходов контроллера --------------
  sensors.begin();
  Serial.begin(9600);

}
void loop()
{
  //---- собственно это и есть весь код программы --------------

  if (actual_mode < 2 )    //если двигатель не запущен
  {
    check_start();  //Управляем режимом запуска
  }
  //код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены
  //но хорошая привычка фигурные скобки ставить всегда
  else   // иначе
  {
    check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
  }

  set_status_led(); //независимо от режима Управляем светодиодом статуса
  check_phone_signal(); // независимо от режима проверяем входящие звонки с телефона
  check_do_call(); // независимо от режима ожидаем сигнал для звонка хозяину и звоним если завелся двигатель или заглох или пришел сигнал с датчика вибрации
  check_vibro_signal(); // проверяем сигнал от датчика вибрации
  // phone_charging_check(); // заряжаем телефон периодически например 4 часа зарядка 44 часа перерыв.  функция выключена
  check_time_eng_stop(); // запоминаем время остановки двигателя.

  //------------------конец основного кода -----------------
}

//---- дальше идут используемые функции и подфункции --------------

void check_start()
{
  { // опрос температуры
    static unsigned long prevMillis3 = 0; // static позволяет сохранять значение при выходе из функции
    if (millis() < prevMillis3) // 49 days arduino reset millis fix
    {
      prevMillis3 = 0;
    }
    if ( (millis() - prevMillis3) > 600000) // задаем время между опросами датчика температуры раз в 10 мин (600000 милисек)
    {
      prevMillis3 = millis();
      sensors.requestTemperatures();
      temp = sensors.getTempCByIndex(0);
      //Serial.println(temp);
    }
  }
  if (digitalRead(hand_brake_in) != hand_brake_on || digitalRead(sharging_in) == sharging_on ) //с нажатой педалью тормоза или с запущеным двигателем не делаем запуск
  {
    actual_mode = 0; // заканчиваем попытки запустить движек
    left_start_try = 0;
    return;
  }

  if (y == 1 && left_start_try == 0 ) //запуск по сигналу от телефона и еще  по температуре
  {
    left_start_try = 3; // указываем что нужно попытаться трижды запустить движок
    y = 0; // сбрасываем сигнал на запуск от телефона
    x = 0;// сбрасываем количество звонков
  }
  if (temp  < MIN_AIR_TEMP && left_start_try == 0 && z == 1 && t == 0 ) // если температура меньше положенной и запуск по температуре разрешен, запускаем.
  {
    y = 1;// запускаем
    t = 1; // устанавливаем флаг запуска по температуре на 1 чтобы если не завелся по темп с трех раз больше не заводился по температуре
  }
  digitalWrite(10, HIGH);
  //

  if ( left_start_try > 0 )
  {
    digitalWrite(12, HIGH);//включаем реле обходчика
    digitalWrite(engine_out, HIGH);   //включаем зажигание
    digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь
    digitalWrite(secpower_out, HIGH); //включаем печку фары итд
    delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление, все датчики включились
    do_start(); // пытаемся запустить движок
    left_start_try = left_start_try - 1 ; //уменьшаем число попыток

    if (left_start_try == 0 )
      actual_mode = 2;// заканчиваем попытки запустить движок


  }
} // конец процедуры старта

////////////////////////////////////////////////////////
void do_start()
{
  //тут будет запуск движка
  //   digitalWrite(engine_out, HIGH);   //включаем зажигание
  //   digitalWrite(secpower_out, HIGH); //включаем печку фары итд
  //   delay(5000); // останавливаем код на 5 секунд чтобы бензонасос набрал давление

  digitalWrite(secpower_out, LOW); //выключаем печку фары итд
  digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь

  //----------------------------------------------------------------------------------- цикл стартера
  digitalWrite(starter_out, HIGH); //включаем стартер
  for (int secs = 0; secs <= ENGINE_START_MAX_TIME ; secs++) //
  {
    delay(1000); // и продолжаем его держать включенным 1 сек
    if (digitalRead(sharging_in) == sharging_on) //если зарядка пошла то
      break;  // прерываем цикл
  }
  digitalWrite(10, LOW);
  //-----------------------------------------------------------------------------------
  digitalWrite(starter_out, LOW); //отключаем стартер

  if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что  зарядка пошла
  {
    actual_mode = 2; //Запоминаем что движок запущен
    last_start_time = millis(); // запоминаем время запуска движка
    c = 1; // звоним  хозяину что двигатель заведен
    digitalWrite(secpower_out, HIGH); //включаем печку фары итд
    digitalWrite(IGN2sec, HIGH);   //включаем зажигание вторую цепь
    digitalWrite(12, LOW);         // реле обходчика выключаем
    if (temp < 8) //проверяем температуру для включения реле обогрева сидений в данном случае +8С
    {
      digitalWrite(seat_heat_out, HIGH); //включаем обогрев сидений
      delay(300);             // останавливаем код на время сигнала на обогрев сидений, достаточно 0.3 секунды
      digitalWrite(seat_heat_out, LOW); // выключаем выход на обогрев сидений
    }
    t = 0;  // сбрасываем флаг запуска по температуре для последующих запусков по температуре
  }
  else
  {
    digitalWrite(engine_out, LOW);   //выключаем зажигание чтбы разблокировать реле стартера
    digitalWrite(secpower_out, LOW); //выключаем печку фары итд
    digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
    digitalWrite(12, LOW); // выключаем реле обходчика
    delay(5000); // останавливаем код на 5 секунд для передышки
  }

}
////////////////////////////////////////////////////////////////////
void check_for_shutdown()
{
  //сюда мы попадаем когда контроллер считает что движок работает

  if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что движок случайно не заглох  или  нажата педаль тормоза
  {
    delay(5);                                                                                    //защита от помех задержка 5 милисекунд
    if (digitalRead(sharging_in) != sharging_on || digitalRead(hand_brake_in) != hand_brake_on )
      do_shutdown();
    left_start_try = 0; // и больше не заводим
  }


  //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время


  if (actual_mode != 0  ) //значит не выключили заглохший двигатель только что
  {
    if (millis() < last_start_time) // 49 days arduino reset millis fix
    {
      last_start_time = 0;
    }
    if (millis() > last_start_time + ENGINE_WARM_TIME) // если текущее время больше чем время старта + время прогрева (задается в настройках)

    {
      do_shutdown();
      left_start_try = 0; // и больше не заводим
    }
  }
}
//////////////////////////////////////////////////////////////////////
void do_shutdown()
{
  digitalWrite(secpower_out, LOW); //выключаем печку фары итд
  digitalWrite(12, LOW); //реле обходчика выключить
  digitalWrite(engine_out, LOW); //вырубаем зажигание
  digitalWrite(IGN2sec, LOW);   //выключаем зажигание вторую цепь
  actual_mode = 0;  // движок выключили запомним это
  last_start_time = 0; // ну и забудем о том что он был включен
  left_start_try = 0; // и больше не заводим
  c = 1; // звоним хозяину что двигатель заглушен
  x = 0; // сбрасываем счетчик кол-ва звонков
}
/////////////////////////////////////////////////////////////////////
void set_status_led()
{
  if (digitalRead(hand_brake_in) != hand_brake_on)
  {
    digitalWrite(status_out, LOW);
    return;
  }


  if (actual_mode ==  2) //Движок запущен
  {
    status_led_flash(); // показываем с какой попытки был прошлый запуск
  }
  else if (digitalRead(hand_brake_in) == hand_brake_on &&  digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) != HIGH) // зажигаем статус если не в пути, нечего в пути мигать
  {
    led_pulse(); // промаргивает  - показываем что готов к следующему запуску
  }
}
////////////////////////////////////////////////////////////////////////
void status_led_flash()
{
  static unsigned long big_interval = 0;
  static unsigned long flash_interval = 0;
  unsigned long flash_count = 0;
  flash_count = 3 - left_start_try;  //сколько раз мигать

  //1 секундный интервал
  if (millis() > flash_interval + 1000L)
    flash_interval = millis() ; //задаем счетчие от 0 до 1 секунды

  //задаем 6 секунд
  if (millis() > big_interval + 6000L)
  {
    big_interval = millis() ;  //задаем счетчие от 0 до 10секунд
    flash_interval = big_interval;
  }

  if (millis() <  big_interval  +  flash_count * 1000L) // делим 6 секндный интервал на два периода, в первый мигаем количество раз соответствующее числу израсходованных попыток
  { //мигает
    if (millis() > flash_interval + 500L)
      digitalWrite(status_out, HIGH);
    else
      digitalWrite(status_out, LOW); // не горит
  }
  else
  { // не горит
    digitalWrite(status_out, LOW); //set digital 0
  }
}
/////////////////////////////////////////////////////////////////////
// проверка  количества звонков (срабатывания вибромоторчика) с телефона, эдакое меню на четыре позиции. Практически это выглядит так, звонишь на машину, ждешь два гудка и сбрасываешь
// машина завелась. Если надо заглушить- звонишь и сбрасываешь после первого гудка. Если надо включить режим запуска по температуре -садишся в машину заводишь включаеш в ACC и звонишь
// и сбрасываешь после третьего гудка (теперь машина будет заводиться по температуре). Если сбросить  после четвертого гудка  режим сбросится и не будет запускаться по температуре больше.
void check_phone_signal()
{
  if ( digitalRead(hand_brake_in) != hand_brake_on) // сбрасываем счетчик звонков-гудков на 0 при любом  нажатии на тормоз
  {
    x = 0;
  }

  if (digitalRead(start_in) == 1 && flag_phone == 0)
  {
    flag_phone = 1;
    x++;

    if ( x > 17 ) // ограничеваем количество виброзвонков семнадцатью, это соответствует четырем гудкам в телефоне звонящего ( это справедливо и настроено только для конкретного телефона
      // в других телефонах конечно другое количество соответствия виброзвонков гудкам
    {
      x = 0 ;
    }
  }
  if (digitalRead(start_in) == 0 && flag_phone == 1)
  {
    flag_phone = 0;
  }
  if ( x == 1 && digitalRead(sharging_in) == sharging_on )   //на первый  гудок в телефоне звонящего вырубает двигатель если он был запущен.
  {
    do_shutdown();
  }
  if ( x == 6 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) != HIGH )  //запускает двигатель на 6 виброзвонков это два гудка в телефоне звонящего
  {
    y = 1; // флаг запуска
  }
  if (x == 11 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на три гудка включает разрешение режима на запуск по
    // температуре (настройка включения режима запуска по температуре)
    //делается в положении ключа зажигания ACC на не запущеном двигателе
  {
    z = 1; // флаг разрешения режима запуска по температуре
    y = 0;
  }
  if (x == 17 && digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == HIGH ) // на четыре гудка выключает разрешение режима на запуск по температуре
    // режим запуска по температуре настраивается только с ключом зажигания в положении АСС тоесть не меняются во время запуска и остановки двигателя по звонку
  {
    z = 0;
    y = 0;
  }
}
///////////////////////////////////////////////////////////////////////
// звонок хозяину
void check_do_call()
{ if ( c == 0 )
  {
    return;
  }
  if ( millis() - previousMillis > interval)
  {
    previousMillis =  millis();
    if (ring_button == LOW)
    {
      ring_button = HIGH;
      b++;
    }
    else
      ring_button = LOW ;

    digitalWrite(11 , ring_button ); //  устанавливаем состояния выхода, чтобы включить или выключить кнопку телефона,
    digitalWrite(status_out , ring_button ); // подмигиваем статусом всякий раз когда звоним хозяину
    //для выполнения набора надо три раза поменять состояние кнопки  "зеленую трубка"   будет набор на послетний принятый или набранный номер
  }
  if ( b == 4 ) // заканчиваем звонить и подмигивать
  {
    b = 0;
    c = 0;
    digitalWrite(11 , LOW );
    digitalWrite(status_out , LOW );
  }
}
/////////////////////////////////////////////////////////////////
// ожидание сигнала с датчика вибрации
void check_vibro_signal()
{ if (digitalRead(sharging_in) != sharging_on && digitalRead(ACC_in) == LOW && millis() - d > 900000) //
  { if (digitalRead(vibr_sensor) == LOW   ) // проверяем датчик вибрации на незапущеном двигателе и на ACC питания нет и только после 15 мин после выключения двигателя
    {
      c = 1; // звоним хозяину что кто то пинает колесо
    }
  }
}
///////////////////////////////////////////////////////////////////
// периодически заряжаем телефон, например 4 часа зарядка, 20 часа перерыв. Эта функция выключена.
//void phone_charging_check()
//{ static unsigned long period = LOW_INTERVAL; // текущий интервал включения( выключения), static позволяет сохранить значение переменной при каждом выходе из функции
//  static unsigned long prevMillis = 0;
//  if( millis() < prevMillis)
//  {
//  }
//  if( (millis()-prevMillis)>period)
//  {
//    prevMillis=millis();
//     digitalWrite(bat_charge,!digitalRead(bat_charge));
//     // меняем интервал через сколько нужно сработать в следующий раз
//     period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL, эта конструкция  в ардуино звучит как
//     // if (period == LOW_INTERVAL)
//     // {
//     //  period=HIGH_INTERVAL
//     // }
//     // else period=LOW_INTERVAL;
//  }
//}
///////////////////////////////////////////////////////////////////////////
void led_pulse()
{ static unsigned long period1 = LOW_INTERVAL1;
  static unsigned long period2 = V_LOW_INTERVAL; //
  static unsigned long prevMillis1 = 0;
  static unsigned long prevMillis2 = 0;

  if ( (millis() - prevMillis1) > period1)
  {
    prevMillis1 = millis();
    period1 = (period1 == LOW_INTERVAL1) ? HIGH_INTERVAL1 : LOW_INTERVAL1;
  }
  if ( period1 == LOW_INTERVAL1)
  { if ( (millis() - prevMillis2) > period2)
    { prevMillis2 = millis();
      digitalWrite(status_out, !digitalRead(status_out));
    }
  }
  if (  period1 == HIGH_INTERVAL1)
  {
    digitalWrite(status_out, LOW);
  }
}
////////////////////////////////////////////////////////////////////
//запоминаем время остановки двигателя независимо почему он выключился или от ключа или от сигнала с телефона,
// это запомненное время используем при проверке датчика удара чтобы вибродатчик начал работать с временной задержкой например 15 мин и мы могли  не боятся хлопнуть дверью.
// если не сделать задержку то машина будет вам звонить при любой вибрации и ударе когда двигатель заглушен, а вы например еще не покинули автомобиль.
void check_time_eng_stop()
{
  if (digitalRead(ACC_in) == HIGH && ACC_IN_LOW == 0)// на АСС питание присутствует
  {
    ACC_IN_LOW = 1;
  }
  if (digitalRead(ACC_in) == LOW && ACC_IN_LOW == 1) // на
  {
    ACC_IN_LOW = 0;
    d = millis();
  }

}

моз (сцепление) и включение телефона каждый раз когда включается ардуино. скетч







 

piligrume1988
Offline
Зарегистрирован: 14.02.2017

Можете отправить, выложить скетч автозапуска с М590?

DESArt
Offline
Зарегистрирован: 26.02.2017

Предлагаю создать нормальный проект, а не на коленке, т.е. развести плату, скрэтч поделить на модули (с нормально читаемым кодом) и спаять нормальную модульную сигнаху без висящих проводов, с заменяющимися модулями (это на будующее типа апгрейд ) :))

кому интересно пишите desa-07@mail.ru

ojakov
Offline
Зарегистрирован: 26.11.2015

Очень захватывает. Может упустил, но никто не берет в расчет сигнал от датчика давления масла. Если оно есть то машина завелась однозначно. А если нет то глушить ее быстрей! А в телефоне ведь тоже есть RX-TX, их можно задействовать или нет, вместо этого модуля неовай м590е?

ojakov
Offline
Зарегистрирован: 26.11.2015

d13lider пишет:

есть уже готовое решение управление автозапуском по звонку, т.е. звонишь на модуль идет проверка номера, номер наш, сбрасываем пошел запуск, запустился звонит, сбрасываем если не перезвонила значит запустился двигатель, иначе если не запустился будет наяривать пока трубку не возьмем. трубку взяли дуина скидывает вызов. и больше не звонит. тек же возможно управлен

А можно скетч и схему посмотреть?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

можно, но если реально делать хотите. а так чет мне лень стараться уже. 5-рым высылал и ни одного вопроса н езадали. просто так посмотрели и все напишите мне на эмейл d13ff@ya.ru

ojakov
Offline
Зарегистрирован: 26.11.2015

d13lider пишет:

можно, но если реально делать хотите. а так чет мне лень стараться уже. 5-рым высылал и ни одного вопроса н езадали. просто так посмотрели и все напишите мне на эмейл d13ff@ya.ru

тогда просить пока не буду, занялся установкой января, это потом, более к зиме актуально.