Помогите с кодом

blink977
Offline
Зарегистрирован: 20.01.2012

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

 Алгоритм такой:

 Имеется кнопка при нажатии которой поочередно включаются 3 реле, с интервалом 250 миллисекунд.

 Тоесть, нажал и отпустил кнопку - включилось первое реле АСС, интервал в 250 миллисекунд, включилось второе реле Ignition, опять интервал, отключилось первое реле АСС, включилось последнее реле Start которое остается включенным пока не погаснет индикатор зарядки. когда индикатор зарядки погаснет, отключается реле Start и остаются включенными реле ACC и Ignition. на этом месте программа ожидает следующего нажатия кнопки которое отключит сначала реле Ignition и сразу же реле ACC, то есть отключается двигатель.

 Кроме этого, при выключенном двигателе, при нажатии и удерживании кнопки на пол секунды включается только реле ACC, а при удерживании кнопки в течении секунды реле ACC и Ignition.

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

blink977
Offline
Зарегистрирован: 20.01.2012

кто нибудь?

хоть в общих чертах набросайте

step962
Offline
Зарегистрирован: 23.05.2011

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

Давайте начнем с реле ACC.

 

Итак, реле ACC включается, если:

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

- двигатель работает и кнопка But1 (или другая?) удерживается нажатой в течение не менее 0,5 сек

Реле ACC выключается, если:
- при отпущенной кнопке But1 после включения реле ACC прошел интервал времени в 250 миллисекунд плюс еще один интервал времени (тоже 250 мс?)

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

Вот тут мне неясно:

отключается реле Start и остаются включенными реле ACC и Ignition.

Как реле ACC может оставаться включенным, если оно за некоторое время до этого выключилось?

 

Также неясно

1) нажал и отпустил кнопку

2) при выключенном двигателе, при нажатии и удерживании кнопки на

3) программа ожидает следующего нажатия кнопки

Событие (1) - это любое нажатие кнопки? Или нажатие кнопки при выключенном двигателе?

Как вы собираетесь отличать события (1) и (2)? По длительности нажатия кнопки?

Что вы подразумеваете под "следующим нажатием кнопки" в (3)?

 

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

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

 

Mastino
Offline
Зарегистрирован: 03.12.2011

Вы хотите сделать как на новых машинах, заводить/глушить двигатель с кнопкой? - Keyless Start Button.
Если да то какая марка машины и год выпуска?

Mastino
Offline
Зарегистрирован: 03.12.2011

step962 - Как я понял он хочет сделать - Keyless Start Button. Работает это так:
1. нажимаешь кнопку и отпускаешь - включается зажигание, и крутит стартер до тех пор пока заводитса или мксимум 8 сек.
2,нажимаешь кнопку еще раз и мотор глохнет.
3,АСС включается когда открываеш машину и конечно когда работает двигатель.
3, АСС выключается когда закрываешь машину, или после 20 мин как двигатель выключен и машина не закрыта.

Fuego
Offline
Зарегистрирован: 18.01.2012

 

Mastino пишет:

Keyless Start Button.

Смею заметить что Keyless и Start Button две разных ягоды одного пирога. У blink977 описывается только Start Button, и от сюда вопрос Keyless-то есть работу с ключем (штатный ИММО), нужно тоже организовать, и до кучи электро открывание рулевой колонки.

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

Mastino
Offline
Зарегистрирован: 03.12.2011

Fuego пишет:

 

Mastino пишет:

Keyless Start Button.

Смею заметить что Keyless и Start Button две разных ягоды одного пирога. У blink977 описывается только Start Button, и от сюда вопрос Keyless-то есть работу с ключем (штатный ИММО), нужно тоже организовать, и до кучи электро открывание рулевой колонки.

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

замок рулевой колонки снимаем :), оригинальный ключ прячем в панели если есть Мобилайзер...:) закрываем и открываем с пультом сигнализации.. a дверные ручки вырезаем и завариваем отверстие чтобы круче выглядело..:)  в детстве тоже такую фигню делал на свой гольф.

 

blink977
Offline
Зарегистрирован: 20.01.2012

Спасибо за отзыв!

Да, я хочу сделать engine start button как на новых машинах. У меня BMW E36 94 года, и я собираюсь совсем избавиться от ключа.

