Задержка по времени для сервы

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Добрый день уважаемые форумчане! Я новичок в ардуино и поэтому, просмотрев все простетские видеоуроки, у меня созрел, как я думаю, простой вопрос. Как без "delay", используя только "millis()" решить такой момент: есть ардуинка, датчик температуры и серва. Задача к примеру такая: при достижении температуры 60 градусов серва делает поворот на 90 градусов. Но если просто воткнуть библиотеку сервы и прописать к примеру 

if (temp>60)
 {myservo.write(90);}

   то серва начинает биться в конвульсиях, т.к. температура скачет 60-61градус еще несколько секунд, а мне бы надо добавить в условие к примеру 10ти секундную задержку... Тобишь серва поворачивается в том случае, если температура >60 градусов держится более 10ти секунд. Вот что надо в условие дописать?:-)

bwn
Offline
Зарегистрирован: 25.08.2014

http://arduino.ru/tutorials/BlinkWithoutDelay

По образу и подобию

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

когда повернулась detach делайте чтобы не дёргалась, потом даже delay сгодится на ваши 10 секунд и снова attach ....

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ИМХО не в том направлении копаете. Не проще реализовать гистерезис?

Что-то типа:

if (temp<59) 
{myservo.write(0);}
if (temp>60) 
{myservo.write(90);}

В диапазоне 59-60 градусов серва поворачивать не будет.

Т.е., серва повернётся на угол 90 если температура повыситя до 61 градуса, а обратно вернется на угол 0 только если температура опустится до 58 градусов. Получается запас на колебание температуры в два градуса. Если нужен гистерезис в один градус, то  temp<=59 или temp>=60

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Воооот действительно, все гениальное всегда просто:-) . А я забил башку какими-то сложными выкрутасами с millis()... Благодарю за верное направление! Это я твердотопливный котел на дровах автоматизирую)))

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

гистерезис снизит точность установки сервы, лучше как trembo предложил в #2

можно просто опрашивать и управлять раз в 10 секунд.... millis() как bwn в #1

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

чем управляет серва ? почему только 0/90=закрыть/открыть ? а не следить положение 0.....90 от температуры 10....80 ?

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

Воооот действительно, все гениальное всегда просто:-) . А я забил башку какими-то сложными выкрутасами с millis()... Благодарю за верное направление! Это я твердотопливный котел на дровах автоматизирую)))

А я бы попросил в нашу millis() не плеватся, вы спросили: "Тобишь серва поворачивается в том случае, если температура >60 градусов держится более 10ти секунд. Вот что надо в условие дописать?:-)", я вам за секунды и ответил))). Может у вас в них величайший сакральный смысл сокрыт, мне откуда знать?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Плеваться? Да ни в коем случае!))) Я перепробую все, что тут предложили ради собственного наглядного опыта! Кстати, а кто бы что посоветовал в плане attach-detach сервы после каждого маневра? Обязательно это делать или же желательно или же без разницы?

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

чем управляет серва ? при detach сервы неведомые нам силы могут и подвинуть серву в сторону противодействия :(

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

чем управляет серва ? почему только 0/90=закрыть/открыть ? а не следить положение 0.....90 от температуры 10....80 ?

На самом деле это я для примера спросил. Для полноты картины опишу процесс полностью, может ошибки подскажите или совет дадите... Есть твердотельный котел длительного горения (котел Стропува так называемый)... Накидал дров один раз и на сутки забыл про него якобы... Но есть в нем один капризный момент: котел не должен работать при температуре теплоносителя в нем ниже 60 градусов, иначе попрет конденсат дуром. Приходится закрывать кран подачи и сидеть ждать, пока котел не наберет температуру градусов 75 и тогда наполовину кран можно приоткрыть (если открыть наполную то из обратки холодная вода мигом снизит температуру с 75 до 50-55 градусов и придется вновь прикрывать). Вот и поставил задачу: перед затопкой котла нажал кнопочку - серва закрылась(та серва что стоит на шаровом кране, большая такая и будет управляться как я понял не напрямую с ардуинки а еще через транзистор в импульсном режиме) и при достижении температуры 75 градуов серва сама откроет кран на угол 45 ну и т.д. Хочу в эту картину впихнуть эзернет модуль, для управления сервой и чтения инфы из дома (правда тут я еще пока ноль). Вот такая нехитрая задумка

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

управлением заслонкой приточного воздуха в камеру сгорания ?

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

вам нужно два канала управления - 1-управление горением, 2-управление циркуляцией теплоносителя

Andrey-S
Offline
Зарегистрирован: 02.01.2015

И это тоже можно организовать, если уж прям ПОЛНОСТЬЮ практически его автоматизировать... У него есть небольшая встроенная "управлялка" заслонки приточного воздуха на основе что-то теплового расширения бака (температура повышается - заслонка опускается немного и наоборот), но нету полностью возможности перекрытия (к примеру если то, что я описал выше сделать и по какой то причине сдохнет датчик температуры и начнет показывать все время 40градусов когда в котле уже 100, то произойдет так сказать "паровозик")))). Поэтому управление заслонкой приточного воздуха - планы на будущее при условии, что справлюсь с уже поставленными, а пока вместо одног датчика температуры будет стоять 2 с ординаковыми программными условиями (ведь вероятность крайне мала, что оба датчика сдохнут разом)

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

ваша изначальная постановка - открывать кран на нужный поток теплоносителя ( воды ) в зависимости от температуры воды на обратке ?

60 - приоткрыть, 70 - приприоткрыть, 80 - приприприоткрыть ? 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ну не сказать, что в ависимости от температуры воды в обратке... Скорее в подаче, ибо обратка как ни крути не станет 60 градусов даже за 3 часа... Все те цифры, что я написал выше (минимум 60град, среднее положение сервы - 75град и полное открытие 80град) были получены исключительно опытным путем 

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

И это тоже можно организовать, если уж прям ПОЛНОСТЬЮ практически его автоматизировать... У него есть небольшая встроенная "управлялка" заслонки приточного воздуха на основе что-то теплового расширения бака (температура повышается - заслонка опускается немного и наоборот), но нету полностью возможности перекрытия (к примеру если то, что я описал выше сделать и по какой то причине сдохнет датчик температуры и начнет показывать все время 40градусов когда в котле уже 100, то произойдет так сказать "паровозик")))). Поэтому управление заслонкой приточного воздуха - планы на будущее при условии, что справлюсь с уже поставленными, а пока вместо одног датчика температуры будет стоять 2 с ординаковыми программными условиями (ведь вероятность крайне мала, что оба датчика сдохнут разом)

А сама система теплоносителя гравитационная или принудительная? Если принудиловка, то самая ваша большая проблема, это обесточивание. Оставлять в таком варианте на сутки без присмотра не рискнул бы. Прошлой зимой два раза принудительно гасить пришлось, пока на генератор не разорился(((.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Да и все эти три положения сервы (закрыть, полуоткрыть и открыть) можно разделить штук на 10 вообще для плавности и точности, но торговое здание 300квадратов не заметит этот так скажем комфорт.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Система принудительная. Я уже поставил ИБП с 8ю аккумуляторами))). Так что отключение электричества даже на сутки мне не страшны. Еще стоит Teplocom GSM, который мне смски шлет и звонит когда вырубает свет. Я к нему присобачил вместо датчика протечки воды датчик вентилятора от а/м Ока, и теперь если вдруг забыли открыть кран подачи и котел набрал 92 градуса - звонит телефон и приходит смска - АВАРИЯ!))

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

итого - замер Т, установка сервы, ждать 10.....60 сек через millis() - замер Т, устано........ цикл-песня про бычка :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

итого - замер Т, установка сервы, ждать 10.....60 сек через millis() - замер Т, устано........ цикл-песня про бычка :)

Благодарю! Сейчас буду на борде пробовать с низкими температурами))).  А что на счет attach-detach? 

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

и котел набрал 92 градуса - звонит телефон и приходит смска - АВАРИЯ!))

нет - ПЕРЕГРЕВ ! :)

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

А что на счет attach-detach? 

не нужно - если мерить Т каждые 10.......60 сек - серва не будет дёргаться....

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

и котел набрал 92 градуса - звонит телефон и приходит смска - АВАРИЯ!))

нет - ПЕРЕГРЕВ ! :)

К сожалению, Teplocom GSM хоть и полезная вещь, но примитивная... На все срабатывания датчиков пишет одну и ту же аварию, не подразделяя вообще. Поэтому опять же в планах (когда научусь хоть чему-то) захреначить к ардуинке GSM модуль))))

bwn
Offline
Зарегистрирован: 25.08.2014

SU-27-16 пишет:

и котел набрал 92 градуса - звонит телефон и приходит смска - АВАРИЯ!))

нет - ПЕРЕГРЕВ ! :)

А, понял, "авария" приходит когда от земли отрвался)))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

А что на счет attach-detach? 

не нужно - если мерить Т каждые 10.......60 сек - серва не будет дёргаться....

Тобишь Вы предлагаете делать замеры не постоянно, а раз, допустим, в пол-минуты приблизительно с помощью millis()? В принципе верно, у системы инерция как у поезда и за пол-минуты или минуту температурный скачок не будет выше 1-2 градусов...

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

analogWrite( map( T , 60 , 90 , 0 , 90 ));

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

SU-27-16 пишет:

А что на счет attach-detach? 

не нужно - если мерить Т каждые 10.......60 сек - серва не будет дёргаться....

Тобишь Вы предлагаете делать замеры не постоянно, а раз, допустим, в пол-минуты приблизительно с помощью millis()? В принципе верно, у системы инерция как у поезда и за пол-минуты или минуту температурный скачок не будет выше 1-2 градусов...

Практически в любом случае нет смысла в частом мониторинге температуры. Лучше это процессорное время задействовать на другие задачи.

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

bwn пишет:

SU-27-16 пишет:

и котел набрал 92 градуса - звонит телефон и приходит смска - АВАРИЯ!))

нет - ПЕРЕГРЕВ ! :)

А, понял, "авария" приходит когда от земли отрвался)))

ну, да - когда систему порвало :)

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

Тобишь Вы предлагаете делать замеры не постоянно, а раз, допустим, в пол-минуты приблизительно с помощью millis()? В принципе верно, у системы инерция как у поезда и за пол-минуты или минуту температурный скачок не будет выше 1-2 градусов...

даааааааааа, тепловыыыыыыыые процееееееессы ооооооооооооооооочень длиииииииииииииииииииииииителные.....

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

SU-27-16 пишет:

analogWrite( map( T , 60 , 90 , 0 , 90 ));

нууу,вы поняли, надеюсь :)

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

посмотрите про ПИД-регуляторы - на какой угол открывать кран в зависимости от Т - чёбы не попасть в раскачку.....

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Не совсем понял зачем функция map? Для чего конвертация 60 в 0? А так то саму логику понял, теперь бы ее еще буковками правильно написать))))

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

значения Т = 60........90 маппируются ( приводятся ) в значение угла поворота сервы....

это уже П-регулятор.... Пропорционалный регулятор.... 

60 - закрыт, 70 - приоткрыт, 80 - приприоткрыт..... и т.д.

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

analogWrite( пинСервы , map( T , 60 , 90 , 0 , 90 ));

Т=60 - угол=0,     Т=65 - угол=10,     Т=70 - угол=25,     Т=80 - угол=45 - это пример !!!!!!

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

Для чего конвертация 60 в 0

конвертируется Т в положение сервы !

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

значения Т = 60........90 маппируются ( приводятся ) в значение угла поворота сервы....

это уже П-регулятор.... Пропорционалный регулятор.... 

60 - закрыт, 70 - приоткрыт, 80 - приприоткрыт..... и т.д.

