ПИД-регулятор форточка

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016

Добрый день.

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

Все примеры, которые удалось найти, работали с сервоприводом. У меня же планируется либо обычный актуатор, или даже возможно моторчик от стеклоподъемника (но не суть). Мне хочется, чтобы ПИД_регулятор мог управлять реле, а реле в свою очередь уже будет запускать привод.

В общем, друзья, подскажите или дайте совет:) спасибо

P/s ах да, Arduino Mega2560 у меня 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Примеров регуляторов полно, например тут

Регулировать температуру форточкой это конечно прикольно, но тогда необходимо определится, каким образом будет произ ходить регулирование

1. Путем открытия форточки на определеный угол

2. Или открытия её полностью но на определенное время в час.

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

Ну и ПИД и MEGA уж тут точно ни кчему.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

1 скорее у вас будет коллекторный движок, который будет вращатся то в ожну сторону, то в другую. Так что для управления мотрчиком надо это. http://www.youtube.com/watch?v=68c5HtvB8KE

http://ru.aliexpress.com/item/Free-shipping-1pcs-lot-Special-promotions-...

2 нужны конечники крайних положений окна- полностью открыто и полностью закрыто.

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016
int p1 = 0;                          // текущая температура
int p2 = 18;                         // заданная температура
int temper=0;                    // темп снаружи

boolean FLAG_OKNO = 0;               // состояни выхода окна
boolean OKNO_AVT = 1;                // окно в автомате
byte OKNO_ON = 0;                    // флаг окно
boolean rel_okno_on = 0;             //флаг, чтобы один раз засекать время открытия
boolean rel_okno_off = 0;            //
boolean rel_okno_temp_bol = 0;       // флаг, чтобы среагировать только один раз
boolean rel_okno_temp_men = 0;
boolean rel_okno_on_avt = 0;

#define oknoPin 3                     // активация 2-го реле

 AM2320Result = sensor.read();     // опрос датчика температуры и влажности  (возвращает sensor.tem - температура, sensor.hum - влажность)
  p1 = sensor.tem;                  // переменной р1 температуру, полученную с датчика
  p3 = sensor.hum;                  // переменной р3 присваиваем влажность с датчика
 int temper = temperature ; 

int time_on_okno = 10000;          //переменная времени открытия окна
 int time_off_okno = 10000;         //переменная времени закрытия окна
 int time_okno_start = 30000;       //переменная времени начала реагирования после отклонения температуры

unsigned long new_millis_okno=0; // переменная для хранения времени открытия окна
unsigned long new_millis_temp_bol=0; // переменная для времени, когда текущая температура больше заданной
unsigned long new_millis_okno_avt_bo=0l;


if (p1>p2 && p2<temper && OKNO_AVT && rel_okno_temp_bol==0) //если температура внутри больше заданной и и снаружи больше заданной и флаги
{
new_millis_temp_bol = 0; //обнуляем переменную времени и
new_millis_temp_bol = millis(); //засекаем время, через сколько после изменения температуры начать реагировать
rel_okno_temp_bol = 1; // выключаем флаг, чтобы среагировать только один раз
rel_okno_on = 0; //включаем флаг, чтобы один раз засечь время
}
if(!rel_okno_on && millis()-new_millis_temp_bol >= time_okno_start)
{

digitalWrite(oknoPin, LOW); //открываем окно
new_millis_okno_avt_bol = millis(); //засекаем время открытия окна
rel_okno_on = 1; // убираем флаг, чтобы сюда не возвращаться, пока условия температур снова не изменятся
}
if (millis() - new_millis_okno_avt_bol >= time_on_okno) //если время открытия окна более заданной величины
{
digitalWrite(oknoPin, HIGH); //то выключаем реле
new_millis_okno_avt_bol = 0; // и обнуляем переменную времени
}

 

Вот пока таким образом начал думать реализацию открытия окна

nik182
Offline
Зарегистрирован: 04.05.2015