Для этого я разобрался с EWSII, сейчас осталось разобратся с ардуино, где у меня познаний - 0 :(

Постораюсь обрисовать задачу конкретно:

 У нас имеется: 1 кнопка (But1), 3 реле и +12 вольт с индикатора зарядки (для того что бы сказать ардуино когда прекратить крутить стартер или другими словами отключить реле START)

первое реле - ACC, включит цепь некоторых приборов

второе реле - IGNITION, включит зажигание

третье реле - START, заведет двигатель

Последовательность:

 Открываем машину, садимся, жмем кнопку (But1). Не жмем и держим пока двигатель не заведется, а просто жмем и сразу отпускаем.

при нажатии кнопки программа делает следующее:

1. включает реле ACC

2. интервал в 250 миллисекунд

3. включает реле IGNITION

4. интервал в 250 миллисекунд

5. отключает реле ACC (в реальных условиях также происходит, во время кручения двигателя происходят скачки напряжения, поэтому некоторые автомобильные приборы в этот момент отключаются размыканием цепи ACC, например магнитофон, дворники итд.)

6. включает реле START, здесь условие: ардуино должен считивать инфу с лампы зарядки, когда на лампе пропадет +12 вольт, то есть двигатель заведется, реле START должно отключится. Допустим двигатель не заводится и лампа зарядки постоянно горит, не будет же программа крутить стартер вечно? поэтому, если двигатель не завелся в течении 5 секунд, программа отключает все реле.

7. Опять включает реле ACC

8. Если двигатель успешно завелся, следующее нажатие кнопки But1 отключит все реле и при последующем нажатии начинает все с начала.

Это была прогамма запуска двигателя, но допустим мне надо просто включить зажигание не заводя двигатель. По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд, включится только реле IGNITION, последующее нажатие - отключит его.

 

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

 

Это была прогамма запуска двигателя, но допустим мне надо просто включить зажигание не заводя двигатель. По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд, включится только реле IGNITION, последующее нажатие - отключит его.

По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд, включится только реле IGNITION ?

а если ты откроешь машину, и захочешь включить магнитофон?:) 

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

blink977
Offline
Зарегистрирован: 20.01.2012

в BMW магнитофон работает всегда, даже если ключи не в замке зажигания :)

 

но, можно сделать и так: при удерживании кнопки пол секунды включится только ACC, а при удерживании на секунду добавится IGNITION.

step962
Offline
Зарегистрирован: 23.05.2011

  Не жмем и держим пока двигатель не заведется, а просто жмем и сразу отпускаем.
По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд

Так в любом случае не пойдет

- сколько времени реально будет продолжаться это "жмем и сразу отпускаем"?

- как вы будете удерживать кнопку ровно 500 миллисекунд?

Поэтому требуется что-то вроде:

<0,2 сек - то самое "короткое" нажатие

0,3...0,7 сек - "нажатие 0,5 сек"

от 0,9 (и до разумного предела, например, 2 сек) - "нажатие кнопки 1 сек"

Очень поможет здесь какая-либо индикация. Например, после завершения времени "короткого нажатия" загорается светодиод и горит все время, которое должно определяться как "нажатие 0,5 сек". Погас светодиод - начался вариант с проверкой "нажатие 1 сек"...

 

Либо перейти на кодирование:

одно нажатие,

два кратковременных нажатия

три кратковременных нажатия

а "кратковременность" определять, подсчитывая число нажатий кнопки в течение одной секунды (ну или другого интервала времени - определяется экспериментально)

После отработки одного из подобных вариантов определения длительности нажатия кнопки (или количества нажатий) вы должны будете сформировать значение переменной - ну, допустим, pressVariant (0 - вариант не определен или уже отработан, 1 - кратковременное нажатие, 2 - "0,5 сек", 3 - "1 сек" и т.д.) - используя которое, а также дополнительные условия (двигатель OFF/ON, напряжение в бортовой сети </> порогового, четное/нечетное нажатие на кнопку ...) уже можно будет определять, какую из командных последовательностей запускать. Первая из них (шаги 1-8) вроде бы описана, но ведь будут и другие.

 

blink977
Offline
Зарегистрирован: 20.01.2012

step962 пишет:

  Не жмем и держим пока двигатель не заведется, а просто жмем и сразу отпускаем.
По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд

Так в любом случае не пойдет

- сколько времени реально будет продолжаться это "жмем и сразу отпускаем"?

- как вы будете удерживать кнопку ровно 500 миллисекунд?

Поэтому требуется что-то вроде:

<0,2 сек - то самое "короткое" нажатие

0,3...0,7 сек - "нажатие 0,5 сек"

от 0,9 (и до разумного предела, например, 2 сек) - "нажатие кнопки 1 сек"

Очень поможет здесь какая-либо индикация. Например, после завершения времени "короткого нажатия" загорается светодиод и горит все время, которое должно определяться как "нажатие 0,5 сек". Погас светодиод - начался вариант с проверкой "нажатие 1 сек"...

 

Либо перейти на кодирование:

одно нажатие,

два кратковременных нажатия

три кратковременных нажатия

а "кратковременность" определять, подсчитывая число нажатий кнопки в течение одной секунды (ну или другого интервала времени - определяется экспериментально)

После отработки одного из подобных вариантов определения длительности нажатия кнопки (или количества нажатий) вы должны будете сформировать значение переменной - ну, допустим, pressVariant (0 - вариант не определен или уже отработан, 1 - кратковременное нажатие, 2 - "0,5 сек", 3 - "1 сек" и т.д.) - используя которое, а также дополнительные условия (двигатель OFF/ON, напряжение в бортовой сети </> порогового, четное/нечетное нажатие на кнопку ...) уже можно будет определять, какую из командных последовательностей запускать. Первая из них (шаги 1-8) вроде бы описана, но ведь будут и другие.

 

 

тогда так:

удерживание кнопки от 0 до 500 миллисекунд - двигатель заведется

от 500 до 1000 миллисекунд - включится ACC

удерживаем кнопку и после 1500 миллисекунд  включится IGNITION

что касается индикации, то я собираюсь использовать кнопку от Nissan, на ней уже имеются подсвеченные надписи: Lock, ACC и Ignition.

 

код то набросаете? :)

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

в BMW магнитофон работает всегда, даже если ключи не в замке зажигания :)

 

 

но тогда нужно всегда выключать и включать магнитофон отдельно..

step962
Offline
Зарегистрирован: 23.05.2011

 

loop() {
// блок определения длительности нажатия кнопки
  But1_state = digitalRead(But1pin); // считываем текущее состояние кнопки
  if(But1_state != But1_oldstate) { // кнопку либо нажали, либо отпустили
    But1_oldstate=But1_state;
    if(But1_state==PRESSED) But1_tpressed=millis(); // запоминаем время нажатия кнопки
    if(But1_state==RELEASED) {
      But1_released=millis(); // запоминаем время отпускания кнопки
      if(But1_released-But1_pressed<200) { // кратковременное нажатие кнопки
      // отсюда в зависимости от доп условий будем уходить на командные последовательности короткого нажатия
      }
      if(But1_released-But1_pressed>300 && But1_released-But1_pressed<700) { // нажатие кнопки 0,5 сек
      // отсюда в зависимости от доп условий будем уходить на командные последовательности "нажатия 0,5 сек"
      }
      if(But1_released-But1_pressed>900) { // нажатие кнопки 1 сек
      // отсюда в зависимости от доп условий будем уходить на командные последовательности "нажатия 1 сек"
      }
    }
  }
// блок выполнения командных последовательностей
if(commandVar==1) { // запуск двигателя
  if(millis()-But1_released<250) { // находимся на первом шаге 
    digitalWrite(ACC_pin,ON);
    digitalWrite(IGN_pin,OFF);
    digitalWrite(START_pin,OFF);
  }
  else if(millis()-But1_released<500) { // находимся на втором шаге 
    digitalWrite(ACC_pin,ON);
    digitalWrite(IGN_pin,ON);
    digitalWrite(START_pin,OFF);
  }
// ну и так далее - остальные шаги
}
else if(commandVar==2) { // какая там у вас следующая командная последовательность
} }

 Это заготовка для основного цикла программы. В крнце концов получится раз в 5-10-... больше.

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

Дальше, опираясь на commandVar и But1_released, определяем, какой шаг какой командной последовательности должен быть исполнен - и исполняем его.

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

 

step962
Offline
Зарегистрирован: 23.05.2011

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

blink977
Offline
Зарегистрирован: 20.01.2012

нет не принипиально, в конце концов вместо 250 мсек укажем 249 :) но блин, этот код я точно не потяну :(

давайте код до конца если можно :)  и  кстати, не забываем про индикацию! при выключенном ACC и IGNITION горит лампа Lock. при включенном ACC - горит светодиод ACC, при включенном IGNITION горит светодиод Ignition. Короче говоря светодиоды должны следовать за состояниями реле.

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

Разумеется мощные 30 амперные реле будут управлятся через оптопары.

whoim
Offline
Зарегистрирован: 03.11.2011

 но блин, этот код я точно не потяну :(

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

step962
Offline
Зарегистрирован: 23.05.2011

whoim пишет:

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

 

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

Например, с определения констант.

Вот, например, у меня в скелетике кодика есть константы PRESSED и RELEASED. Как нетрудно догадаться из названий, одна из них соответствует нажатому состоянию кнопки, другая - отпущенному. Можно было бы, не мудрствуя лукаво, пользоваться константами LOW и HIGH, но, как справедливо заметил whoim, я не стою у вас за спиной и не знаю, каким образом вы подключаете кнопку к выводу микроконтроллера - через плюс или через массу.

Поэтому возможны два варианта:

 

#define PRESSED HIGH

 

#define RELEASED LOW

или

#define PRESSED LOW

#define RELEASED HIGH

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

Определяйте.

Потом двинемся дальше.
 

ЗЫ: ну и сразу же определите константы ON и OFF (это тоже синонимы для LOW/HIGH)

 

step962
Offline
Зарегистрирован: 23.05.2011

blink977 пишет:

нет не принипиально, в конце концов вместо 250 мсек укажем 249 :) но блин, этот код я точно не потяну :(

А вот указать вместо 250 мсек что-то иное не удастся - эти 249 (или 250, или 251) будут получаться от случая к случаю совершенно случайным образом.

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

НО.

Очередные шаги командной последовательности будут взаимно компенсировать эту погрешность и в итоге - какой бы длинной ни была последовательность отдельных шагов - к финишу мы придем все с той же погрешностью +/- 1 мсек.

whoim
Offline
Зарегистрирован: 03.11.2011

 Опробовал сегодня простую консрукцию для проверки кнопки, чтобы срабатывала по отпусканию. Работает)

if(digitalRead(btnPin) == LOW) {
   while(digitalRead(btnPin) == LOW)
      delay(1);
/тут код
}

 

step962
Offline
Зарегистрирован: 23.05.2011

 Кнопка замыкается на массу?

Для кнопки, замыкаемой на + рискуем получить зависание программы.

blink977
Offline
Зарегистрирован: 20.01.2012

Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!

step962
Offline
Зарегистрирован: 23.05.2011

blink977 пишет:

Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!

Неужели трудностей испугались? ;)

Пока идет платка - вполне можно поднять уровень своих знаний в области управления оной.

whoim
Offline
Зарегистрирован: 03.11.2011

step962 пишет:

 Кнопка замыкается на массу?

Для кнопки, замыкаемой на + рискуем получить зависание программы.

да, на массу, я всегда так делаю. Но поправить не проблема)

step962
Offline
Зарегистрирован: 23.05.2011

 Да не критики ради - а предупреждения копипастеров для.

Mastino
Offline
Зарегистрирован: 03.12.2011

вот нацарапал..:) я себе тоже поставлю на jetski..:) конечно нужно довести все до ума,.. но так код точно работающий..:)


const int starbutton = 2;    
const int gensigPin = 3;    
const int ACCPin = 5;
const int ignitionPin = 6;
const int starterPin = 7;
long time = 0;
long oldtime = 0;
int buttonState = 0; 
int engineState = 0;
int programState = 0;

void setup() {
  pinMode(gensigPin, INPUT);
  pinMode(starbutton, INPUT);
  pinMode(ACCPin, OUTPUT);
  pinMode(ignitionPin, OUTPUT);
  pinMode(starterPin, OUTPUT);
}


void loop() {
if(programState == 0) {
alloff();
}

if(programState == 1) {
motoron();
}

if(programState == 2) {
acc();
}

if(programState == 3) {
ignition();
}
engineState = digitalRead(gensigPin);
buttonState = digitalRead(starbutton);
if (buttonState == HIGH) {
 time++;
 delay(1);
}
if (buttonState == LOW) {
pinguintime();
}
}

