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

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

Здравствуйте все.  Воспользовался проектом Алексея Козина по автозапуску машины. Спасибо ему большое.  http://arduino.ru/forum/proekty/kotntroller-distantsionnogo-progreva-avtomobilya

Код  изменил и добавил под свои запросы. Так как в программировании новичек, то сначала писал программку затем испытывал, но так как сразу ничего  не работало то приходилось подставлять костыли. Наворотил кучу условий и код разросся. Мне было важно чтобы работало на моей машине Hyundai I30 автомат.

// регистрируем библиотеку датчика температуры
#include <OneWire.h>
#include <DallasTemperature.h>
// именуем входы выходы ардуины
#define ONE_WIRE_BUS 10   //d10 вход с датчика температуры
#define bat_charge 15     //d15 выход на зарядку телефона
#define LOW_INTERVAL 86400000  // сколько времени выдавать LOW зарядка телефона выключена 44 часа 158400000
#define HIGH_INTERVAL 18000000 // сколько времени выдавать HIGH зарядка телефона включена 4 часа 14400000
#define LOW_INTERVAL1 400UL    //периудики моргания led status blink
#define HIGH_INTERVAL1 5000UL  //периудики моргания led status blink когда не моргает
#define V_LOW_INTERVAL 30UL    //периудики моргания led status blink
#define IGN2sec 14        //d14 выход на зажигание 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; //20 min В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
const int ENGINE_START_MAX_TIME = 4; //В секундах масимальное время работы стартера типично 3 -10 сек
const int MIN_AIR_TEMP = -24; //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-24/

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

//переменная для фактического режима
int actual_mode = 0; //  2 двигатель начал работать 
int left_start_try = 0;  // переменная для хранения остатка числа попыток запуска 
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок 
int flag_phone = 0; // переменная входного звонка с телефона
int x = 0; // переменная количества звонков
int y = 0; // переменная сигнала на запуск от телефона
int z = 0; // переменная сигнала разрешения запуска по температуре
int t = 0; // переменная флага запуска по температуре
int c = 0; // переменная флага исходящих звонков
int b = 0; // переменная количества нажатий на кнопку "зеленая трубка" телефона
unsigned long d = 0; // переменная запомненного времени остановки двигателя 
int ring_button = LOW; // переменная состояния кнопки исходящего звонка
unsigned long previousMillis = 0; // запомненное время исходящего звонка
unsigned long interval = 700; // интервал мультивибратора для исходящего звонка
int ACC_IN_LOW = 0; // переменная момента остановки двигателя
  
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() 
{
  sensors.requestTemperatures();
  float 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);         // реле обходчика выключаем
      float temp = sensors.getTempCByIndex(0);
      if (temp < 6) //проверяем температуру для включения реле обогрева сидений здесь шесть градусов цельсия
      { 
      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;
   }
   unsigned long currentMillis = millis(); 
   if(currentMillis - previousMillis > interval)
   {
   previousMillis = currentMillis; 
      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 > 180000) //
         { if (digitalRead(vibr_sensor) == LOW   ) // проверяем датчик вибрации на незапущеном двигателе и на ACC питания нет и 
//только после 4 мин после выключения двигателя
              {
               c = 1; // звоним хозяину что кто то пинает колесо 
              }
         }
}
///////////////////////////////////////////////////////////////////
// периодически заряжаем телефон, например 4 часа зарядка, 44 часа перерыв
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);
 }                                 
}
////////////////////////////////////////////////////////////////////
//запоминаем время остановки двигателя независимо почему он выключился или от ключа или от сигнала с телефона,
// это запомненное время используем при проверке датчика удара чтобы вибродатчик начал работать с временной задержкой например 4 мин и// мы могли  не боятся хлопнуть дверью.
// если не сделать задержку то машина будет вам звонить при любой вибрации и ударе когда двигатель заглушен, а вы например еще не
// покинули автомобиль.
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

Что в итоге получилось.

Система может запускать двигатель по звонку с мобильного и глушить его по звонку. Так же прогревать двигатель определенное время. Отзванивается хозяину когда двигатель завелся автоматически и когда заглушен. Телефонным звонком можно настроить автоматический запуск по температуре. Включает обогрев сидений по пороговому значению температуры. Звонит хозяину когда некто или нечто стучит по машине. 

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