Воооот теперь вроде догнал!:-) Получается, что каждый градус температуры будет не давать покоя серве. Я представляю процесс, но вот буууковкиииии.......  Я всего недели 2 как с нулевым знанием языка программирования сюда прибыл))) Диодами мигать по-всякому могу уже, а вот с этим делом похоже зависну не слабо))

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

А так то саму логику понял, теперь бы ее еще буковками правильно написать))))

для этого нужны параметры вашего датчика Т

и весь код дайте, если это не теория, а есть замеры Т....

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

Диодами мигать по-всякому могу уже, а вот с этим делом похоже зависну не слабо))

да ладно........ тут всё просто....

bwn
Offline
Зарегистрирован: 25.08.2014

SU-27-16 пишет:

Диодами мигать по-всякому могу уже, а вот с этим делом похоже зависну не слабо))

да ладно........ тут всё просто....

Аппетит приходит во время еды, как и скорость действия ложкой)))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

А так то саму логику понял, теперь бы ее еще буковками правильно написать))))

для этого нужны параметры вашего датчика Т

и весь код дайте, если это не теория, а есть замеры Т....

Датчик обыный LM35DZ вроде как с коэффициентом 0.48828125. А насчет кода - его само-собой нет, я для этого зашел на форум советов набираться умных и затем стараться что-то там написать под свои нужды со 100500 попытки если получится)). Вот Вам большой спасибо за подсказки и советы).  

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

SU-27-16 пишет:

А так то саму логику понял, теперь бы ее еще буковками правильно написать))))

для этого нужны параметры вашего датчика Т

и весь код дайте, если это не теория, а есть замеры Т....

Датчик обыный LM35DZ вроде как с коэффициентом 0.48828125. А насчет кода - его само-собой нет, я для этого зашел на форум советов набираться умных и затем стараться что-то там написать под свои нужды со 100500 попытки если получится)). Вот Вам большой спасибо за подсказки и советы).  

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

bwn
Offline
Зарегистрирован: 25.08.2014

Ну и само собой набросайте для  себя, что в это устройство будет входить и что вы от него ожидаете мин-макс. Дальше в свете хотелок можно прикинуть требуемое кол-во исполнительных выводов. И начав с малого, творчески продолжать. Глядишь и вытешем каменный цветок)))

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Это что значит разбивать на самодостаточные функции? Типа "void bla_bla" - первая функция... "void bla_bla_bla" - вторая... И потом в loop просто их подставлять в условия?

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

Это что значит разбивать на самодостаточные функции? Типа "void bla_bla" - первая функция... "void bla_bla_bla" - вторая... И потом в loop просто их подставлять в условия?

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

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

набросок :

#define pinSensorT A0
#define pinServo 3 // PWM
unsigned long tTemper;
int liveTemper=60000; // измеряем каждые 60 сек
void setup()
{
  // установки
  tTemper=millis();
}
void loop()
{
  if((millis()-tTemper)>liveTemper)
    {
      // чтение Т 
      int T = analogRead(pinSensorT); // если датчик аналоговый - через резистивный делитель
     // поворот cервы
     analogWrite(pinSensorT,25,100,0,90);
     tTemper=millis();
    }
}

этапы - 1-измерить Т, 2-повернуть серву

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

блииииин, в строке с17 совместил и маппирование, и поворот :( , но это только схема :)

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

у вас пока два действия в одной ветке - измерить Т и повернуть серву

можно-нужно разбить на две ветки - замер Т и поворот сервы

Andrey-S
Offline
Зарегистрирован: 02.01.2015

bwn пишет:

Andrey-S пишет:

Это что значит разбивать на самодостаточные функции? Типа "void bla_bla" - первая функция... "void bla_bla_bla" - вторая... И потом в loop просто их подставлять в условия?

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

Да да, я что-то читал про это... Опрос с одного пина по ID... Штука полезная... Спасибо за совет - закажу такие))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

у вас пока два действия в одной ветке - измерить Т и повернуть серву

можно-нужно разбить на две ветки - замер Т и поворот сервы

Спасибо за пример! Сейчас покудесничаю))

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

коды сюда не забывайте грузить :) 

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...