Профессура помогите!
- Войдите на сайт для отправки комментариев
Уважаемые форумчане, требуется ваша не бескорыстная помощь в создании скетча.
суть вопроса : многим известна сложность запуска карбюраторного двигателя в морозный день, да и не очень приятно находиться в непрогретом авто, а уж тем более корректировать плавающие обороты ручкой подсоса которая постоянно заедает. вот так и родилась идея о создании данного девайса.
за основу решено было взять имеющийся ардуино уно . пересмотрев массу инфы о подобных наработках, а они как не странно все на шаговиках, я решил отойти от сложившихся традиций и вместо привода использовать сервопривод(поскольку и он имеется в наличии).
теперь о принципе работы. за отправную точку примем : температуру охлаждающей жидкости.
при включении зажигания подается питание на всю схему. первым делом проверяем температуру и если она ниже 80 С то, прикрываем заслонку пропорционально температуре в этом поможет серва механически связанная с заслонкой, чем ниже температура тем боьше заслонка прикрывается, при 80 открывается полностью. за условную отчетную точку температуры решено принять -20С. так при -20 и ниже заслонка полностью закрыта. хотя это условие можно реализовать програмно и корректируемо. датчик температуры решил использовать штатный. подключение простое : у датчика всего один провод(+) корпус на минусе. подключать буду через резистивный делитель 47к в землю, 100к к плюсу датчика, средняя точка на 0 аналоговый вход.
после того как заслонка выставлена запускается проверка оборотов. ее решил сделать на внешнем прерывании по фронтам импульса используя (0 ) прирывание то есть 2 цифровой вход. считать будем импульсы от коммутатора зажигания ,( на 4 тактных 4 горшковых двигателях : 2имп= 1 оборот) на ваз 2109 это 6 контакт. можно и от бобины низковольтный контакт. подключаем аналогично датчику температуры. так вот. как только двигатель запущен, считаются обороты и посредством той же сервы приводятся в уровень 1500об/мин. для этой цели будет логичным использовать ПИД-регулятор.
серва будет подключена к 9 шим пину. так же нужна индикация: 8 шим пин будет светодиодом, который будет включаться как только заслонка примет некое положение отличное от "полностью открытая" и обратно, гаснуль при переводе заслонки в "открыта".
следующий этап залючается в том чтобы подать +5 вольт на 10 шим пин при наборе температуры в районе 65С . это позволит включить печку. но данная функция должна включаться только после того как данная температура набрана в прцессе прогрева, а не тогда когда производится повторный запуск прогретого двигателя. как это правильнее осуществить пока не знаю, но думаю что 3 минутный таймер сможет помочь. если с момента запуска до достижения 65С прошло 3 мин и более-включаем, если не прошло _то нет. все просто. или как то иначе.
управляемый прогрев необходимо продолжать вплоть до достижения температуры 90С. как только данная температура набрана, серва полностью открывает заслонку и отключается. но +5 с 10 пина не снимается еще 5 минут. по истечении 5 промежутка времени все отключается и переходит в сон.
Как говорилось выше, помощь не бескорыстна. проект для личного использования, при необходимости схема и готовый скетч будут выложены здесь же открыто. все текущие коррекции скетча , преобразования температур в напряжение и пр. беру на себя. жду ответа здесь или по почте. gav707090@yandex.ru
не очень приятно находиться в непрогретом авто
поставьте предподогреватель Webasto или Eberspacher, тогда в машине будет уже тепло когда вы только сядите.
корректировать плавающие обороты ручкой подсоса которая постоянно заедает
а не легче поставить карбюратор с автоматическим подсосом?
Ну раз тут флудят. То и я пофлужу. Писать не мешки ворочать. В логике ошибки.
1. Ниже 0 градусов надо запустить "предпусковой подогреватель" и довести до +4 градуса охлаждающую жидкость. Например вебасто в Швеции.
2. Купить готовую "електронику кнопку старта" заводского изготовления, как я понимаю в вашем случае для карбюраторного двигателя. Например в Китае.
3. А вот кнопку можно уже поразвлекатся ардуинкой понажимать. Например если не хотим купить заводского изготовления сигнализацию с дистанционным пуском. Например в Москве.
4.Все узлы полные автоматы. Работают максимально независимо. Сами принимают решения по температурам, аккумуляторм, оборотам. Отстутствие одного из узлов не влиет на ручной запуск в целом.
5.Про подсос. Изучаем мат часть карбюраторного двигателя с подсосом. На сколько вытягивается при
5.1. -30...-10=100%
5.2. -10... 0... +4=30%
5.3.+4... +30= Не вытягивается!!! (Исключение сырая погода = 1%)
Вдумчивао перечитываем пункт 1-ый.
http://art1.by/vaz/
возможно и легче, но в моем случае решено использовать именно то , о чем написанно выше!
Ну раз тут флудят. То и я пофлужу. Писать не мешки ворочать. В логике ошибки.
1. Ниже 0 градусов надо запустить "предпусковой подогреватель" и довести до +4 градуса охлаждающую жидкость. Например вебасто в Швеции.
2. Купить готовую "електронику кнопку старта" заводского изготовления, как я понимаю в вашем случае для карбюраторного двигателя. Например в Китае.
3. А вот кнопку можно уже поразвлекатся ардуинкой понажимать. Например если не хотим купить заводского изготовления сигнализацию с дистанционным пуском. Например в Москве.
4.Все узлы полные автоматы. Работают максимально независимо. Сами принимают решения по температурам, аккумуляторм, оборотам. Отстутствие одного из узлов не влиет на ручной запуск в целом.
5.Про подсос. Изучаем мат часть карбюраторного двигателя с подсосом. На сколько вытягивается при
5.1. -30...-10=100%
5.2. -10... 0... +4=30%
5.3.+4... +30= Не вытягивается!!! (Исключение сырая погода = 1%)
Вдумчивао перечитываем пункт 1-ый.
http://art1.by/vaz/
теперь о принципах работы подсоса.:: -10 и +85 примем за 100%то 5 градусов ~5% отсекаем все что до -10 и после 85. так же не стоит забывать что штатный датчик работает не стабильно линейно, при повышенных температурах напряжение смещения меняется достаточно чувствительно, а вот при низких температурах сопротивление практически одно и тоже.!!
потому уважаемые коллеги предлагаю оставить немного покурить лишние советы которые мало чем помогают в данном проекте.
;)
насколько прикрывать заслонку, на 30% или как то иначе можно легко подправить в скетче внесением либо ограничения, либо опытным путем выявить необходимое положение при той или иной температуре. но суть немного не в том каким образом запускать и при каком положениии заслонки. суть в том чтобы стабильно держать обороты после запуска. на уровне 1500. так что уважаемый art100 давайте будем думать в этом направлении.
Вам слово.
арт100 отпишись. gav707090@yandex.ru
Лень думать. 00:03 спать пора идти. Я проблем на вижу. Я решение уже дал. У меня -30 мороза часто. Мои:Инжектор при -30 заводился,заводится, думаю будет заводится. Карбюратор при -30 мороза всегда заводился,заводится, уверен всегда будет заводится. На инжекторе педальку газа Да ножкой поднажимаю. На карбюраторе фильтр правильно повернут подсос 100% 3 качка педалькой газа. Пока машина греется все равно вокруг машины ходишь 5 минут и сбиваю лед со стекол пока нитинакала подплавят. Не интересно. Вот электромобиль забабахать может будет интересно.
Pnewmoslon Как продвинулись дела в перед? думаю поставить похожую систему для поддержания оборотов на свой IFA W50. будет как автопилот.
да пока как то своими силами ковыряю скетч, делаю робкие шаги к изучению ПИД. очень рекомендую если бессоница одолевает.))
давайте будем вместе код писать, не думаю что здесь нужен ПИД.. можно и без него обойтись. как вы обороты "смотрите"? Я вот думаю как мне это сделать? У меня дизель, причем старый без всякой электроники.. придется каким то способом к генератору подключается.
Что я хочу сделать:
1. Поставить серво на педаль газа которая будет подключена к ардуине.
2. Вывести кнопку(с лампочкой внутри) на панель управления которая будет подключена к ардуине.
3. Подключить ардуино через оптопару к генератору, к лягушки педали тормоза.
Принцип работы: Едим например со скоростью 80 километров в час. Нажимаем на кнопку, загорается зеленый свет - "автоматический газ" включен и поддерживает скорость. Один раз нажимаем на тормоз, лампочка тухнет - "автоматический газ" выключен. Еще не уверен но может сделаю и так что например: когда автопилот включен и поддерживает скорость, но машина едет в гору и мощности мотора не хватает чтобы поддержать заданные обороты - в кнопке загорается красная лампочка. До тех пор пока заданные обороты не будут соответствовать настоящим.
Логика моего кода будет примерно такова:
Режим "ожидание" - Ставим серво в положение 0. Считываем показания кнопки включения "автоматический газ". Если кнопка была нажата переходим в режим "подготовка". Все лампочки выключены.
Режим "подготовка" - Мигаем красной лампочкой. Считываем несколько раз показания генераторa и записываем эти показание, после переходим в режим "работы". Смотрим не нажата ли педаль тормоза, если да то переходим в режим "ожидание".
Режим "работа" - Зажигаем зеленую лампочку. Считываем показания генераторa и в зависимости от них управляем сервой. Смотрим не нажата ли педаль тормоза, если да то переходим в режим "ожидание".
Ну как то так
оч интересно, но в моем случае пид просто необходим. в вашем случае проще поставить серву прямо на тросике или тяге газа, но хочу вас огорчить, слишком большое уилие требуетсч для этого и серва которая будет в этом режиме пахать обойдется вам ой как дорого. может лучше готовый комплект круиз контроля с приветом из китая??? дешевле будет и надежнее
только серву на такой ответственный участок поставь хорошую
и лучше цифровую. питание то ведь у тебя не ограничено
хотя для проверки можно поставить и обычную
ага, серва около 40 гринов выходит с усилием более 30 кг на см, с металлическими и карбоновыми шестернями. питание от 4.8 до 7.2вольта
для нее питание нужно отдельное через преобразователь понижающий стабилизированный подавать. иначе дуину спалишь на первой минуте работы с такой сервой. у нее потребляемая около 1 А
#include <PID_v1.h>//библиотека ПИД-ругулятора #include <Servo.h> //библиотека серво привода double Setpoint, Input, Output; Servo myservo;//серво привод int termopin = 0; // датчик температуры охл. жидк. int val; PID myPID(&Input, &Output, &Setpoint, 8.6, 0.5, 1, DIRECT); //создаем ПИД-регулятор int ledpin = 8; //светодиод индикации включения автоподсоса int pechpin = 11;//управление печкой boolean revers; unsigned long micros_th = 0; volatile int tz; volatile int th; //импульсы тахометра void setup() { pinMode(ledpin, OUTPUT); // устанавливает режим работы - выход pinMode(pechpin, OUTPUT); Serial.begin(115200); //инициализация ком порта attachInterrupt(0, tahometr, RISING); //прерывание тахометра по фронтам импульса на 2 цифровом пине Setpoint = 1500;//заданная температура в салоне автомобиля Input = th;//читаем показания оборотов myPID.SetOutputLimits(0, 180);//устанавливаем границы выходного сигнала для ПИД-регулятора if (Setpoint < Input) { //если начальные обороты больше заданных revers = true; myPID.SetControllerDirection(REVERSE);//ПИД-регулятор используем обратный } myPID.SetMode(AUTOMATIC);//включаем ПИД-регулятор } void loop() { label: tz = tz - 1; if (tz == 0) {th = 0;} val = analogRead (termopin); //считали температуру int rpm = th; if (val >= 1000 && rpm == 0) {digitalWrite(8, LOW); // если темп больше или ровна 85С и обороты ровны 0, гасим свет digitalWrite(pechpin, LOW);//выключаем печку goto label;//прыгаем на label } if (val >= 1000 && rpm > 0) {digitalWrite(8, LOW);//если темп больше 85С и обороты больше 0, digitalWrite(pechpin, LOW);//выключаем печку goto label;//прыгаем на label } if (val < 1000 && rpm == 0) {ustanovkaServa;}//температ меньше 85 и оборты = 0, запускаем функцию начальной устан сервы if (val < 1000 && rpm >= 750) {zapuskPid;}//темп меньше 85 и обороты больше или ровны 750. запускаем пид if (val >= 750 && rpm >= 750) {digitalWrite(pechpin, HIGH);}//если температура 60С и выше и двигатель заведен, включаем печку else {digitalWrite(pechpin, LOW);} } //*******************функция начальной установки сервы по температуре********************* void ustanovkaServa(){ val = analogRead (termopin); //считали температуру myservo.attach(9);//подключаем серву на 9 пин int motorAngl = map(val,1000, 50, 23,179);//Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы myservo.write(motorAngl);// Устанавливаем серву на угол который получаем через преобразование delay (50); // задержка ждем серву myservo.detach();// отключаем серву digitalWrite(ledpin, HIGH); } //************************функция запуска пид регулятора*************************** void zapuskPid(){ Input = th;//анализируем обороты myPID.Compute();//считаем выходной сигнал ПИД-регулятора myservo.attach(9, 23, 180); //включаем серву на 9 цифровом пине, с длинной импульса от 630 до 2540(указываем границы поворота сервы) if (revers)//если пид регулятор обратный, то сервой управляем также относительно противоположной крайней точки myservo.write(180 - Output); else myservo.write(Output); delay(1000);//ждем серву myservo.detach();//отключаемся от сервы Serial.println(th); delay(50); } //************************************измеряем частоту на входе тахометра по прерыванию*********** void tahometr() { th = (2900000 / ( micros() - micros_th)); micros_th = micros(); tz = 10; }зацени Жека, сегодня доделал. сейчас пробую править, правда все цифры от болды, потом править буду по сериал
и что 1А? не самое большое потребление. XM1584 или MP1584 ищешь на али и радуешься. ток до 3 ампер
там такое большое усилие думаешь нужно?
меня смущает оформление и goto как серпом по одному месту
у тросика моло того что трение большое, так и еще длинна хода не малая около 10 см. теперь считаем: 38кг/см, значит для того чтоб протягивать 10 см тросика нужно как минмум 5 см рычага, и того 38 /5=7.6 кг и это без преодоления трения тросика или тяги
Жека, я же только учусь. не все сразу, через некоторое время и оформление появится и прочие хитрости писания скетчей
так что 38кг/см еще может оказаться и мало
хотя бы от goto избавься
но какое усилие нужно на троссик так и не прозвучало
а 1 А это при нормальной нагрузке, а при той что будет на тросике все 3 и вылезут
завтра проснется и напишет какое усилие)) я же его тросик не дергал))
на 2109 ваз газ тросик около 3 кило, подсос 5кг
хотя бы от goto избавься
но какое усилие нужно на троссик так и не прозвучало
3 кило на каком рычаге?
может тогда использовать шаговый с редуктором
у меня не тросик..:) там тяга идет... и сила немалая нужна, нога давит устает когда долго едешь..
http://funkyimg.com/i/RYCu.jpg
можно вызвать функцию и гонять определенное количество раз с использованием for или бесконечно по while
у меня не тросик..:) там тяга идет... и сила немалая нужна, нога давит устает когда долго едешь..
http://funkyimg.com/i/RYCu.jpg
ты бы еще танк показал)))
3 кило на каком рычаге?
может тогда использовать шаговый с редуктором
можно вызвать функцию и гонять определенное количество раз с использованием for или бесконечно по while
а фор пока не трогал. думаю и до него доберусь, но не сегодня. устал, на работу утром рано
3 кило на каком рычаге?
может тогда использовать шаговый с редуктором
у меня серва подсос тянет легко, запас есть около 2 кг, стоит прямо на карбе, влагозащищеная, усиленная.
#include <PID_v1.h> //библиотека ПИД-ругулятора #include <Servo.h> //библиотека серво привода double Setpoint, Input, Output; Servo myservo; //серво привод int termopin = 0; // датчик температуры охл. жидк. int val; PID myPID(&Input, &Output, &Setpoint, 8.6, 0.5, 1, DIRECT); //создаем ПИД-регулятор int ledpin = 8; //светодиод индикации включения автоподсоса int pechpin = 11; //управление печкой boolean revers; unsigned long micros_th = 0; volatile int tz; volatile int th; //импульсы тахометра void setup() { pinMode(ledpin, OUTPUT); // устанавливает режим работы - выход pinMode(pechpin, OUTPUT); Serial.begin(115200); //инициализация ком порта attachInterrupt(0, tahometr, RISING); //прерывание тахометра по фронтам импульса на 2 цифровом пине Setpoint = 1500; //заданные обороты двигателя об/мин Input = th; //читаем показания оборотов myPID.SetOutputLimits(0, 179); //устанавливаем границы выходного сигнала для ПИД-регулятора if (Setpoint < Input) { //если начальные обороты больше заданных revers = true; myPID.SetControllerDirection(REVERSE); //ПИД-регулятор используем обратный } myPID.SetMode(AUTOMATIC); //включаем ПИД-регулятор } void loop() { label: tz = tz - 1; if (tz == 0) {th = 0;} val = analogRead (termopin); //считали температуру int rpm = th; if (val >= 1000 && rpm == 0) {digitalWrite(8, LOW); // если темп больше или ровна 85С и обороты ровны 0, гасим свет digitalWrite(pechpin, LOW); //выключаем печку goto label; //прыгаем на label } if (val >= 1000 && rpm > 0) {digitalWrite(8, LOW); //если темп больше 85С и обороты больше 0, digitalWrite(pechpin, LOW); //выключаем печку goto label; //прыгаем на label } if (val < 1000 && rpm == 0) {ustanovkaServa;} //температ меньше 85 и оборты = 0, запускаем функцию начальной устан сервы if (val < 1000 && rpm >= 750) {zapuskPid;} //темп меньше 85 и обороты больше или ровны 750. запускаем пид if (val >= 750 && rpm > 0) {digitalWrite(pechpin, HIGH);} //если температура 60С и выше и двигатель заведен, включаем печку else {digitalWrite(pechpin, LOW);} } //*******************функция начальной установки сервы по температуре********************* void ustanovkaServa(){ val = analogRead (termopin); //считали температуру myservo.attach(9); //подключаем серву на 9 пин int motorAngl = map(val,1000, 50, 23,179); //Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы myservo.write(motorAngl); // Устанавливаем серву на угол который получаем через преобразование delay (1000); // задержка ждем серву myservo.detach(); // отключаем серву digitalWrite(ledpin, HIGH); //включаем светодиод индикации } //************************функция запуска пид регулятора*************************** void zapuskPid(){ Input = th; //анализируем обороты myPID.Compute(); //считаем выходной сигнал ПИД-регулятора myservo.attach(9, 23, 180); //включаем серву на 9 цифровом пине, с длинной импульса от 630 до 2540(указываем границы поворота сервы) if (revers) //если пид регулятор обратный, то сервой управляем также относительно противоположной крайней точки myservo.write(180 - Output); else myservo.write(Output); delay(10); //ждем серву myservo.detach(); //отключаемся от сервы Serial.println(th); delay(50); } //************************************измеряем частоту на входе тахометра по прерыванию*********** void tahometr() { th = (2900000 / ( micros() - micros_th)); micros_th = micros(); tz = 10; }скетч можно юзать, настройки параметров температуры делаем сами)) вот так то)) сделано лично при поддержке jeka_tm, в чем собственно ему благодарность.
myservo.detach(); //отключаемся от сервы Serial.println(th); delay(50); } //************************************измеряем частоту на входе тахометра по прерыванию*********** void tahometr() {скетч можно юзать, настройки параметров температуры делаем сами)) вот так то)) сделано лично при поддержке jeka_tm, в чем собственно ему благодарность.
если проект реализовался, можно схему подключения, резисторы и т.д. и фото установенного устройства?
с какой целью серву включаешь только в фукнции zapuskPid(). там же отключаешь. защита от чего то?
1. в 37, 40, 48, 49 строке лишние скобки
2. в 39 зачем каждый раз объявляешь? объяви один раз в самом начале
3. в 4 строке реально нужен такой тип?
4. в 40 и 44 если уже дал название пину зачем управляешь через номер пина
ну и так пожелания:
1. пины объявляй через define
2. тяжело читается код. структурируй например. в самом начале пины объяви п.1. потом например переменные, потом еще что то.
через define также можно объявить константы в самом начале (которые в строках с 40 по 50) удобнее будет настраивать
год назад тема была))) думаю он сюда уже не заходит((
жека, я смотрю ты ему много помогал, не знаешь как можно сделать что бы на газ жмешь, и пид не начинал считать, а то уберет он мне подсос и все. газ отпустишь машина заглохнет.
я ему почти не помогал. почитай. так общие разговоры
а вообще врое если добавить еще одно условие в функцию zapuskPid() выполнять только если газ не нажат или газ ниже заданного уровня
как програмно я понял сделать. а как объяснить что газ нажал, датчик какой ставить... вот в чем вопрос.. концевик обычный не подойдет, потому что когода подсос вытаскиваешь газ тоже откланяется... и как ардуинке объяснить что не она нажала на газ, а именно я...
или ты сам голову ломай. смотри свои педали что и как там можно сделать. или фото выложи чтобы было о чем думать
думаю додумаюсь, когда придут все компоненты, будем пробовать. хотелось бы конечно что бы в мозгу у ардуинки было что то типа, " так, я не трогал подсос а обороты почему то резко выросли, значит не буду сдвигать серву" или что то наподобие.
ну что то типа такого
придумал. ставлю на коробку передач геркон, и когда скорость включена, не важно 1,2,3 и т.д. система автоматики не активна, а когда на нейтрали, будет дальше регулировать заслонку. и переделал код без пид регулятора)
#define RPMpin 2 // датчик Холла long microsold = 0; int rpm = 0; int con_open = 7; // концевик полностью открытой заслонки int con_clos = 4; // концевик полностью закрытой заслонки int temp = A3; // датчик температуры int out1 = 5; //выход на любой мотор int out2 = 6; // выход на любой мотор int knopka_high = 8; // кнопка управления заслонкой вручную int knopka_low = 9;// кнопка управления заслонкой вручную int knopka_avtomat = 10;// переключатель автомат-ручное управление void setup() { Serial.begin(9600); digitalWrite(RPMpin, 1); attachInterrupt(0, RPM1, FALLING); // объявляем входом pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(temp, INPUT); pinMode(con_clos, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(knopka_avtomat, INPUT); pinMode(knopka_low, INPUT); pinMode(knopka_high, INPUT); // объявляем выходом pinMode(out1, OUTPUT); digitalWrite(out1, LOW); pinMode(out2, OUTPUT); digitalWrite(out2, LOW); } void loop() { Serial.print("rpm"); Serial.println(rpm, DEC); delay(500); if (digitalRead(knopka_avtomat)==1) { avtomat(); } else { manual(); } } void avtomat() // сама программа { if ((analogRead(temp) <= 30) && (rpm > 100)) // если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком { chek_serva();// первая программа управления моторчиком } else if ((analogRead(temp) <= 60) && (rpm > 100))// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком { chek_serva2();// вторая программа управления моторчиком } else //если ни одно не верно то запускаем программу управления по температуре { chek_temp(); // программа управления по температуре } // тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно Serial.print("temp"); Serial.println(analogRead(temp)); } void chek_serva()// первая программа управления моторчиком { if((rpm >= 1500)&&(digitalRead(con_open)==0)) // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую) { digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1200)&&(digitalRead(con_clos)==0)) // если обороты больше 1200 то провернуть моторчик в обратную сторону { digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } void chek_serva2() // вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся. { if((rpm >= 1300)&&(digitalRead(con_open)==0)) { digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1100)&&(digitalRead(con_clos)==0)) { digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } void chek_temp() // сюда попадаем если двигатель заглушен { if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)) // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку { digitalWrite(out1, HIGH); delay(100); digitalWrite(out1, LOW); } else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60) ) // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку { digitalWrite(out2, HIGH); delay(100); digitalWrite(out2, LOW); } } void manual() { if((digitalRead(knopka_high)==1) && (digitalRead(con_open)!=1)) { digitalWrite(out1, HIGH); digitalWrite(out2, LOW); } else if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1)) { digitalWrite(out2, HIGH); digitalWrite(out1, LOW); } else { digitalWrite(out2, LOW); digitalWrite(out1, LOW); } } void RPM1 (){ rpm = (1000000.0/(micros() - microsold))*60; microsold = micros(); }подтяжка к минусу хуже чем к плюсу по защищенности. а вообще очень тяжело читать код, и кстати его можно сворачивать
не знаю зачем поправил под свой вкус
#define RPMpin 2 // датчик Холла #define con_open 7 // концевик полностью открытой заслонки #define con_clos 4 // концевик полностью закрытой заслонки #define temp A3 // датчик температуры #define out1 5 //выход на любой мотор #define out2 6 // выход на любой мотор #define knopka_high 8 // кнопка управления заслонкой вручную #define knopka_low 9 // кнопка управления заслонкой вручную #define knopka_avtomat 10 // переключатель автомат-ручное управление unsigned long microsold = 0; int rpm = 0; int analog=0; void setup(){ Serial.begin(9600); digitalWrite(RPMpin, 1); attachInterrupt(0, RPM1, FALLING); // объявляем входом pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(temp, INPUT); pinMode(con_clos, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(knopka_avtomat, INPUT); pinMode(knopka_low, INPUT); pinMode(knopka_high, INPUT); // объявляем выходом pinMode(out1, OUTPUT); digitalWrite(out1, LOW); pinMode(out2, OUTPUT); digitalWrite(out2, LOW); } void loop(){ Serial.print("rpm"); Serial.println(rpm, DEC); delay(500); (digitalRead(knopka_avtomat))? avtomat(): manual(); } ================================================================================================// сама программа void avtomat(){ analog = analogRead(temp); if ((analog <= 30) && (rpm > 100)) chek_serva();// если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком else if ((analog <= 60) && (rpm > 100)) chek_serva2();// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком else chek_temp();//если ни одно не верно то запускаем программу управления по температуре // тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно Serial.print("temp"); Serial.println(analog); } // ======================================================================================================================================================================== // ==================================================================================================================================первая программа управления моторчиком // ======================================================================================================================================================================== void chek_serva(){ if((rpm >= 1500)&&(digitalRead(con_open)==0)){ // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую) digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1200)&&(digitalRead(con_clos)==0)){ // если обороты больше 1200 то провернуть моторчик в обратную сторону digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } // ======================================================================================================================================================================== // ================================= вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся. // ======================================================================================================================================================================== void chek_serva2(){ if((rpm >= 1300)&&(digitalRead(con_open)==0)){ digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1100)&&(digitalRead(con_clos)==0)){ digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } // ======================================================================================================================================================================== // ================================================================================================================================== сюда попадаем если двигатель заглушен // ======================================================================================================================================================================== void chek_temp(){ if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)){ // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку digitalWrite(out1, HIGH); delay(100); digitalWrite(out1, LOW); } else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60)){ // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку digitalWrite(out2, HIGH); delay(100); digitalWrite(out2, LOW); } } // ======================================================================================================================================================================== // ================================================================================================================================================================= Ручное // ======================================================================================================================================================================== void manual(){ if((digitalRead(knopka_high)==1) && (digitalRead(con_open)!=1)) { digitalWrite(out1, HIGH); digitalWrite(out2, LOW); } else if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1)){ digitalWrite(out2, HIGH); digitalWrite(out1, LOW); } else{ digitalWrite(out2, LOW); digitalWrite(out1, LOW); } } void RPM1 (){ rpm = (1000000.0/(micros() - microsold))*60; microsold = micros(); }единственное странно. как реально работает if потом else if а потом еще else. вроде как снова должно быть else if
а почемуу бы не работать else. если ни одно условие не верно то выполнить функцию, if добавляют только для заданияя определенного условия я так понял. и еще вопросик. как мне можно в этом скетче использовать серву? что бы она шагала на 1 градус допустим в плюс или минус?