Для проекта воспользовался старой мобилкой . Сигналом на запуск с нее является вибромоторчик. А сигнал обратной связи когда контроллер отзванивается приходит на кнопку телефона "зеленая трубочка". Там всегда сохраняются последние звонки и если на нее подать сигнал три раза мобилка совершит дозвон на последний входящий.

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

Плату не разводил. Подумал что на макетной сделать будет быстрее. Но потом пожалел не очень краиво получилось.

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

Схемка принципиальная промежуточный вариант.  

На схеме не хватает кое чего. На ней нужно добавить входной сигнал АСС  на ножку А2. В сктче она задействована. И вибродатчик не нужно притягивать к земле, так как сигнал с него земля.

Перерисовал схему нормально, на карандашном ресунке ничего не видно было.

 

 

MacSim
Offline
Зарегистрирован: 28.11.2012

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

MacSim
Offline
Зарегистрирован: 28.11.2012

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

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

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

Термодатчик я расположил прямо на плате поэтому  пороговою температуру нужно ставить  с учетом что датчик в салоне. 

Все уже работает на машине месяц пока без сбоев.  Правда если сильные холода нужно изменить время зарядки разрядки телефона.

У лития сильно падает емкость на морозе. Заряжается телефон от отдельного блока питания.     http://www.aliexpress.com/item/5V-USB-Output-Converter-DC-7V-24V-to-5V-3A-Step-Down-Buck-KIS3R33S-Module/1859083996.html   

Вибродатчик можно использовать такой http://www.aliexpress.com/item/NC-Normally-Closed-Type-Alarm-Vibration-Sensor-Module-Switch-For-Arduino-Smart-Car-Motorcycle-Alarm-3/32446073987.html   

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

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

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

MacSim пишет:

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

Да Вы правы могут ошибиться, но даже такие старенькие телефоны как этот имеют возможность настроить вибрацию только на определенный номер хозяина. А на все остальные входящие или молчать или играть только мелодию без вибрации. 

4ishops
Offline
Зарегистрирован: 06.10.2012

На телефоне есть UART, почему бы его не использовать в проекте?

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

Если честно я не знаю что это такое уарт. Я так понимаю это нужно смс ки потом слать. По мне удобнее позвонил машине дождался двух гудков и сбросил, машина завелась. И тут же отзвонилась. Даже трубку брать не надо. Так же иглушить двигатель, только сбрасывать после первого гудка.

arduinec
Offline
Зарегистрирован: 01.09.2015

fyodor.m пишет:
Если честно я не знаю что это такое уарт.

https://ru.wikipedia.org/wiki/UART

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

Спасибо, теперь все понятно. Практики мы и воры, разыскиваем и воруем практические решения, чуть чуть доробатываем и пользуемся. А ссылки на википедию нам не помошники, нам бы попроще и чтобы работало.

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

Перерисовал принципиальную  схему теперь читаемая.

fagot
Offline
Зарегистрирован: 28.04.2015

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

velder72
Offline
Зарегистрирован: 07.01.2016

Напишите пожалуйста весь список деталей которые нужны для сборки. Особено интересуют реле.

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

подскажите а какой термодатчик вы использовали?

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

velder72 пишет:
Напишите пожалуйста весь список деталей которые нужны для сборки. Особено интересуют реле.

Реле для стартера и ACC использовал вот такие http://www.aliexpress.com/item/HOT-Free-Shipping-10-PCS-lot-High-Quality-5-Pins-RELAY-12V-DC-Coil-Power-Relay/32411403827.html там ток большой не нужен. На IG1 и IG2 использовал http://www.aliexpress.com/item/NEW-6PCS-Relay-T91-SLC-12VDC-SL-C-relay-12V-30A-250V/1848191813.html . Реле на фото монтажки видно. 

Остальные детали видно на принципиальной схеме.

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

constantinoff пишет:

подскажите а какой термодатчик вы использовали?

DS18B20.  В основном он используется для включения обогрева сидений в момент автозапуска. А запуск по температуре можно включать и выключать настройкой с помощю звонка по телефону, три гудка - режим включен, четыре гудка в трубке выключен. Алгоритм записан прямо в пояснениях в скетче.

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