void pinguintime()
{
  if (programState == 1 || programState == 2 || programState == 3) {
  if(time >= 5) {
  programState = 0;
  time = 0;
}
}
  if (programState == 0) {
  if(time >= 5 && time <= 400) {
  oldtime = millis();
  programState = 1;
  time = 0;
}
}

  if(time >= 401 && time <= 900) {
  programState = 2;
  time = 0;
}

  if(time >= 901) {
  programState = 3;
  time = 0;
}
}


void motoron()
{ 
digitalWrite(ignitionPin, HIGH);
if(engineState == LOW) {
digitalWrite(starterPin, HIGH);
if((millis() - oldtime) > 8000) {
programState = 0;
}
}
else 
{
digitalWrite(starterPin, LOW);
digitalWrite(ACCPin, HIGH); 
}
 
  
  
}
  
void acc()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW);
}
void ignition()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, HIGH);
digitalWrite(starterPin, LOW); 
}
void starter()
{
digitalWrite(ACCPin, LOW); 
digitalWrite(ignitionPin, HIGH);
digitalWrite(starterPin, HIGH); 
}
void alloff()
{
digitalWrite(ACCPin, LOW); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW); 
}



blink977
Offline
Зарегистрирован: 20.01.2012

step962 пишет:

blink977 пишет:

Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!

Неужели трудностей испугались? ;)

Пока идет платка - вполне можно поднять уровень своих знаний в области управления оной.

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

а как лучще кнопку ставить, на массу или +?

щас разбираюсь с кодом, переменные time и oldtime для чего?

Mastino
Offline
Зарегистрирован: 03.12.2011

это ты меня спрашиваешь?

step962
Offline
Зарегистрирован: 23.05.2011

blink977 пишет:

а как лучще кнопку ставить, на массу или +?

Правильно - помнить, как подключена кнопка, и правильно интерпретировать уровень на пине, к которому она подключена.

Еще правильно - вместе с каждой кнопкой устанавливать подтягивающий резистор. В случае кнопки замыкаемой на массу, можно использовать внутренние подтягивающие резисторы мк (pinMode(But1pin,INPUT); digitalWrite(But1pin,HIGH);), но иметь при этом LOW при замыкании кнопки. Не мешает, но требуется ПОМНИТЬ. При альтернативном подключении кнопки (замыкание на +) резистор следует ставить физически. При этом уровень для замкнутой кнопки - HIGH.

Выбирайте, что нравится

blink977
Offline
Зарегистрирован: 20.01.2012

еще вопрос: как подвести +12 вольт на gensigPin? там же 5 вольтовый вход.

через резистор?

Mastino
Offline
Зарегистрирован: 03.12.2011

да

blink977
Offline
Зарегистрирован: 20.01.2012

насколько я понял в этом коде нету управления светодиодами?

можно объявить еще переменные:

int lockLed = pin8;

int accLed = pin9;

int ignitionLed = pin10;

 

pinMode(lockLed, OUTPUT);

pinMode(accLed, OUTPUT);

pinMode(ignitionLed, OUTPUT);

правильно? только как потом?

Mastino
Offline
Зарегистрирован: 03.12.2011

какими светодиодами?
 

blink977
Offline
Зарегистрирован: 20.01.2012

я буду использовать кнопку от Nissan, у которой вокруг есть светодиоды Lock, ACC и Ignition, так вот при закрытии машины будет 20 минут гореть Lock, при включении реле ACC загорится светодиод ACC, а при включении реле Ignition включится светодиод Ignition. короче говоря, светодиоды должны следовать за состояниями реле.

Mastino
Offline
Зарегистрирован: 03.12.2011

а когда двигатель работает что горит?

p.s. в коде нет того што после выключение двигателя ACC еще работает 20 мин

blink977
Offline
Зарегистрирован: 20.01.2012

когда двигатель работает, горит только Ignition.

после выключения двигателя должен 20 минут гореть только отдельный светодиод Lock, а не ACC.

Mastino
Offline
Зарегистрирован: 03.12.2011

тогда наверно как то так:

const int starbutton = 2;    
const int gensigPin = 3;    
const int ACCPin = 5;
const int ignitionPin = 6;
const int starterPin = 7;
const int lockLed = 8;
const int accLed = 9;
const int ignitionLed = 10;
long time = 0;
long oldtime = 0;
int buttonState = 0; 
int engineState = 0;
int programState = 0;
int acctime = 0;

void setup() {
  pinMode(gensigPin, INPUT);
  pinMode(starbutton, INPUT);
  pinMode(ACCPin, OUTPUT);
  pinMode(ignitionPin, OUTPUT);
  pinMode(starterPin, OUTPUT);
  pinMode(lockLed, OUTPUT);
  pinMode(accLed, OUTPUT);
  pinMode(ignitionLed, OUTPUT);
}


void loop() {
if(programState == 0) {
alloff();
if((millis() - acctime) > 20000) {
digitalWrite(accLed, LOW);
} 
}

if(programState == 1) {
motoron();
digitalWrite(ignitionLed, HIGH);
digitalWrite(accLed, LOW);
digitalWrite(lockLed, LOW);
}

if(programState == 2) {
acc();
digitalWrite(ignitionLed, LOW);
digitalWrite(accLed, HIGH);
digitalWrite(lockLed, LOW);
}

if(programState == 3) {
ignition();
digitalWrite(ignitionLed, HIGH);
digitalWrite(accLed, LOW);
digitalWrite(lockLed, LOW);
}
engineState = digitalRead(gensigPin);
buttonState = digitalRead(starbutton);
if (buttonState == HIGH) {
 time++;
 delay(1);
}
if (buttonState == LOW) {
pinguintime();
}
}

void pinguintime()
{
  if (programState == 1 || programState == 2 || programState == 3) {
  if(time >= 5) {
  acctime = millis();
  digitalWrite(accLed, HIGH);
  programState = 0;
  time = 0;
}
}
  if (programState == 0) {
  if(time >= 5 && time <= 400) {
  oldtime = millis();
  programState = 1;
  time = 0;
}
}

  if(time >= 401 && time <= 900) {
  programState = 2;
  time = 0;
}

  if(time >= 901) {
  programState = 3;
  time = 0;
}
}


void motoron()
{ 
digitalWrite(ignitionPin, HIGH);
if(engineState == LOW) {
digitalWrite(starterPin, HIGH);
if((millis() - oldtime) > 8000) {
programState = 0;
}
}
else 
{
digitalWrite(starterPin, LOW);
digitalWrite(ACCPin, HIGH); 
}
 
  
  
}
  
void acc()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW);
}
void ignition()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, HIGH);
digitalWrite(starterPin, LOW); 
}
void alloff()
{
digitalWrite(ACCPin, LOW); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW); 
}



 

blink977
Offline
Зарегистрирован: 20.01.2012

жду не дождусь проверить :)

но, что то я не могу нигде найти (lockLed, HIGH);

когда же он будет включен?

Mastino
Offline
Зарегистрирован: 03.12.2011

там неправильно, вот здесь лучше..:)

const int starbutton = 2;    
const int gensigPin = 3;    
const int ACCPin = 5;
const int ignitionPin = 6;
const int starterPin = 7;
const int lockLed = 8;
const int accLed = 9;
const int ignitionLed = 10;
long time = 0;
long oldtime = 0;
int buttonState = 0; 
int engineState = 0;
int programState = 0;
int acctime = 0;

void setup() {
  pinMode(gensigPin, INPUT);
  pinMode(starbutton, INPUT);
  pinMode(ACCPin, OUTPUT);
  pinMode(ignitionPin, OUTPUT);
  pinMode(starterPin, OUTPUT);
  pinMode(lockLed, OUTPUT);
  pinMode(accLed, OUTPUT);
  pinMode(ignitionLed, OUTPUT);
}


void loop() {
if(programState == 0) {
alloff();
if((millis() - acctime) > 20000) {
digitalWrite(lockLed, LOW);
} 
digitalWrite(ignitionLed, LOW);
digitalWrite(accLed, LOW);
}

if(programState == 1) {
motoron();
digitalWrite(ignitionLed, HIGH);
digitalWrite(accLed, LOW);
digitalWrite(lockLed, LOW);
}

if(programState == 2) {
acc();
digitalWrite(ignitionLed, LOW);
digitalWrite(accLed, HIGH);
digitalWrite(lockLed, LOW);
}

if(programState == 3) {
ignition();
digitalWrite(ignitionLed, HIGH);
digitalWrite(accLed, LOW);
digitalWrite(lockLed, LOW);
}
engineState = digitalRead(gensigPin);
buttonState = digitalRead(starbutton);
if (buttonState == HIGH) {
 time++;
 delay(1);
}
if (buttonState == LOW) {
pinguintime();
}
}

