Дополнительно.Процедура постановки на РКПП выявила дополнительную "мороженку"!!!Она позволяет мне,на АКПП, реализовать функцию "пит-стоп".Таким образом,не глуша двигатель,можно выйти из авто за сигаретами или....Мелочь,а приятно!!
Вид для печати
Дополнительно.Процедура постановки на РКПП выявила дополнительную "мороженку"!!!Она позволяет мне,на АКПП, реализовать функцию "пит-стоп".Таким образом,не глуша двигатель,можно выйти из авто за сигаретами или....Мелочь,а приятно!!
Во вложении печатная плата,схема с изменениями и код.При сборке учесть перемычки.
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
}
}
Для чего в схеме резистор и стабилитрон обведенные красным?
ИМХО можно удалить часть схемы обведенные зеленым если изменить кусок кода с
наКод: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; // указываем что нужно попытаться трижды запустить движок
}
Вложение 16852Код:if (digitalRead(start_in) == 1 && left_start_try == 0 || temp > MIN_AIR_TEMP && left_start_try == 0 )
{
left_start_try = 3; // указываем что нужно попытаться трижды запустить движок
}
Привет!Спасибо,что исправил кодировку.Код и комментарии писал в текстовом редакторе AkelPad.Видимо у него своя кодировка,поэтому крокозябры.По ручнику:как я понимаю,на D3,при отпущенном ручном тормозе,реализована чистая 1.Что касается изменения кода.Обратите внимание!!В коде минимальная температура запуска установлена 29 градусов.Это для ТЕСТА!!!В рабочей системе она у меня -15.Иначе будет заводится при включенном ручнике!!!!Соответственно,изменяем знак условия temp > MIN_AIR_TEMP на temp < MIN_AIR_TEMP Если не прав,поправьте . Проверить при минусовой температуре нет возможности.
По ручнику можно включить внутреннюю подтяжку, она даже есть в коде, только закомментирована // 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; // указываем что нужно попытаться трижды запустить движок
}
Согласен по подтяжке.Но..в машине пусть будет такая цепочка.На всякий случай!!В коде жестко прописать минусовую температуру можно.Я сделал с прицелом на изменение этих параметров летом.
А может застраховаться от случайного чужого звонка? Типа 3 звонка за 2 минут...
Смысл?У меня за это время было 9 чужих смс и ни одного чужого звонка.У оператора просите ограничить номер телефона в машине только одним входящим /с вашего/ телефона.
Прошло почти полгода,как автозапуск "живет" в машине.За это время никаких "косяков" в работе не обнаружено.Сотовый за приборной панелью и ардуино nano пережили температуру за -30.Запуска по чужим смс или звонкам не было.За лето хочу попробовать сотовый заменить на модуль MC52.