fagot пишет:

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

Вы совершенно правы надо на текстолите. Я использовал мягкий многожильный провод для монтажа. Думаю поработает. Как раз и проверю.

velder72
Offline
Зарегистрирован: 07.01.2016

Уважаемый Фёдор спасибо за коментарий по поводу реле. Скажите а вы можете выложить схему запуска и алгоритм без всяких наворотов только запуск по звонку и остановка двигателя для коробки автомат.

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

В первом посте ссылка на проект Алексея Козина который я использовал за основу. Еще раз ему спасибо. В том проекте все без наворотов. Я думаю сможете и из моего проекта все ненужное Вам выпилить, а можно ничего не выпиливать из скетча. Просто в схеме не использовать не нужные Вам ножки. например сигнал на реле обогрева сидений, температурный  и вибродатчик.

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

fyodor.m пишет:

В первом посте ссылка на проект Алексея Козина который я использовал за основу. Еще раз ему спасибо. В том проекте все без наворотов. Я думаю сможете и из моего проекта все ненужное Вам выпилить, а можно ничего не выпиливать из скетча. Просто в схеме не использовать не нужные Вам ножки. например сигнал на реле обогрева сидений, температурный  и вибродатчик.

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

 http://ru.aliexpress.com/item/1pc-650-nm-KY-008-5V-Transmitter-Laser-Sensor-Module-for-Arduino-PIC-AVR-Transducer-Source/32451069488.html?spm=2114.03010208.3.10.kv5yoX&ws_ab_test=searchweb201556_2,searchweb201644_3_10001_10002_10005_301_10006_10012_10003_10004_62_10007_61,searchweb201560_2,searchweb1451318400_6150,searchweb1451318411_6449&btsid=ad862afc-f7b7-4e40-8bbc-f8881093d0a9

+

http://ru.aliexpress.com/item/1Pc-New-Laser-Sensor-Module-non-modulator-Tube-Laser-Receiver-Module-Free-Shipping-Brand-New/32573975448.html?spm=2114.03010208.3.2.kv5yoX&ws_ab_test=searchweb201556_2,searchweb201644_3_10001_10002_10005_301_10006_10012_10003_10004_62_10007_61,searchweb201560_2,searchweb1451318400_6150,searchweb1451318411_6449&btsid=ad862afc-f7b7-4e40-8bbc-f8881093d0a9

установить это под чехлом ручки , и скажем при команде запуска лазар включается и если приёмник его ловит то запуск разршен! все это завязать вместе с ручником?

как идейка? можно так реализовать?

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

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

Бесплатная доставка GY-521 MPU-6050 mpu6050 модуль 3 оси датчики аналоговый гироскоп акселерометр модуль для arduino
http://s.aliexpress.com/FJNZFv2U
(from AliExpress Android)

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

constantinoff пишет:
А как вы мочить собираетесь положение нейтрали с помощью данных девайсов? Может лучше поставить гироскоп и если он будет чувствовать продольное ускорения, то программа будет сразу прекращать все попытки и глушить двигатель? Бесплатная доставка GY-521 MPU-6050 mpu6050 модуль 3 оси датчики аналоговый гироскоп акселерометр модуль для arduino http://s.aliexpress.com/FJNZFv2U (from AliExpress Android)

а если авто под уклоном?

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

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

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

constantinoff пишет:
Можно можно использовать любое значение ускорения. Если машина на нейтрали то ускорение будет практически нулевое, будет небольшой шум в показаниях от вибрации двигателя, но он будет явно меньне чем начало движения.

 В Этом плане можно просто подключиться к датчику абс, но это тоже не вариант нужно исключить возможность запуска вовсе !

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

velder72
Offline
Зарегистрирован: 07.01.2016

Подскажите а что за маленькое чёрное релле на фото платы. Невидно маркировки.

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

Это реле включает зарядку телефона периодически. В данном скетче период зарядки телефона 4 часа, а период ожидания 44. Но я думаю надо изменить. На морозе 44 часа батарейка телефона не держит и телефон вырубается . Думаю часов 10 между зарядками надо оставить. А черное реле использовал из старой сигнализации на 12V 2A.

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