void pinguintime()
{
  if (programState == 1 || programState == 2 || programState == 3) {
  if(time >= 5) {
  acctime = millis();
  digitalWrite(lockLed, HIGH);
  programState = 0;
  time = 0;
}
}
  if (programState == 0) {
  if(time >= 5 && time <= 400) {
  oldtime = millis();
  programState = 1;
  time = 0;
}
}

  if(time >= 401 && time <= 900) {
  programState = 2;
  time = 0;
}

  if(time >= 901) {
  programState = 3;
  time = 0;
}
}


void motoron()
{ 
digitalWrite(ignitionPin, HIGH);
if(engineState == LOW) {
digitalWrite(starterPin, HIGH);
if((millis() - oldtime) > 8000) {
programState = 0;
}
}
else 
{
digitalWrite(starterPin, LOW);
digitalWrite(ACCPin, HIGH); 
}
 
  
  
}
  
void acc()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW);
}
void ignition()
{
digitalWrite(ACCPin, HIGH); 
digitalWrite(ignitionPin, HIGH);
digitalWrite(starterPin, LOW); 
}
void alloff()
{
digitalWrite(ACCPin, LOW); 
digitalWrite(ignitionPin, LOW);
digitalWrite(starterPin, LOW); 
}



 

blink977
Offline
Зарегистрирован: 20.01.2012

if((millis() - oldtime) > 8000) {
programState = 0;

8 секунд крутить стартер, если двигатель не заводится, не многовато?

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

if((millis() - oldtime) > 8000) {
programState = 0;

8 секунд крутить стартер, если двигатель не заводится, не многовато?

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

blink977
Offline
Зарегистрирован: 20.01.2012

также не вижу что бы после остановки стартера опять включался ACC

Mastino
Offline
Зарегистрирован: 03.12.2011

ну если после 8 секунд не заведется, так и так придиотся на ignition ставить и толкать :) ACC зря только аккумулятор будет разряжать в даном случае :)

blink977
Offline
Зарегистрирован: 20.01.2012

еще вопрос: включившись стартер будет крутить мотор пока не пропадет +12 вольт на контакте gensigPin, так вот, допустим если на gensigPin вообще не поступит +12, стартер включится? если да, то лучше включить в код условие при котором, если на gensigPin не поступает +12 вольт, то кнопка совсем не активируется.

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

еще вопрос: включившись стартер будет крутить мотор пока не пропадет +12 вольт на контакте gensigPin, так вот, допустим если на gensigPin вообще не поступит +12, стартер включится? если да, то лучше включить в код условие при котором, если на gensigPin не поступает +12 вольт, то кнопка совсем не активируется.

gensig надо подключать напрямую к генератору(к третьему тонкому проводу) он дает 12 вольт когда двигатель работает.

Fuego
Offline
Зарегистрирован: 18.01.2012

  Mastino jetski  ого круто) только кнопка нисановская не водостойкая!

  blink977  Кнопка внутри только контакты без всяких доп плат? Гже покупали, есть партнамбер кнопки? 

Mastino
Offline
Зарегистрирован: 03.12.2011

Fuego пишет:

  Mastino jetski  ого круто) только кнопка нисановская не водостойкая

 

там уже есть оригинальная водостойкая кнопка:)

blink977
Offline
Зарегистрирован: 20.01.2012
Lavochkin
Offline
Зарегистрирован: 19.12.2011

 А если не секрет, зачем нужна водостойкая кнопка? Она же в салон устанавливается. Или я что-то пропустил?

Mastino
Offline
Зарегистрирован: 03.12.2011

Lavochkin пишет:

 А если не секрет, зачем нужна водостойкая кнопка? Она же в салон устанавливается. Или я что-то пропустил?

blink977`у система запуска с помощью кнопки нужна для его BMW. А мне для jetski(водный мотоцикл).

blink977
Offline
Зарегистрирован: 20.01.2012

приехала моя игрушка :) завтра заберу, и отпишусь!