БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
Всем доброго времени суток. решил начать тему по покорению непокорного мне ардуино) идея такова: имеется девятка, карбюратор. задача:
1. Управление дроссельной заслонкой при помощи сервы или моторедуктора (выбор будет зависеть от необходимого усилия для работы с заслонкой). алгоритм: перед пуском, при включении зажигания замеряем температуру двигателя, температуру окружающей среды, и если например двигатель холодный (температуру порога "остывший двигатель" обязуюсь узнать у знающих)) и температура снаружи ниже +5 градусов, то закрываем заслонку дроссельную до упора, для облегчения пуска двигателя, и потом, когда двигатель пущен-через 1,5-2 секунды сбавляем обороты до 1300-1500 (обороты для прогрева тоже узнаю) и держим пока двигатель не наберет температуру стабильной работы на ХХ.
2. блок контроля скорости и оборотов, а также в нем же управление освещением и ходовыми огнями: для контроля оборотов двигателя буду применять сигнал с датчика Холла на двигателе, и коммутировать его с ардуино с помощью оптопары. спидометр -аналогично. вывод информации на дисплей от телефона сименс (пока со включением не разобрался но буду пробовать) также, в задачи этого блока будет входить: контроль скорости, при увеличении скорости выше порогового значения (например 2км\ч) будут плавно загораться светодиоды, при понижении скорости-гаснуть. при включении габаритов\ближнего света-ходовые гаснут. индикация на дисплее (например маленький прямоугольник синего цвета с надписью DRL и при включении штатных фар - желтые или зеленые)
3. Блок управления отоплением и "климат контроль". задача: в теплое время года - ничего не делать) а в прохладное и холодное - согреть машину при прогреве и поддержание температуры в салоне на указанном уровне (комфортный уровень температуры считаю +22...+24 градуса) детей в машине нет. как я это вижу: в салоне машины разместить несколько датчиков температуры которые будут работать по 1-wire, два в ногах передних ездоков, один в ногах задних, один на потолке салона. алгоритм: машина заведена, из п.1 плана берем значение "прогрета ли машина"( температура ОЖ) и включаем вентилятор отопления через ШИМ на максимум с обогревом лобового стекла, когда двигатель прогрет до нормальных температур, или по истечении пары минут, переключить направление потока в ноги и параллельно на лобовое (прогревать салон снизу вверх).
ну вот такой расклад. верю что собрать такое реально.
что готово: в протеусе симулирована работа спидометра и тахометра, ШИМ включение ДХО но только при трогании. больше пока головы не хватает.. помогите пожалуйста со схемотехникой и ПО:rolleyes:
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
PHP код:
//#define RPMpin 2;
//#define SPEEDpin 3;
unsigned long microsRPM = 0;
unsigned long microsCKOP = 0;
int rpm = 0;
int ckop = 0;
float naprBS = 0;
int DRL =9;
int brightness=0;
int fading =5;
void setup() {
Serial.begin(19200);
//digitalWrite(2,1);
//digitalWrite(3,1);
attachInterrupt(0,RPM,FALLING); //прерывание на 0 порт, на тахометр, на ПАДЕНИЕ напряжения
attachInterrupt(1,CKOP,RISING); //прерывание на 1 порт, на спидометр, на ПОДНЯТИЕ напряжения
pinMode(DRL,OUTPUT);
}
void loop(){
Serial.println("TAXOMETP");
Serial.println(rpm, DEC); //для проверки, пишем в сериал показание тахометра
Serial.println("cnugoMeTp");
Serial.println(ckop,DEC); //для проверки, пишем в сериал показание спидометра
Serial.println("HAnP");
Serial.println(naprBS); //для проверки, пишем в сериал напряжение БС
Serial.println(brightness);
float voltage=analogRead(0);
naprBS = 3.000*5.0/1024.0*voltage;
delay (10);
if (ckop>(0));{
analogWrite(DRL, brightness);
brightness = brightness + fading;
if (brightness == 255)
fading = (0) ;
}
/*if (digitalRead(7)!=1);{
analogWrite(DRL, brightness);
brightness = brightness - fading;
if (brightness == 0)
fading = (0);}*/
}
/* модуль тахометра*/
void RPM (){
rpm = (1000000.0/(micros()-microsRPM))*60; //вычисляем обороты для тахометра
microsRPM=micros(); //приравнивание старого значения времени к новому
}
/*модуль спидометра!!!!!!!!!!!!!!!вычитать из спецификации
датчика спидометра отношение импульсов к пройденному пути!!*/
void CKOP(){
ckop = ((1000000.0/((micros()-microsCKOP)*6))*60*60*0.00105); //вычисляем скорость, по датчику ХОЛЛА спидометра, ДЕЛИТЕЛЬ менять!
microsCKOP=micros(); //приравниваем старое значение на новое
//delay(10);
}
вот то что я написал, пока в протеусе эмуляция вроде работает.
если что не так с кодом, прошу подсказать так как я только начинающий
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
для пущего удобства разборки и разработки скетча, предлагаю тему делить на модули отдельные. итаак выношу на обсуждение первую часть - тахометр.
PHP код:
unsigned long microsRPM = 0;
int rpm = 0;
void setup() {
attachInterrupt(0,RPM,FALLING); //прерывание на 0 порт, на тахометр, на ПАДЕНИЕ напряжения/* модуль тахометра*/
void RPM (){
rpm = (1000000.0/(micros()-microsRPM))*60; //вычисляем обороты для тахометра
microsRPM=micros(); //приравнивание старого значения времени к новому
}
вот.
прошу помощи в следующем вопросе: так называемый Шифт-лайт. есть идея, при превышении числе оборотов от 3000 до 3500 - выводить зеленую стрелку вверх, когда более 3500- красную, и обратно, ниже 1700- синюю вниз. идеи?
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
следующий блок- спидометр.
PHP код:
unsigned long microsCKOP = 0;
int ckop = 0;
void setup() {
attachInterrupt(1,CKOP,RISING); //прерывание на 1 порт, на спидометр, на ПОДНЯТИЕ напряжения
}
void loop(){
/*модуль спидометра!!!!!!!!!!!!!!!вычитать из спецификации
датчика спидометра отношение импульсов к пройденному пути!!*/
void CKOP(){
ckop = ((1000000.0/((micros()-microsCKOP)*6))*60*60*0.00105); //вычисляем скорость, по датчику ХОЛЛА спидометра, ДЕЛИТЕЛЬ менять!
microsCKOP=micros(); //приравниваем старое значение на новое
//delay(10);
}
ну и тут тоже дополнение: на дисплее когда скорость 60-90-зеленые цифры, 90-130 желтые и выше красные) безопасности ради
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
хехе) я пока только в голове да в компьютере делаю) тихонько рисую в протеусе, собираю инфу. мне важнее оценка знающих по скетчу, чтобы по весне, когда тепло будет, разом БАБАЦ и собрать и залить рабочий или хоть подающий надежды скетч...
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
hoster, привет. Купил себе плату Ардуино, начал гуглить, так сюда и попал. Идея твоя не плохая, и даже интересная. В плане помощи как специалист по скретчам (блин уже ругаюсь такими словами))) ) - я тут не помошник, а вот с двигателями связан вплотную в виду своей профессии - знаю о двигателях и принципах работы не по наслышке - происходящие в ДВС процессы для меня так же понятны как написать программисту программу для складывания 2+2=4, как то так. Ладно, это всё полемика.
И так - пуск двигателя на холодную - здесь очень важно использовать датчик температуры воздуха от инж. девятки на впуске ( зависимисть температуры от напряжения - могу сбросить таблицу из программы для чип тюнинга (вторая часть моей профессии). В ответ на холодный пуск - думаю ни кто лучше тебя не скажет когда этот момент настаёт - все двигатели и карбюраторы индивидуальны. У одних на горячем двигателе обязательно при пуске нужно газнуть - переобогащение смеси ввиду испарений бензина из карбюратора и отсутствие вентиляции внутри воздушного фильтра. У других наоборот лучше не трогать педаль газа. Как правило при температуре воздуха на улице ниже +10 градусов уже требуется пуск двигателя при помощи подсоса, но маленького прикрытия заслонки, дабы не залить двигатель, и чем холоднее тем больше прикрывать нужно - этот алгоритм тебе прийдётся самому вычислять экспериментальным путём.
Спидометр я бы реализовал используя стандартный датчик скорости от ваза инжекторного, который выдаёт 6 импульсов на 1 метр пройденного пути - раширяются возможности БК.
По поводу климата - я бы использовал лишь потолочный датчик - в ногах будет тяжело разместить ввиду неравномерности потоков горячего и холодного (направленное движение воздуха из печки образует большие вихри), да и лишним он будет. Возможно ещё установить в районе подлокотника (ручника) но не на полу, как можно ближе к центру салона. Потолочный тут нужен в случае если решил покурить открыв окно - компенсировать приходящий поток холодного воздуха из окна. такая сисема в 2110 реализована, и неплохо себя зарекомендовала.
В общем будут вопросы -пиши.
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
добрый вечер) спасибо за внимание к моей теме, итак начну писать то, что надумал на сегодня:
машина девятка карб, с установленным подогревателем масла (электрический). имеем: при температуре за бортом ниже 0 (а я живу в ХМАО, на севере, и тут -40 по утрам запросто) ставлю подогрев, на 1,5 часа. выхожу, и завожу машину БЕЗ подсоса. это я к чему: что если я после прогрева тосола подогревателем выдерну подсос и стану заводить, то двиг зальется. поэтому думаю правильнее будет использовать датчик температуры ОЖ двигателя. затем, можно поэксперементировать, например: температура тосола -10, прикрываем заслонку на сколько-то градусов и заводим. или еще другой вариант: аккум и стартер новый, масло полусинтетика 5В-40, тосол теплый, так почему бы не крутить стартер секунд 5-7 и при этом прикрывать плавно заслонку? когда двиг запустится, и тахометр покажет это, то на пару секунд довести обороты до 2000 об\мин, и затем спустить до 1300-1500.
про датчик скорости: думаю он дает шесть импульсов не за метр, а за оборот... и следовательно при разных диаметрах колес расстояние будет разным. но здесь на форуме есть темы, и где то видел даже формулу с расчетами для определенного диаметра колес.
датчик температуры салона: да у меня у брата десятка и там наверху есть термистор обдуваемый маленьким пропеллером который управляет печкой (разбирали недавно, потому что не контачило) но опять же, думаю что если постоянно давать теплый воздух вниз, то он будет подниматься вверх и греть пассажиров (за счет конвекции) и думаю Ваше предложение про расположение верно.
ну пока наверно все, поеду на работу, еще раз спасибо за внимание к теме)
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
ТС, отпишись что получилось, что нет...
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
очень интересная задумка, тем более подойдет такой БК не только для ВАЗ. и с подсосом классно придумано, я тоже сделал на сервоприводе (корреткор фар), но от кнопки
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
снимаю шляпу ,очень интересная задумка ,сам прокручивал нечто подобное в голове ,только цели были в переключении скоростей кнопками на руле и автопереключение на камеру зх и обгона , но до андуино мне еще далеко ,вызывает вопрос ваша решенная (как я понял) задача :
Цитата:
Сообщение от
hoster
включаем вентилятор отопления через ШИМ на максимум
получается заводская ручька совсем не активна ? сила нагрева самой печьки не учавствует в поставленной задаче , ну если получилось с вентилятором ,почему бы не повторить и тут .
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
доброго времени суток. очень интересная задумка. я сам некоорое время занимюсь именно этим вопросом. собственно спешу сообщить, что в с++ я сам как полено по поверхности плыву, а углубиться не выходит. пока только тех часть реализовал; серва на карбюраторе и подключение и пересчер импульсов от холла трамблера.
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
PHP код:
//авто запуск по звонку мобильного телефона или от дополнительного выхода автосигнаизвции с функцией автоматической и безопасной зарядки аккумулятора телефона
//Настройки
#include <Servo.h> //библиотека серво
#include <PID_v1.h> //библиотека ПИД-ругулятора
double Setpoint, Input, Output; //переменные пид регулятора
Servo myservo; //серво привод
PID myPID(&Input, &Output, &Setpoint, 3, 0.5, 1, DIRECT); //создаем ПИД-регулятор
boolean revers; //переменная ПИД-регулятора
int val = 0; //переменная для хранения состояния датчика темппературы
unsigned long micros_th = 0; //переменная изменяемая для хранения значений прерываний
volatile int th; //переменная для хранения значений в об/мин
volatile int tz; //переменная для сброса значений тахометра
unsigned long ENGINE_WARM_TIME = 1200000; //В миллисекундах время работы мотора после запуска 1200000 миллисекунд = 20 минут
int ENGINE_START_MAX_TIME = 10; //В секундах масимальное время работы стартера типично 3 -10 сек
// select pins for input
const int sensorPin = A0; //объявляем аналоговый вход А0 для подключения датчика температуры
const int sensorZarad = A1; //А1 заряд акб телефона
const int knopkaPusk = A3;//а3 кнопка запуска двигателя
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= датчик ручника в поднятом состоянии выдает высокий уровень напряжения
// select pins for output
const int ledPin = 12; //объявляем цифровой выход 13 для индикации включения автоподсоса
const int pech = 10; //объявляем цифровой выход 8 для подключения печки
const int outpinZarad = 16;//А2 пин подключение реле заряда акб телефона
//------------------------выходы управления сигналкой-------------------------
//const int outpinSigOff = 18;//А4 пин подключение реле отключения сигналки
//const int outpinSigOn = 19;//А5 пин подключение реле включения сигналки
//---------------------------------------------------------------------------
const int starter_out = 7; //d6 adruino реле стартера
const int engine_out = 6; //d7 adruino зажигание
const int secpower_out = 8; //d8 цепи вторичного питания печка, фары итд
const int status_out = 11; //d9 светодиод статуса системы горит = система готова к работе(включена, ручник стоит). одно мигание запущен с первой попытки 2 со второй 3 с третьей
//светодиод подключать с этого пина на массу
// variable for actual mode
int actual_mode = 0; // 2 engine started
int left_start_try = 0; // переменная для хранения остатка числа попыток запуска
int knopkaPuskState = 0;//переменная для хранения положения кнопки запуска двигателя
unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен движок
void setup() {
//---- настройка входов и выходов контроллера --------------
// init selected pins
// init inputs
pinMode(knopkaPusk, INPUT);
// digitalWrite(knopkaPusk, LOW);
pinMode(sensorPin, INPUT);
// digitalWrite(sensorPin, HIGH);
pinMode(sensorZarad, INPUT);
// digitalWrite(sensorZarad, HIGH);
pinMode(hand_brake_in, INPUT); // enable input
digitalWrite(hand_brake_in, HIGH); //если подтяжка реализована аппаратно то тут ненадо
pinMode(start_in, INPUT); // enable input
// digitalWrite(start_in, LOW); //pullup resustor enable
pinMode(sharging_in, INPUT); // enable input
// digitalWrite(sharging_in, LOW); //generator LOW normaly
// init outputs
//-------------------управление сигналкой---------------------------
// pinMode(outpinSigOff, OUTPUT); // enable output
// digitalWrite(outpinSigOff, LOW); //set digital 0
// pinMode(outpinSigOn, OUTPUT); // enable output
// digitalWrite(outpinSigOn, LOW); //set digital 0
//------------------------------------------------------------------
pinMode(outpinZarad, OUTPUT); // enable output
digitalWrite(outpinZarad, LOW); //set digital 0
pinMode(pech, OUTPUT); // enable output
digitalWrite(pech, LOW); //set digital 0
pinMode(ledPin, OUTPUT); // enable output
digitalWrite(ledPin, 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
Serial.begin(115200); //включаем передачу по сериал монитор
attachInterrupt(0, tahometr, RISING); //включаем прерывание по фронтам импульса и запускаем функцию тахометра
Setpoint = 1500; //здесь мы устанавливаем заданные обороты прогрева двигателя
Input = th; //присваиваем входу ПИД-регулятора значение тахометра в об/мин
myPID.SetOutputLimits(0, 180); //устанавливаем границы выходного сигнала для ПИД-регулятора
if (Setpoint < Input) //если начальные обороты больше заданных
{
revers = true; //
myPID.SetControllerDirection(REVERSE); //ПИД-регулятор используем обратный
}
myPID.SetMode(AUTOMATIC); //включаем ПИД-регулятор
//---- конец настройки входов и выходов контроллера --------------
}
void loop()
{
//---- собственно это и есть весь код программы --------------
// Serial.println(th); //печатаем в монитор значение тахоьетра в об/мин
tz = tz - 1; //арифметические операции для тахометра
if (tz == 0) {
th = 0; //если переменная тз равна нулю, переменная th обнуляется
}
val = analogRead(sensorPin);
zaradAkkum(); //контроль заряда аккумулятора телефона
//*********************************запуск от кнопки********************************************
knopkaPuskState = digitalRead(knopkaPusk);
if (knopkaPuskState != 0)
{
zapuskKnopka();
}
else {
knopkaPuskState = 0;
}
if (digitalRead(sharging_in) != sharging_on ) // проверяем что генератор не работает
{
digitalWrite(secpower_out, LOW); //выключаем фары итд
delay(1);
digitalWrite(pech, LOW); //выключаем печку
delay(1);
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
delay(1);
digitalWrite(engine_out, LOW); //выключаем зажигание
}
if (actual_mode < 2 ) { //если двигатель не запущен
check_start(); //Управляем режимом запуска
}
else // иначе
{
check_for_shutdown(); //Управляем режимом ожидания окончания прогрева
} //но хорошая привычка фигурные скобки ставить всегда
set_status_led(); //независимо от режима Управляем светодиодом статуса
//------------------конец основного кода -----------------
}
//---- а дальше идут используемые функции и подфункции --------------
void check_start()
{
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(outpinSigOff, HIGH);//сигнал на отключение сигналки
// delay(1000); //удержание 1 сек
//digitalWrite(outpinSigOff, LOW);//сброс сигнала
//delay(500);
//-------------------------------------------------------------------------------
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); //включаем печку фары итд
ataches();
servo_start();
digitalWrite(secpower_out, LOW); //выключаем печку фары итд
delay(1000);
//----------------------------------------------------------------------------------- цикл стартера
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
{
ataches(); //
otkluchenie();
digitalWrite(secpower_out, LOW); //выключаем печку фары итд
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
delay(1000);
digitalWrite(engine_out, LOW); //выключаем зажигание чтбы разблокировать реле стартера
delay(5000); // останавливаем код на 5 секунд
}
}
void check_for_shutdown()
{
//сюда мы попадаем когда контроллер считает что движок работает
if (val >= 1000 && th >= 0 ) //если температура более 85 и обороты более или ровны 0 то,
{
ataches(); //
otkluchenie();
}
if (digitalRead(sharging_in) != sharging_on ) //проверяем что движок случайно не заглох
{ do_shutdown();
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
}
else
digitalWrite(secpower_out, HIGH); //включаем фары итд
if (digitalRead(hand_brake_in) != hand_brake_on ) //проверяем что если злодеи сняли с ручника то глушим мотор
{
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
do_shutdown();
left_start_try = 0; // и больше не заводим
}
if (val < 1000 && th >= 750) //если темп менее 85 и обороты более или ровны 750, запускаем ПИД-регулятор
{
ataches(); //звпускаем функцию
pid();
}
if (digitalRead(start_in) == 1 ) // 1команда на отключение движка - 1 значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска
{
do_shutdown();
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
}
//тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время
if (actual_mode != 0 ) //значит не выключили заглохший двигатель только что
{
// милисекунды в ардуино обнуляются каждые 49 суток
// для того чтобы в случае если запуск произошел в течении последних 20 минут до обнуления мотор не молотил еще 49 суток
// нужно обнулить и время старта, при этом мотор максимум будет прогреваться вдвое больше обычного
if (millis() < last_start_time)
{
last_start_time = 0;
}
if (millis() > last_start_time + ENGINE_WARM_TIME) // если текущее время больше чем время старта + время прогрева
{
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
do_shutdown();
left_start_try = 0; // и больше не заводим
}
}
}
void do_shutdown()
{
ataches();
otkluchenie();
digitalWrite(secpower_out, LOW); //выключаем печку фары итд
delay(1000);
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
digitalWrite(engine_out, LOW); //вырубаем зажигание
actual_mode = 0; // движок выключили запомним это
last_start_time = 0; // ну и забудем о том что он был включен
//---------------------------управление сигналкой при активации раскомментировать-----------------------
// digitalWrite(outpinSigOn, HIGH);//сигнал включения сигналки
//delay(1000);//удержание 1 сек
// digitalWrite(outpinSigOn, LOW);// сброс сигнала включения
//------------------------------------------------------------------------------------------------------
delay(3000);
}
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
}
}
//************************************измеряем частоту на входе тахометра по прерыванию***********
void tahometr()
{
th = ((60000000 / ( micros() - micros_th)) / 2); //считаем об/мин
micros_th = micros(); // присваиваем новое значение от пришедшего импульса
tz = 10; //
}
void ataches() //**********************функция отключения и повторного включения сервопривода***************************
{
myservo.detach(); //отключаемся
delay(3); //ждем 3 мс
myservo.attach(9); //подключаемся
delay(3); //ждем 3 мс
}
void servo_start() {
val = analogRead(sensorPin);
myservo.attach(9, 630, 2500); //подключаем серву на 9 цифровом пине с заданным углом концевых положений
val = map(val, 0, 1023, 0, 180); //устанавливаем серво в положение соответствующее температуре двигателя.преобразуем темпер в положение сервы
myservo.write(val); // поворачиваем серву в расчинанное положение
delay(2000); //задерка 3 секунды для стабилизации сервы.
digitalWrite(ledPin, HIGH); //подаем на 12 цифровой пин +5 и включаем светодиод режима включения автоподсоса
myservo.detach();
}
void pid() {
digitalWrite(ledPin, HIGH); //зажигаем светодиод индикации автоподсоса
Input = th; //читаем на вход ПИД-регулятора обороты двигателя
myPID.Compute(); //считаем выходной сигнал ПИД-регулятора
myservo.attach(9, 630, 2500); //включаем серву на 3 цифровом пине, с длинной импульса от 630 до 2540(указываем границы поворота сервы)
delay(10); //задержка 10 мс
if (revers) //если пид регулятор обратный, то сервой управляем также относительно противоположной крайней точки
myservo.write(180 - Output); //
else //если регулятор прямой то,
myservo.write(Output); //крутим серву от 0 до 180
delay(10); //ждем серву 10 мс
myservo.detach(); //отключаемся от сервы
if (val < 1000 && val > 750 && th >= 750) //если температура менее 85 но более 60 и обороты больше или ровны 750 об/мин то,
{
digitalWrite(pech, HIGH); //включаем на пине 8 печку автомобиля
}
}
void otkluchenie() {
digitalWrite(pech, LOW); //выключаем печку
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
myservo.write(180); //
{
delay(5);
} //замедляем серву
delay(1500);
myservo.detach(); //отключаемся от сервы
delay(10); //задержка0,001 секунда
}
//**************************контроль заряда аккумулятора телефона***********************
void zaradAkkum() {
float sensorVoltage = analogRead(sensorZarad);
sensorVoltage = sensorVoltage * 0.0048828125;
if (sensorVoltage <= 3.40) {
digitalWrite(outpinZarad, HIGH);
}
if (sensorVoltage >= 4.20) {
digitalWrite(outpinZarad, LOW);
}
delay(1);
// Serial.println(sensorVoltage);//для тестов. вывод напряжения акб на монитор
}
void zapuskKnopka() {
if (digitalRead(sharging_in) != sharging_on ) // проверяем что генератор не работает
{
digitalWrite(engine_out, HIGH); //включаем зажигание
delay(10);
ataches();
servo_start();
//----------------------------------------------------------------------------------- цикл стартера
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); //отключаем стартер
delay(1000); //временно
if (digitalRead(sharging_in) == sharging_on) //еще раз смотрим что зарядка пошла
{
ataches();
myservo.write(180); //
{
delay(5);
} //замедляем серву
delay(1500);
myservo.detach(); //отключаемся от сервы
delay(10); //задержка0,001 секунда
digitalWrite(secpower_out, HIGH); //включаем фары итд
}
else {
digitalWrite(secpower_out, LOW); //выключаем фары
digitalWrite(engine_out, LOW); //выключаем зажигание
}
}
else {
digitalWrite(secpower_out, LOW); //выключаем фары итд
delay(1000);
digitalWrite(pech, LOW); //выключаем печку
delay(1000);
digitalWrite(ledPin, LOW); //выключаем светодиод индикации режима включения автоподсоса
delay(1000);
digitalWrite(engine_out, LOW); //выключаем зажигание
}
}
а енто уже готовый скетч того о чем вы долго думали, еще и с запуском по телефону
Re: БК для карбюраторного ВАЗ-2109 на Arduino Duemilanove
gav707090
Какой тип температурного датчика используется в данном скетче?
Или где посмотреть оригинальную статью?