constantinoff пишет:
А как вы мочить собираетесь положение нейтрали с помощью данных девайсов? Может лучше поставить гироскоп и если он будет чувствовать продольное ускорения, то программа будет сразу прекращать все попытки и глушить двигатель? Бесплатная доставка GY-521 MPU-6050 mpu6050 модуль 3 оси датчики аналоговый гироскоп акселерометр модуль для arduino http://s.aliexpress.com/FJNZFv2U (from AliExpress Android)

Какая классная идея. Копеечная деталька с громадным потенциалом. Проводов никуда тянуть не надо, в схему машины лезть. Получиться легко повторяемый  универсальный девайс. Можно еще несколько функций на него повесить, например как кто то писал здесь включение ДХО при движении, охранную функцию.

Теперь может кто подскажет простой датчик движения на основе этой платки?

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

Я именно сразу подумал Про это . Допустим данные сКейч который у тебя на коробку автомат за место педали тормоза повесить данный девайс , только твой скетч почему-то у меня выдает ошибку, он просто не загружается в Arduino
Я не очень в программировании может попробуешь твой скейт переделать под это. Принцип: в момент включения зажигания лучь светит на приемник и включает нормально замкнутое реле которое размыкает плюс имитирующий педаль тормоза .

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

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

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

fyodor.m пишет:
Я имел ввиду датчик ускорений, а не лазер. Так как не очень понимаю как физически удобно установить лазер и приемник и тянуть к ним провода. А с датчиком ускорения можно обойтись и без сигнала и провода от педали тормоза. Вообщем классная идея. Наверное займусь.
На счет ошибки в скетче, он не совсем корректно скопировался, комменты переползли на новую строку, надо перед всеми комментами проверить и поставить по две косых черты

На счет скейча понял!
А все-таки Поможешь мне с этой идеей? Как разместить я разберусь, а вот по поводу поправить скейч я не осилю

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

OneWire oneWire(ONE_WIRE_BUS); ругается на эту строчку

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

Роман728 пишет:

OneWire oneWire(ONE_WIRE_BUS); ругается на эту строчку


надо библиотеку ONE WIRE BUS загрузить, посмотри тему первоисточника из первого поста

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Sketch uses 8,908 bytes (28%) of program storage space. Maximum is 30,720 bytes.
Global variables use 285 bytes (13%) of dynamic memory, leaving 1,763 bytes for local variables. Maximum is 2,048 bytes.

 

1.6.7

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

уважаемый fyodor.m не могли бы вы отправить мне скомпелированный скетч или в блокноте, а то тут перепрыгнули строки и как только я н пытался поправить его у меня не получилось. заранее благодарен вот моя почта constantinoff@list.ru

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

отказался от аккумулятора

долго думал как избавится от акуммулятора в телефоне, что бы небыло этого гемора с зарядкой, оказалось все просто, заказал DC-DC конвертер на алиэкспресе за 50 рублей, настроил его на понижение тока с 12 до 3,7 вольт и впаял вместо батареи. Работает отлично, блок не греется. А на телефоне даже пропал значек уровня заряда батареи. Остается один вопрос как мне изменить скетч что бы добавить в него строку в которой он будет включать телефон, после того как аврду включается сам? Можно и самому включать его конечно, когда скидываешь клемму это нужно будет делать каждый раз, а хочется что бы арду его включал сам. импульс нужен в 2 секунды. провода с кнопки включения я уже вывел.

 

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

уважаемый fyodor.m не могли бы вы отправить мне скомпелированный скетч или в блокноте, а то тут перепрыгнули строки и как только я н пытался поправить его у меня не получилось. заранее благодарен вот моя почта constantinoff@list.ru

ps. ваш скетч мне подходи больше всего, только бы добавить в него строку о включении телефона и он будет просто супер

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

Надо же даже телефончик похожий.

На проводочках которые подпаиваются к кнопке телефона "зеленая трубочка" я припаял выносную  кнопку( ее видно на моем фото трубки в черной термоусадке) в параллель, так как после подпайки проводов механическая кнопка на телефоне  не срабатывает, проводки мешают.

Вы правы Батарейка точно не нужна, проверено что даже полностью заряженая прои -15 градусах, телефон вырубается.  

На счет автоматического включения телефона подумаю.

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

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

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

Если я правильно понял логику что то не очень удобно. Захотел заглушить двигатель, например в пробке конкретно встал, так после поворота ключа в OFF еще и хлопать дверью надо. Да и не хорошо, мне кажется, релюшки силовые постоянно запитаны будут в пути. Опять же дополнительный сигнал открытия двери тянуть в схему надо. Хотя если беспокоитесь о сохранности авто его надо предусмотреть. В этом проекте сигнал от дверей не учитывается. Тоесть если взломать дверь во время автопрогрева  двигатель будет продолжать молотить и заглохнет только при нажатии педали тормоза.

Жду датчик ускорений трехосный, прийдет буду эксперементировать с ним.  

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

Я не агитарую за этот способ, я просто предложил как вариант на обсуждение. Может кому в голову придёт вариант его модернизации.

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

Собственно говоря вы можете глушить двигатель и педалью, но после этого режим "готов к запуску" будет сброшен, а поставлен в этот режим может быть только после закрытия двери с работающим двигателем. Ну как вариант.

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

constantinoff пишет:

отказался от аккумулятора

долго думал как избавится от акуммулятора в телефоне, что бы небыло этого гемора с зарядкой, оказалось все просто, заказал DC-DC конвертер на алиэкспресе за 50 рублей, настроил его на понижение тока с 12 до 3,7 вольт и впаял вместо батареи. Работает отлично, блок не греется. А на телефоне даже пропал значек уровня заряда батареи. Остается один вопрос как мне изменить скетч что бы добавить в него строку в которой он будет включать телефон, после того как аврду включается сам? Можно и самому включать его конечно, когда скидываешь клемму это нужно будет делать каждый раз, а хочется что бы арду его включал сам. импульс нужен в 2 секунды. провода с кнопки включения я уже вывел.

 Для включения телефона  можно использовать выход A1 который использовался для реле зарядки телефона. Провода от кнопки включения телефона подключить через оптрон к выводу А1.  А провод с А1 который идет на реле зарядки телефона через бустер нужно убрать. Смотри схемку.

Изменения в коде смотри ниже. Питание телефона надо подавать через предохранитель ардуинки. Теперь при каждой подаче питания на ардуинку на этапе сетапа включится телефон.

 

 

#define bat_charge 15 // выход на зарядку телефона A1 теперь используем как выход //на
//включение телефона
// прямо в void setup() заносим функцию включения телефона, она будет выполнятся
// каждый раз при включении Ардуинки.
void setup() {
  /////////////////////////////////////////////////////////////////////////////////////
   pinMode(bat_charge, OUTPUT); // enable output 15
// digitalWrite(bat_charge, LOW); //set digital 0 // это убираем из старого скетча
  digitalWrite(bat_charge, HIGH); //включаем выход кнопку
  delay (3000); // 3 сек
  digitalWrite(bat_charge, LOW);  // отпускаем кнопку
  //////////////////////////////////////////////////////////////////////////////////////
}
/////////////////////////////////////////////////////////////////////////////
// в void loop() закомментируем весь теперь не нужный кусок посвященный зарядке телефона 
// phone_charging_check(); // заряжаем телефон периодически например 4
// часа зарядка 44 часа перерыв. 
// периодически заряжаем телефон, например 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;
//  } 
//}

 

 

 

 

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

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

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

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Неправильно!

На автомате там всё правильно- ручник он и есть  ручник.

На ручной  можно слегка приподнять и уже пойдёт сигнал,
хотя никакой блокировки колёс не будет.

 

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

trembo пишет:

Неправильно!

На автомате там всё правильно- ручник он и есть  ручник.

На ручной  можно слегка приподнять и уже пойдёт сигнал,
хотя никакой блокировки колёс не будет.

 


В момент поднятии ручника Будет минус , а при опускании на данном проводе появится плюс только Похоже придется развязать диодом . Тут дело не в газировке колеса дело в том какой сигнал идет .то есть при опускании ручника появляется плюс педаль тормоза тоже дает плюс при нажатии

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

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