Страница 3 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 21 по 30 из 61
  1. #21
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

    Дополнительно.Процедура постановки на РКПП выявила дополнительную "мороженку"!!!Она позволяет мне,на АКПП, реализовать функцию "пит-стоп".Таким образом,не глуша двигатель,можно выйти из авто за сигаретами или....Мелочь,а приятно!!

  2. #22
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

    Во вложении печатная плата,схема с изменениями и код.При сборке учесть перемычки.
    Вложения Вложения
    • Тип файла: rar 1.rar (201.1 Кб, Просмотров: 1026)

  3. #23
    Пользователь Аватар для lti1
    Регистрация
    15.10.2010
    Возраст
    48
    Сообщений
    78
    Вес репутации
    189

    По умолчанию Re: Автозапуск на ардуино nano

    mopkran, у меня при открытии скетча выложенного Вами большая часть пояснений отображается крокозябрами. Если у кого то такая же сложность, то вот код с поправленной кодировкой. Так же для этого проекта понадобятся две библиотеки OneWire и DallasTemperature, они прикреплены ниже.
    Код:
    // регистрируем библиотеку датчика температуры
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 10
    OneWire oneWire(ONE_WIRE_BUS);
    //Настройки 
    unsigned long ENGINE_WARM_TIME = 900000; //В миллисекундах время работы мотора после запуска 900000 миллисекунд = 15 минут
    int ENGINE_START_MAX_TIME = 5; //В секундах масимальное время работы стартера типично 3 -10 сек
    #define MIN_AIR_TEMP 29 //минимальная температура воздуха в градусах, ниже которой включается автозапуск /-15/
    DallasTemperature sensors(&oneWire); 
    //--------------выбор пинов ардуины по входу---------------------------------------------
    const int hand_brake_in  = 3;  //d3 adruino Контакт стояночного тормоза "-"
    const int start_in  = 4;  //d4 adruino Сигнал команды на старт от мобильного телефона вибра звонка
    const int sharging_in  = 5;  //d5 adruino
     
    const int sharging_on = 0; // 0 когда во время работы генератора или от датчика давления масла на этом входе низкое состояние , 1 когда на лампе генератора при работе генератора высокое состояние
    const int hand_brake_on = 0; //  0= поднятый датчик ручника замыкает на массу тормоз активен (жигули), 1= датчик ручника в поднятом состоянии выдает высокий уровень напряжения 
     
    // --------------выбор пинов ардуины по выходу---------------------------------------------
    const int starter_out  = 6;  //d6 adruino реле стартера
    const int engine_out  = 7;  //d7 adruino зажигание
    const int secpower_out  = 8;  //d8 цепи вторичного питания печка, фары итд
    const int status_out  = 9;  //d9 светодиод статуса системы  горит = система готова к работе(включена, ручник стоит). одно мигание запущен с первой попытки 2 со второй 3 с третьей 
                                                   //светодиод подключать с этого пина на массу
    //переменная для фактического режима
    int actual_mode = 0; //  2 двигатель начал работать 
    int left_start_try = 0;  // переменная для хранения остатка числа попыток запуска 
    unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок 
      
    void setup() {
    //---- настройка входов и выходов контроллера --------------  
    // init selected pins
      pinMode(hand_brake_in, INPUT); // enable input 
    //  digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
     pinMode(start_in, INPUT); // enable input 
    //  digitalWrite(start_in, HIGH); //pullup resustor enable
     
      pinMode(sharging_in, INPUT); // enable input 
    //  digitalWrite(sharging_in, LOW); //generator LOW normaly
     
    // init outputs
    pinMode(11, OUTPUT); // enable output
      digitalWrite(11, LOW); //set digital 0
    //************реле обходчика***************  
     pinMode(12, OUTPUT); // enable output
     digitalWrite(12,LOW ); //set digital 0
    //*******************************************
      pinMode(starter_out, OUTPUT); // enable output
      digitalWrite(starter_out, LOW); //set digital 0
     
      pinMode(engine_out, OUTPUT); // enable output
      digitalWrite(engine_out, LOW); //set digital 0
     
      pinMode(secpower_out, OUTPUT); // enable output
      digitalWrite(secpower_out, LOW); //set digital 0 
    
      pinMode(status_out, OUTPUT); // enable output
      digitalWrite(status_out, LOW); //set digital 0 
      //---- конец настройки входов и выходов контроллера --------------    
    sensors.begin();
    //Serial.begin(9600);
    }
     
    void loop()
    {
      //---- собственно это и есть весь код программы --------------
     
    if (actual_mode < 2 )    //если двигатель не запущен
        {
            check_start();  //Управляем режимом запуска
               }
    //код условия обязательно включать в фигурные скобки если должно быть выполнено несколько инструкций, в данном случае одна, поэтому скобки опущены        
          
    else   // иначе
            {
            check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
            } //но хорошая привычка фигурные скобки ставить всегда
     
          
     set_status_led(); //независимо от режима Управляем светодиодом статуса
       
      //------------------конец основного кода -----------------
     }
    
      //---- дальше идут используемые функции и подфункции -------------- 
    
    void check_start() 
    {
     digitalWrite(12,HIGH);//включаем реле обходчика
      sensors.requestTemperatures();
    float temp = sensors.getTempCByIndex(0);
    Serial.println(temp);
     if (digitalRead(hand_brake_in) != hand_brake_on) //без ручника не делаем запуск
        {
          actual_mode = 2; // заканчиваем попытки запустить движок
          left_start_try = 0; //без ручника другие попытки бесполезны
          return;  
        }
    
     if( temp  > MIN_AIR_TEMP)
     {
       digitalWrite(11,HIGH);//если температура ниже -15, включить запуск
      }
      
     if (digitalRead(start_in) == 1 && left_start_try == 0) // 1 is command for start  - 1  значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска
      {
       left_start_try = 3;   // указываем что нужно попытаться трижды запустить движок
      } 
    
     
     if ( left_start_try > 0 )   
     {
        digitalWrite(engine_out, HIGH);   //включаем зажигание 
        digitalWrite(secpower_out, HIGH); //включаем печку фары итд
        delay(3000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление, все датчики включились
        
     if (digitalRead(hand_brake_in) != hand_brake_on) //без ручника не делаем запуск
        {
          actual_mode = 2; // заканчиваем попытки запустить движок
          left_start_try = 0; //без ручника другие попытки бесполезны
          return;  
        }
        
      
       if (digitalRead(sharging_in) != sharging_on  )    // проверяем что генератор не работает 
       {
          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(3000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление
        
        digitalWrite(secpower_out, 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(); // запоминаем время запуска движка
        }
        else
        {
          digitalWrite(engine_out, LOW);   //выключаем зажигание чтбы разблокировать реле стартера
          digitalWrite(secpower_out, LOW); //выключаем печку фары итд
          delay(5000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление
        }
    }
      
    void check_for_shutdown() 
    {
    //сюда мы попадаем когда контроллер считает что движок работает
     
        if (digitalRead(sharging_in) != sharging_on  ) //проверяем что движок случайно не заглох
              do_shutdown();
        else 
    {
              digitalWrite(secpower_out, HIGH); //включаем печку фары итд
        digitalWrite(11,LOW);
        digitalWrite(12,LOW);
    }
        if (digitalRead(hand_brake_in) != hand_brake_on  ) //проверяем что если злодеи сняли с ручника то глушим мотор
          {
             do_shutdown();
             left_start_try =0; // и больше не заводим
          }
      
    //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время
     
     
        if (actual_mode != 0  ) //значит не выключили заглохший двигатель только что 
        {
          if (millis() > last_start_time+ENGINE_WARM_TIME)  // если текущее время больше чем время старта + время прогрева
             {
             do_shutdown();
             left_start_try =0; // и больше не заводим
             }
        }
     }
    
    void do_shutdown()
    {
            digitalWrite(secpower_out, LOW); //выключаем печку фары итд 
            digitalWrite(11,LOW);
            digitalWrite(12,LOW);//реле обходчика выключить
            digitalWrite(engine_out, LOW); //вырубаем зажигание
            actual_mode = 0;  // движок выключили запомним это
            last_start_time = 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
         digitalWrite(status_out, HIGH); // постоянное свечение - показываем что готов к следующему запуску
    }
    
    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 
      }
    }
    Вложения Вложения

  4. #24
    Пользователь Аватар для lti1
    Регистрация
    15.10.2010
    Возраст
    48
    Сообщений
    78
    Вес репутации
    189

    По умолчанию Re: Автозапуск на ардуино nano

    Для чего в схеме резистор и стабилитрон обведенные красным?

    ИМХО можно удалить часть схемы обведенные зеленым если изменить кусок кода с
    Код:
    if( temp  > MIN_AIR_TEMP)
     {
       digitalWrite(11,HIGH);//если температура ниже -15, включить запуск
      }
      
     if (digitalRead(start_in) == 1 && left_start_try == 0) // 1 is command for start  - 1  значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска
      {
       left_start_try = 3;   // указываем что нужно попытаться трижды запустить движок
      }
    на
    Код:
     if (digitalRead(start_in) == 1 && left_start_try == 0 || temp  > MIN_AIR_TEMP && left_start_try == 0 )
      {
       left_start_try = 3;   // указываем что нужно попытаться трижды запустить движок
      }
    Нажмите на изображение для увеличения. 

Название:	manual_chamatic v2.jpg 
Просмотров:	1638 
Размер:	102.2 Кб 
ID:	16852

  5. #25
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

    Привет!Спасибо,что исправил кодировку.Код и комментарии писал в текстовом редакторе AkelPad.Видимо у него своя кодировка,поэтому крокозябры.По ручнику:как я понимаю,на D3,при отпущенном ручном тормозе,реализована чистая 1.Что касается изменения кода.Обратите внимание!!В коде минимальная температура запуска установлена 29 градусов.Это для ТЕСТА!!!В рабочей системе она у меня -15.Иначе будет заводится при включенном ручнике!!!!Соответственно,изменяем знак условия temp > MIN_AIR_TEMP на temp < MIN_AIR_TEMP Если не прав,поправьте . Проверить при минусовой температуре нет возможности.

  6. #26
    Пользователь Аватар для lti1
    Регистрация
    15.10.2010
    Возраст
    48
    Сообщений
    78
    Вес репутации
    189

    По умолчанию Re: Автозапуск на ардуино nano

    По ручнику можно включить внутреннюю подтяжку, она даже есть в коде, только закомментирована // digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут не надо, зачем лишние детали то паять. Знак в MIN_AIR_TEMP не заметил.
    Вот так правильно
    Код:
    #define MIN_AIR_TEMP -15
    
     if (digitalRead(start_in) == 1 && left_start_try == 0 || temp  =< MIN_AIR_TEMP && left_start_try == 0 )
      {
       left_start_try = 3;   // указываем что нужно попытаться трижды запустить движок
      }
    А можно еще проще
    Код:
     if (digitalRead(start_in) == 1 && left_start_try == 0 || temp  =< -15 && left_start_try == 0 )
      {
       left_start_try = 3;   // указываем что нужно попытаться трижды запустить движок
      }

  7. #27
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

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

  8. #28
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: Автозапуск на ардуино nano

    А может застраховаться от случайного чужого звонка? Типа 3 звонка за 2 минут...

  9. #29
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

    Смысл?У меня за это время было 9 чужих смс и ни одного чужого звонка.У оператора просите ограничить номер телефона в машине только одним входящим /с вашего/ телефона.

  10. #30
    Пользователь
    Регистрация
    10.01.2013
    Сообщений
    34
    Вес репутации
    161

    По умолчанию Re: Автозапуск на ардуино nano

    Прошло почти полгода,как автозапуск "живет" в машине.За это время никаких "косяков" в работе не обнаружено.Сотовый за приборной панелью и ардуино nano пережили температуру за -30.Запуска по чужим смс или звонкам не было.За лето хочу попробовать сотовый заменить на модуль MC52.

Страница 3 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •