Управление омывателем фар

alexey
Offline
Зарегистрирован: 25.09.2014

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

Принцип действия: Нажал кнопку подается питание на реле в течении N секунд. Удержание кнопки более 3х секунд вызывает меню программирования времени работы омывателя. 

После того как мы входим в это меню, нажимаем кнопку N раз. Одно нажатие равно одной секунде работы омывателя. Для подтверждения удерживаем кнопку 1,5 секунды. Индикатор моргает N раз в зависимости от нажатий. При условии, что минимальное время работы 2 секунды, а максимальное 15 секунд.

Для подтверждений нажимаем кнопку один раз, для повтора ввода два раза, для выхода из меню три раза. Для подтверждения действию удерживаем кнопку 1,5 секунды.

С кодом для проекта все понятно, вопросов нет.



#include <Bounce.h> #include <EEPROM.h> class HeadlightWasher { public: HeadlightWasher() { // Читаем из EEPROM настройки int delaySecondEE = (int) EEPROM.read(0); this->delaySecond = (delaySecondEE >= 2 and delaySecondEE <= 15) ? delaySecondEE : 5; // Вешаем обработчик на кнопку statusPump = new Bounce(this->buttonPin, 50); }; // Управляем включением индикатора в кнопке void statusLamp(bool logicalLevel = true, int delayLamp = 0) { digitalWrite(this->lampStatusPin, logicalLevel); if (delayLamp > 0) { delay(delayLamp); } }; // Моргаем индикатором в кнопке void statusLampBlink(int num, bool logicalLevel = false) { for (int i = num; i > 0; i--) { this->statusLamp(!logicalLevel, 280); this->statusLamp(logicalLevel, (i > 1) ? 280 : 0); } }; // Управление насосом void waterPumpOn() { digitalWrite(this->waterPumpPin, HIGH); this->statusLamp(); delay(this->delaySecond * 1000); digitalWrite(this->waterPumpPin, LOW); this->statusLamp(false); }; // Включение/Отключение режима программирования кнопки void setupPumpSwitch(bool onSetup = true) { this->setupMode = onSetup; this->statusLampBlink(3, !onSetup); this->statusLamp(onSetup); if (!onSetup) { this->statusMenu(); } } // Состояние кнопки int btnStatus(int duration) { bool statusUpdate = this->statusPump->update(); int statusClick = ((statusUpdate && !this->statusPump->read()) ? 1 : ((this->statusPump->read() && this->statusPump->duration() >= duration) ? 2 : 0)); if (!this->ignoreNextEvent) { this->ignoreNextEvent = (statusClick == 2)? true : false; return statusClick; } else { this->ignoreNextEvent = false; return 0; } }; // Состояние меню void statusMenu(int btnClick = 0, int level = 0, int ledBlink = 0) { this->setupLevel = level; this->settupCounterBtn = btnClick; if (ledBlink > 0) this->statusLampBlink(ledBlink, true); }; // Меню программирования кнопки void setupPump() { switch (this->btnStatus(1500)) { case 1: this->settupCounterBtn++; break; case 2: this->tmpSetupTime = this->settupCounterBtn; this->statusMenu(0, this->setupLevel+1, (this->settupCounterBtn < 2) ? 2 : ((this->settupCounterBtn > 15) ? 15 : this->settupCounterBtn)); break; } }; // Второй уровень меню void setupPumpLevelTwo() { switch (this->btnStatus(1500)) { case 1: this->settupCounterBtn++; break; case 2: switch (this->settupCounterBtn) { case 1: this->delaySecond = (this->tmpSetupTime < 2) ? 2 : ((this->tmpSetupTime > 15) ? 15 : this->tmpSetupTime); (!EEPROM.read(0)) ? EEPROM.write(0, this->delaySecond) : EEPROM.update(0, this->delaySecond); this->setupPumpSwitch(false); break; case 2: this->statusMenu(0, 0, 3); break; default: this->setupPumpSwitch(false); } break; } } // Основная функция обработки событий void body() { if (!this->setupMode) { switch (this->btnStatus(3000)) { case 1: this->waterPumpOn(); break; case 2: this->setupPumpSwitch(); break; } } else { switch (this->setupLevel) { case 1: this->setupPumpLevelTwo(); break; default: this->setupPump(); } } }; // Назначение пинов const int buttonPin = 2; // Пин кнопки const int waterPumpPin = 3; // Пин насоса const int lampStatusPin = 4; // Пин индикатора // Настройки программы int settupCounterBtn = 0; // Количество нажатий кнопки int setupLevel = 0; // Уровень меню int delaySecond; // Время работы насоса int tmpSetupTime = 0; // Программируемое время работы насоса bool setupMode = false; // Режим программирования кнопки bool ignoreNextEvent = false; // Игнорировать следующее событие Bounce *statusPump; // Обработчик событий }; // Создаем экземпляр класса HeadlightWasher *HW = new HeadlightWasher(); void setup() { // Выставляем логические уровни на пинах pinMode(HW->buttonPin, INPUT); digitalWrite(HW->buttonPin, LOW); pinMode(HW->waterPumpPin, OUTPUT); digitalWrite(HW->waterPumpPin, LOW); pinMode(HW->lampStatusPin, OUTPUT); digitalWrite(HW->lampStatusPin, LOW); } void loop() { HW->body(); }

Макет тоже собрал, но по нему есть вопросы.

Так как данная схема будет подключатся к сети автомобиля 12V, я использовал линейный стабилизатор L7805CV (+5В,1.5А)

Вопросы к вам:

1. На сколько оптимально решение использование линейного стабилизатора L7805CV?

2. Возможно ли заменить реле на MOSFET, если учесть то, что нужно управлять плюсом насоса.

3. Какие компоненты для защиты данного устройства нужно добавить? При условии, что среднее время работы 4 часа, максимальное 24 часа. Температурный режим от -40 до +60 градусов.

 

UPD: Добавил Ваш оптимизированный код в шапку. Yarik.Yar

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

alexey
Offline
Зарегистрирован: 25.09.2014

Тоже думал про P канальный, но небыло его в наличии. А по поводу защиты можешь чего посоветовать? И по стабилизатору хотелось бы услышать мнение на сколько это безопасно.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

uno заменить на про мини например. плату залить компаундом, например эпоксидкой, чтобы не было возможности возникновения конденсата, только вывести разъем программирования и питания, или кабель

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

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

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

мне просто интересно откуда такая проблема с омывателем фар?

alexey
Offline
Зарегистрирован: 25.09.2014

От индукции насоса например, знаю ставят диоды для этого. Но какой конкретно нужен диод, на сколько вольт и ампер я не знаю. Знаю только то, что на насос стоит предохранитель на 20 ампер.

alexey
Offline
Зарегистрирован: 25.09.2014

Спасибо за советы. Еще бы хотелось узнать нужен ли защитный диод перед питанием насоса. Если нужен то какой, я в них не очень понимаю. В качестве МК будет attiny13. Проблема с омывателем в том, что не устраивает штатное исполнение. Он срабатывает каждое пятое омывание вместе с обычной омывайкой лобового. Расход жидкости слишком большой получается. Многие его переделывают на кнопку, но они делают просто, сколько жмешь столько и льется. А я хочу, что бы нажал и она поливала N секунд.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

 

alexey
Offline
Зарегистрирован: 25.09.2014

Мне нравятся в ней габариты и dip-8 корпус. Ибо другой я не припаяю :( Мне кажется, это сама по себе задача несложная, по сути просто чтение одно ввода, и упровление двумя выводами. С кодом проблем нет, можно даже на асемблере попробовать написать, при необходимости. У меня больше проблем с железом, т.к схематехнику знаю плохо, и не хотелось бы спалить машину :D

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

jeka_tm пишет:

uno заменить на про мини например. плату залить компаундом, например эпоксидкой, чтобы не было возможности возникновения конденсата, только вывести разъем программирования и питания, или кабель

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

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

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

мне просто интересно откуда такая проблема с омывателем фар?

а зачем такие ужасы ?
новый блок - в салон ! чё ему там станется ?
проблема в комфорте , я так понял - сколько mSek лить на фары и с каким периодом Sek
( и чобы всё настраиваемое было )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

alexey пишет:

Мне нравятся в ней габариты и dip-8 корпус. Ибо другой я не припаяю :( Мне кажется, это сама по себе задача несложная, по сути просто чтение одно ввода, и упровление двумя выводами. С кодом проблем нет, можно даже на асемблере попробовать написать, при необходимости. У меня больше проблем с железом, т.к схематехнику знаю плохо, и не хотелось бы спалить машину :D

только программирование ( изменение кода после установки в авто - правильнее ) на 13-ой будет геморройнее , чем просто в ардуину влить...
авто - не спалите , если только насос омывателя..... и то - надо постараться...

alexey
Offline
Зарегистрирован: 25.09.2014

По сути мне его менять и не нужно, если только вылезут баги которых небыло в макете. На сколько мне известно attiny13 можно прошивать с помощью той же arduino uno. Единственное, что в ней мало памяти для программы. Но я думаю, с этой задачей она должна справится. Не знаю, как по поводу стабильности работы этого МК. На сколько мне известно вариантов Atmel чипов для arduino нет в корпусе dip 8?

alexey
Offline
Зарегистрирован: 25.09.2014

Можешь подсказать, возможно ли использовать в качестве p канального транзистора, биполярный транзистор? Вот такой или только полевой подойдет в моем случае?

alexey
Offline
Зарегистрирован: 25.09.2014

Как вообще с помощью arduino управлять P канальным транзистором? Если на N канальный для его открытия я подаю +5 В то на P канальный я должен подать -5 В? Если да то откуда взять отрицательное напряжение?

a5021
Offline
Зарегистрирован: 07.07.2013

Для открытия любого мосфета, напряжение на затворе должно отличаться от напряжения на истоке на величину большую, чем напряжения открытия. В случае N-канального мосфета, для которого обычная схема включения подразумевает подключение истока к земле, напряжение на затворе для полного открытия должно быть 5-10 вольт в зависимости от типа прибора. P-канальный мосфет обычно подключают истоком к плюсу питания и для его открытия нужны те же 5-10 вольт разницы, но уже относительно плюса и, соответственно, в сторону уменьшения. В принципе, если напряжение питания (напряжение на затворе) не превышает максимально допустимого напряжения затвор-исток (см. даташит), то для полного открытия канала, затвор можно тупо коммутировать на землю. Здесь только нужно помнить, что для полного закрытия P-канального мосфета потенциал на затворе нужно выравнивать с потенциалом на истоке, а это все тот же плюс питания.

m-zzz
Offline
Зарегистрирован: 30.05.2015

Много разного и хорошего написали тут.. Один только есть нюанс - ТЗ немножечко невыполнимо.

Ибо есть такая фраза в нем: 

Температурный режим от -40 до +60 градусов.

Кто из присутствующих мне покажет Дуню (оригинал или китай-клон, не важно) с заявленным производителем гарантированно рабочим диапазоном температур, соответствующим ТЗ)?

Только пожалуйста ссыль конкретную давайте на ДУНЮ. А заявления, что "у меня вот работает" я могу парировать тем, что сам тоже делал для машинок схемы на Дуне и работает все..

Только вот гарантии никакой нет, что оно будет работать гарантировано и безсбойно..

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

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

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

Извините за занудство... )))))))))))

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

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

Ну коротнула у вас проводка к мотору.. или в роторе межвитковое КЗ.. и все, что надо будет сделать потом, после устранения неисправности, это поменять предохранитель.. В самом суровом случае - выдернуть из колодки релюшку и ее тоже поменять, если ток был очень большим и контакты приварились , а блок электроники остается работоспособным..

m-zzz
Offline
Зарегистрирован: 30.05.2015

Что же до конкретных моделей, то та же atmega328p ни в каком другом варианте не выпускается вовсе.

Был неправ по поводу Меги, приношу глубочайшие извинения.

Хорошо бы, чтоб остальные деталюхи на плате тоже оказались с не меньшим диапазоном..

Но в целом согласен...

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

может тогда и нам не стоит?

Смотря как коротнула. Авто может сгореть целиком и там уже все равно, что конкретно сгорело в его составе.

Я ведь не зря про предохранители написал? Если установлен нормальный предохранитель, с номиналом, соответствующим схеме и проводке, то при превышении тока он просто сгорит.

А обсуждение китайских предохранителей и жучков из нарубленных гвоздей явно выходит за пределы здешней темы.

alexey
Offline
Зарегистрирован: 25.09.2014

Подскажите, через P канальный полевой транзистор пропускаю 12В. Соответственно для поддержки его в закрытом положении нужно подавать 8-12В в то время как мк может только 5В. Как быть?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

alexey пишет:

Подскажите, через P канальный полевой транзистор пропускаю 12В. Соответственно для поддержки его в закрытом положении нужно подавать 8-12В в то время как мк может только 5В. Как быть?

поставить еще один транзистор в управление полевиком.

alexey
Offline
Зарегистрирован: 25.09.2014

Можно подробнее, какой транзистор использовать и как подключать. Я что то не очень представляю.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

вот так

транзистор практически любой npn с двукратным запасом по току и напряжению.

alexey
Offline
Зарегистрирован: 25.09.2014

Спасибо, попробую! Можно использовать полевой транзистор n канальный? Или нужен биполярный? И какие номиналы сопротивлений нужно использовать в указанной схеме?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Можно и полевик. В данном случае не принципиально. Резюки верхний 1-5 кОм, нижний 10-50 кОм.

alexey
Offline
Зарегистрирован: 25.09.2014

Спасибо, все получилось!