ПИД это перебор, а вот ПИ будет в самый раз. Реализовать его в вашем случае просто - заведите переменную и накапливайте значение разности между уставкой и текущей температурой. При привышении порога интегрирования даёте команду на действие и обнуляеете накопленное значение. Важно что бы постоянная времени интегратора была больше чем у цепи цепи измерения - реакции.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вот у Вас время открытия и закрытия окна это 10000мс предпологаю.

Тогда 10000/100=100 т.е. 1% открытия = 100мс (что конечно не совсем верно в виду того что пропускная способность форточки изменяется не линейно от угла открытия, ну да ладно, для первого приближения подойдет.

Теперь берем температуру внутри помещения и заданную, передаем их в регулятор

Регулятор возвращает необходимый % упровляющего воздействия для поддержания заданной температуры.

Если он выдал к примеру 37% то это значит что 37*100мс(1%) = 3700мс необходимо открывать форточку и запомнить этот процент. При следующем расчете необходимо из нового воздействия вычесть прошлое и также * 100мс и крутить привод уже в зависимости от знака в ту или иную сторону.

Точность механизма конечно получиться не какая, но И составляющая в итоге устранит ошибку регулирования.

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

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

nik182 пишет:

ПИД это перебор, а вот ПИ будет в самый раз. Реализовать его в вашем случае просто - заведите переменную и накапливайте значение разности между уставкой и текущей температурой. При привышении порога интегрирования даёте команду на действие и обнуляеете накопленное значение. Важно что бы постоянная времени интегратора была больше чем у цепи цепи измерения - реакции.

а можно поподробнее, попроще, на пальцах, с примером?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Mr.Privet пишет:

nik182 пишет:

ПИД это перебор, а вот ПИ будет в самый раз. Реализовать его в вашем случае просто - заведите переменную и накапливайте значение разности между уставкой и текущей температурой. При привышении порога интегрирования даёте команду на действие и обнуляеете накопленное значение. Важно что бы постоянная времени интегратора была больше чем у цепи цепи измерения - реакции.

а можно поподробнее, попроще, на пальцах, с примером?

П- пропорцеональная составляющая, создает воздействие пропорционально ошибке регулирования

И- интегральнальная составляющая, накапливает сумму ошибок

Д- реагирует на скорость изменения ошибки регулирования

Прочитайте про регуляторы для начала.

Logik
Offline
Зарегистрирован: 05.08.2014

yul-i-an пишет:

Д- реагирует на скорость изменения ошибки регулирования

 

Д - это дифференциальная составляющая. Только правду! Не надо нас жалеть! )))

nik182
Offline
Зарегистрирован: 04.05.2015

Logik пишет:

yul-i-an пишет:

Д- реагирует на скорость изменения ошибки регулирования

 

Д - это дифференциальная составляющая. Только правду! Не надо нас жалеть! )))

Да Да! Именно диффиренциальная, или реакция на производную по времени. Учитывая что быстро охладить или нагреть воздух в квартире  через маленькую дырочку форточки ну ни как не получится, то именно дифференциальная составляющая в данном регуляторе не актуальна. Пропорциональная нужна при первом включении. Остальное время будет работать только интегральная часть. В силу медленного изменения температуры.

Dmitriysokol
Offline
Зарегистрирован: 03.06.2016

А если использовать актуатор от спутниковых антен? или какой-нибудь моторчик шаговый от автомобиля. Нужна максимально простая реализация. Возможно ли  считывать угол поворота привода? Если брать серву, то скорее всего ее усилия не хватит для открытия окна, и да, не указал в верхней теме, тут не в комнате форточка, а в теплице.

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Можно организовать "медленный ШИМ форточкой" :)

Взять окно времени к примеру 20 минут (это будет период медленного ШИМ). Так если нам нужно открыть форточку на 15%(заполнение ШИМ) то значит что каждые 20 минут будем открывать её на 3 минуты, после чего закрывать.

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

Недостаток - привод в постоянном движении.