Помогите с кодом
- Войдите на сайт для отправки комментариев
Пытаюсь собрать кнопку запуска двигателя на arduino, помогите накидать програмку что бы было от чего отталкиватся а то слишком сложно для меня.
Алгоритм такой:
Имеется кнопка при нажатии которой поочередно включаются 3 реле, с интервалом 250 миллисекунд.
Тоесть, нажал и отпустил кнопку - включилось первое реле АСС, интервал в 250 миллисекунд, включилось второе реле Ignition, опять интервал, отключилось первое реле АСС, включилось последнее реле Start которое остается включенным пока не погаснет индикатор зарядки. когда индикатор зарядки погаснет, отключается реле Start и остаются включенными реле ACC и Ignition. на этом месте программа ожидает следующего нажатия кнопки которое отключит сначала реле Ignition и сразу же реле ACC, то есть отключается двигатель.
Кроме этого, при выключенном двигателе, при нажатии и удерживании кнопки на пол секунды включается только реле ACC, а при удерживании кнопки в течении секунды реле ACC и Ignition.
Вот такая вот задача, для меня она непосильна пока, помогите пожалуйста!
кто нибудь?
хоть в общих чертах набросайте
Прежде всего формализуйте поставленную перед собой задачу - пока что она у вас уж очень описательная (постановка).
Давайте начнем с реле ACC.
Итак, реле ACC включается, если:
- отпущена кнопка But1 (дадим кнопке имя, чтобы от него в последующем образовывать имена связанных с этой кнопкой переменных)
- двигатель работает и кнопка But1 (или другая?) удерживается нажатой в течение не менее 0,5 сек
Реле ACC выключается, если:
- при отпущенной кнопке But1 после включения реле ACC прошел интервал времени в 250 миллисекунд плюс еще один интервал времени (тоже 250 мс?)
Составив далеко не полный список реакций, присутствующих в вашем описании, я уже наталкиваюсь на неясности.
Вот тут мне неясно:
отключается реле Start и остаются включенными реле ACC и Ignition.
Как реле ACC может оставаться включенным, если оно за некоторое время до этого выключилось?
Также неясно
1) нажал и отпустил кнопку
2) при выключенном двигателе, при нажатии и удерживании кнопки на
3) программа ожидает следующего нажатия кнопки
Событие (1) - это любое нажатие кнопки? Или нажатие кнопки при выключенном двигателе?
Как вы собираетесь отличать события (1) и (2)? По длительности нажатия кнопки?
Что вы подразумеваете под "следующим нажатием кнопки" в (3)?
Составленные мной списки реакций для реле ACC неполные - есть нечеткость в текущих определениях, которую необходимо устранить.
Попробуйте дополнить мой список реакций для реле ACC - в процессе добавления новых условий у вас сформируется более четкое представление о задаче, о тех событиях и реакциях на них, которые должны быть автоматизированы, а это поможет на дальнейших этапах формализации, а затем и перекладывания списков реакций в коды.
Вы хотите сделать как на новых машинах, заводить/глушить двигатель с кнопкой? - Keyless Start Button.
Если да то какая марка машины и год выпуска?
step962 - Как я понял он хочет сделать - Keyless Start Button. Работает это так:
1. нажимаешь кнопку и отпускаешь - включается зажигание, и крутит стартер до тех пор пока заводитса или мксимум 8 сек.
2,нажимаешь кнопку еще раз и мотор глохнет.
3,АСС включается когда открываеш машину и конечно когда работает двигатель.
3, АСС выключается когда закрываешь машину, или после 20 мин как двигатель выключен и машина не закрыта.
Keyless Start Button.
Смею заметить что Keyless и Start Button две разных ягоды одного пирога. У blink977 описывается только Start Button, и от сюда вопрос Keyless-то есть работу с ключем (штатный ИММО), нужно тоже организовать, и до кучи электро открывание рулевой колонки.
п.с Я с такими вопросами долго мучался пока не купил лендровер, задача упрастилась в разы так как кнопка есть и замок руля электро, осталось собрать только небольшую схему управления.
Keyless Start Button.
Смею заметить что Keyless и Start Button две разных ягоды одного пирога. У blink977 описывается только Start Button, и от сюда вопрос Keyless-то есть работу с ключем (штатный ИММО), нужно тоже организовать, и до кучи электро открывание рулевой колонки.
п.с Я с такими вопросами долго мучался пока не купил лендровер, задача упрастилась в разы так как кнопка есть и замок руля электро, осталось собрать только небольшую схему управления.
замок рулевой колонки снимаем :), оригинальный ключ прячем в панели если есть Мобилайзер...:) закрываем и открываем с пультом сигнализации.. a дверные ручки вырезаем и завариваем отверстие чтобы круче выглядело..:) в детстве тоже такую фигню делал на свой гольф.
Спасибо за отзыв!
Да, я хочу сделать 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, последующее нажатие - отключит его.
Это была прогамма запуска двигателя, но допустим мне надо просто включить зажигание не заводя двигатель. По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд, включится только реле IGNITION, последующее нажатие - отключит его.
По этому, при выключенном двигателе, нажав и удерживая кнопку But1 500 миллисекунд, включится только реле IGNITION ?
а если ты откроешь машину, и захочешь включить магнитофон?:)
ACC должно включаться как только открываешь машину и работать до того как заведешь двигатель, нo максимум 20 минут.
в BMW магнитофон работает всегда, даже если ключи не в замке зажигания :)
но, можно сделать и так: при удерживании кнопки пол секунды включится только ACC, а при удерживании на секунду добавится IGNITION.
Не жмем и держим пока двигатель не заведется, а просто жмем и сразу отпускаем.
По этому, при выключенном двигателе, нажав и удерживая кнопку 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) вроде бы описана, но ведь будут и другие.
Не жмем и держим пока двигатель не заведется, а просто жмем и сразу отпускаем.
По этому, при выключенном двигателе, нажав и удерживая кнопку 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.
код то набросаете? :)
в BMW магнитофон работает всегда, даже если ключи не в замке зажигания :)
но тогда нужно всегда выключать и включать магнитофон отдельно..
Это заготовка для основного цикла программы. В крнце концов получится раз в 5-10-... больше.
В первом блоке - отслеживаем нажатие/отпускание кнопки. При нажатии запоминаем время нажатия, при отпускании - запоминаем время отпускания и вычислив время удержания кнопки нажатой, решаем, что же это было - кратковременное нажатие, полусекундное или секундное. Получив ответ на этот вопрос, на основании его и дополнительных условий определяем, какая комаандная последовательность должна быть выполнена. Присваиваем номер последовательности переменной commandVar.
Дальше, опираясь на commandVar и But1_released, определяем, какой шаг какой командной последовательности должен быть исполнен - и исполняем его.
Недостающее можете дополнять сами. Для большей читабельности выносите отдельные большие блоки в функции так, чтобы в основном цикле оставались только вызовы этих функций - проще будет в будущем производить отладку.
Блок в окончательном состоянии будет выглядеть монструозным, но поскольку состоит из сплошных проверок/ветвлений, будет прокручиваться за миллисекунду-другую. Для вас же не принципиально, 250 мс будет исполняться первый шаг первой командной последовательности (запуск дв-ля) или за 251?
нет не принипиально, в конце концов вместо 250 мсек укажем 249 :) но блин, этот код я точно не потяну :(
давайте код до конца если можно :) и кстати, не забываем про индикацию! при выключенном ACC и IGNITION горит лампа Lock. при включенном ACC - горит светодиод ACC, при включенном IGNITION горит светодиод Ignition. Короче говоря светодиоды должны следовать за состояниями реле.
Я понимаю что код сложный, но может найдутся гуру кторые смогут справится с этим, буду премного благодарен :)
Разумеется мощные 30 амперные реле будут управлятся через оптопары.
но блин, этот код я точно не потяну :(
придется разобраться, попробуйте - это просто. Спрашивайте по шагам. Просто удаленно никто вам правильный код не напишет, нужно иметь под рукой ваши элементы для проверки многих вещей.
Просто удаленно никто вам правильный код не напишет, нужно иметь под рукой ваши элементы для проверки многих вещей.
Точно. Например мне никогда не узнать из своего далека, к каким выводам будут подключены сигнальные светодиоды. Так что давайте начнем - шаг за шагом.
Например, с определения констант.
Вот, например, у меня в скелетике кодика есть константы PRESSED и RELEASED. Как нетрудно догадаться из названий, одна из них соответствует нажатому состоянию кнопки, другая - отпущенному. Можно было бы, не мудрствуя лукаво, пользоваться константами LOW и HIGH, но, как справедливо заметил whoim, я не стою у вас за спиной и не знаю, каким образом вы подключаете кнопку к выводу микроконтроллера - через плюс или через массу.
Поэтому возможны два варианта:
#define PRESSED HIGH
#define RELEASED LOW
или
#define PRESSED LOW
#define RELEASED HIGH
Что в конечном итоге будет стоять в вашей (вашей!!!) программе, определяете только вы - на основании уже разработанной - ну, или имеющейся - схемы.
Определяйте.
Потом двинемся дальше.
ЗЫ: ну и сразу же определите константы ON и OFF (это тоже синонимы для LOW/HIGH)
нет не принипиально, в конце концов вместо 250 мсек укажем 249 :) но блин, этот код я точно не потяну :(
А вот указать вместо 250 мсек что-то иное не удастся - эти 249 (или 250, или 251) будут получаться от случая к случаю совершенно случайным образом.
В зависимости от того, в начале очередной миллисекунды произошло очередное событие или в конце, по какой ветви прошелся предыдущий цикл, и прочих подобных мало предсказуемых факторов.
НО.
Очередные шаги командной последовательности будут взаимно компенсировать эту погрешность и в итоге - какой бы длинной ни была последовательность отдельных шагов - к финишу мы придем все с той же погрешностью +/- 1 мсек.
Опробовал сегодня простую консрукцию для проверки кнопки, чтобы срабатывала по отпусканию. Работает)
Кнопка замыкается на массу?
Для кнопки, замыкаемой на + рискуем получить зависание программы.
Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!
Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!
Неужели трудностей испугались? ;)
Пока идет платка - вполне можно поднять уровень своих знаний в области управления оной.
Кнопка замыкается на массу?
Для кнопки, замыкаемой на + рискуем получить зависание программы.
да, на массу, я всегда так делаю. Но поправить не проблема)
Да не критики ради - а предупреждения копипастеров для.
вот нацарапал..:) я себе тоже поставлю на jetski..:) конечно нужно довести все до ума,.. но так код точно работающий..:)
Хорошо, тогда сделаем так: я заказал arduino uno, и она будет у меня через недельку. Как только приедет я сразу же отпишусь здесь и дружно начнем тыкать :) Спасибо всем!
Неужели трудностей испугались? ;)
Пока идет платка - вполне можно поднять уровень своих знаний в области управления оной.
это правильно. вот щас и буду разбиратся в коде, были бы комменты рядом, совсем хорошо бы было!
а как лучще кнопку ставить, на массу или +?
щас разбираюсь с кодом, переменные time и oldtime для чего?
это ты меня спрашиваешь?
а как лучще кнопку ставить, на массу или +?
Правильно - помнить, как подключена кнопка, и правильно интерпретировать уровень на пине, к которому она подключена.
Еще правильно - вместе с каждой кнопкой устанавливать подтягивающий резистор. В случае кнопки замыкаемой на массу, можно использовать внутренние подтягивающие резисторы мк (pinMode(But1pin,INPUT); digitalWrite(But1pin,HIGH);), но иметь при этом LOW при замыкании кнопки. Не мешает, но требуется ПОМНИТЬ. При альтернативном подключении кнопки (замыкание на +) резистор следует ставить физически. При этом уровень для замкнутой кнопки - HIGH.
Выбирайте, что нравится
еще вопрос: как подвести +12 вольт на gensigPin? там же 5 вольтовый вход.
через резистор?
да
насколько я понял в этом коде нету управления светодиодами?
можно объявить еще переменные:
int lockLed = pin8;
int accLed = pin9;
int ignitionLed = pin10;
pinMode(lockLed, OUTPUT);
pinMode(accLed, OUTPUT);
pinMode(ignitionLed, OUTPUT);
правильно? только как потом?
какими светодиодами?
я буду использовать кнопку от Nissan, у которой вокруг есть светодиоды Lock, ACC и Ignition, так вот при закрытии машины будет 20 минут гореть Lock, при включении реле ACC загорится светодиод ACC, а при включении реле Ignition включится светодиод Ignition. короче говоря, светодиоды должны следовать за состояниями реле.
а когда двигатель работает что горит?
p.s. в коде нет того што после выключение двигателя ACC еще работает 20 мин
когда двигатель работает, горит только Ignition.
после выключения двигателя должен 20 минут гореть только отдельный светодиод Lock, а не ACC.
тогда наверно как то так:
жду не дождусь проверить :)
но, что то я не могу нигде найти (lockLed, HIGH);
когда же он будет включен?
там неправильно, вот здесь лучше..:)
if((millis() - oldtime) > 8000) {
programState = 0;
8 секунд крутить стартер, если двигатель не заводится, не многовато?
if((millis() - oldtime) > 8000) {
programState = 0;
8 секунд крутить стартер, если двигатель не заводится, не многовато?
у меня на ауди так, она уже с завода с кнопкой, наверно столько нужно
также не вижу что бы после остановки стартера опять включался ACC
ну если после 8 секунд не заведется, так и так придиотся на ignition ставить и толкать :) ACC зря только аккумулятор будет разряжать в даном случае :)
еще вопрос: включившись стартер будет крутить мотор пока не пропадет +12 вольт на контакте gensigPin, так вот, допустим если на gensigPin вообще не поступит +12, стартер включится? если да, то лучше включить в код условие при котором, если на gensigPin не поступает +12 вольт, то кнопка совсем не активируется.
еще вопрос: включившись стартер будет крутить мотор пока не пропадет +12 вольт на контакте gensigPin, так вот, допустим если на gensigPin вообще не поступит +12, стартер включится? если да, то лучше включить в код условие при котором, если на gensigPin не поступает +12 вольт, то кнопка совсем не активируется.
gensig надо подключать напрямую к генератору(к третьему тонкому проводу) он дает 12 вольт когда двигатель работает.
Mastino jetski ого круто) только кнопка нисановская не водостойкая!
blink977 Кнопка внутри только контакты без всяких доп плат? Гже покупали, есть партнамбер кнопки?
Mastino jetski ого круто) только кнопка нисановская не водостойкая
там уже есть оригинальная водостойкая кнопка:)
http://www.ebay.com/itm/OEM-NISSAN-RED-PUSH-BUTTON-IGNITION-START-BUTTON-GT-R-R35-UNIVERSAL-/270893449421?pt=Motors_Car_Truck_Parts_Accessories&vxp=mtr&hash=item3f128200cd
партнамбер не знаю, но вот линк
А если не секрет, зачем нужна водостойкая кнопка? Она же в салон устанавливается. Или я что-то пропустил?
А если не секрет, зачем нужна водостойкая кнопка? Она же в салон устанавливается. Или я что-то пропустил?
blink977`у система запуска с помощью кнопки нужна для его BMW. А мне для jetski(водный мотоцикл).
приехала моя игрушка :) завтра заберу, и отпишусь!