МОДУЛЬ ТЕРМОСТАТ

Всё, что не подходит под вышеперечисленные разделы

Модератор: immortal

Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение xor » Ср янв 03, 2018 1:49 am

Не удовлетворяет такой способ термостатирования.
Как-то грубо, даже если трешолд маленький поставить.
На картинке пример уставки 23 градусов с трешолдом 0,01. Температура гуляет от 22,7 до 23,5 - больше градуса. При использовании ПИД-регулятора можно добиться точности регулировки 0,1 градуса. Вроде, где-то на форуме была реализация на php. Не могу найти. Может, кто пнёт?

ps/ С Новым годом!
Вложения
2018-01-03_01-21-03.png
2018-01-03_01-21-03.png (59.57 КБ) 5807 просмотров
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение serghei » Ср янв 03, 2018 9:03 am

Тут гдето близко , но может не то?
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение olehs » Ср янв 03, 2018 3:05 pm

Вот класс PID-регулятора
Вложения
PIDController.txt
(7.12 КБ) 706 скачиваний
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение olehs » Ср янв 03, 2018 3:26 pm

А вот еще один с поддержкой PonM
Вложения
NewPIDController.txt
(6.14 КБ) 712 скачиваний
За это сообщение автора olehs поблагодарил:
xor (Ср янв 03, 2018 4:28 pm)
Рейтинг: 1.16%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение sergejey » Чт янв 04, 2018 11:20 am

olehs писал(а):А вот еще один с поддержкой PonM
А можете код с комментариями вывести? Хотел бы добавить этот алгоритм в Простые устройства для термостата, но что-то не очень понимаю, как он работает.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение olehs » Чт янв 04, 2018 3:57 pm

sergejey писал(а): А можете код с комментариями вывести? Хотел бы добавить этот алгоритм в Простые устройства для термостата, но что-то не очень понимаю, как он работает.
Тут есть один важный момент. Отличие первого класса от второго не только в наличии PonM, а и в алгоритме запуска расчета.
Для вычисления D-компоненты важен период времени, за который произошло изменение.
Так вот в PIDController для расчета нужно вручную запускать метод getPid, а он уже рассчитает дельту времени с момента последнего запуска.
NewPIDController же умеет сам запускать расчет (создает таймер) с периодичностью, указанной в свойстве sampleTime (в секундах).

Кроме того нужно учесть, что PID-регулятор подразумевает наличие у регулируемого устройства плавной регулировки. Если ваше устройство умеет только вкл/выкл, нужно добавлять алгоритм типа ШИМ, т.е. например при PID=40 устройство за один "фрейм" (равный для примера 10сек) должно 4 секунды быть включено и 6 выключено.
Этого алгоритма нету ни в одном из классов, его нужно наворачивать сверху.

Для работы PIDController нужно указать:
1. direction - направление регулировки: 0 - прямое, 1 - обратное. Например, увеличение мощности нагревателя приводит к повышению температуры - direction=0
2. Коэффициенты PID (proportional, integral, differential) - тут, думаю, все понятно.
3. minSaturation, maxSaturation - минимальное и максимальное выходное значение регулятора. Например, у меня термоклапан начинает открываться при 60% мощности, т.е границы регулировки у меня 60-100
3. setPoint - это желаемое значение регулируемого параметра, например желаемая температура.
4. inputVal - обратная связь. Сюда должно попадать текущее значение регулируемого параметра, т.е. например значение с датчика температуры.

В результате вызова метода getPID в свойстве PID появится значение регулировки (т.е. например, мощность нагревателя).
Еще объект хранит некоторые промежуточные значения в свойствах lastInput, lastRun, period, ITerm.

Для работы NewPIDController нужно указать (детальное описание аналогичных свойств см. выше):
1. direction - направление регулировки
2. Коэффициенты PID (kP, kI, kD)
3. min, max - границы регулировки
3. PonM (0/1) - использовать ли Proportional on Measurement алгоритм регулировки
4. sampleTime - периодичность запуска расчета pid (в секундах)
5. setPoint - целевое значение регулировки
6. input - обратная связь, сюда должно попадать значение с датчика
7. active - (1/0) - вкл/выкл таймер PID

Если active=1, по таймеру будет запускаться метод compute. Результат работы попадает в свойство output. Есть еще вычисляемое свойство outputPercent, которое показывает в процентах значение output в границах min/max (для отображения на графиках в одном масштабе)
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение sergejey » Чт янв 04, 2018 4:23 pm

olehs писал(а):Кроме того нужно учесть, что PID-регулятор подразумевает наличие у регулируемого устройства плавной регулировки. Если ваше устройство умеет только вкл/выкл, нужно добавлять алгоритм типа ШИМ, т.е. например при PID=40 устройство за один "фрейм" (равный для примера 10сек) должно 4 секунды быть включено и 6 выключено.
Этого алгоритма нету ни в одном из классов, его нужно наворачивать сверху.
М... с этим проблема. У меня клапан на радиаторе минуту не меньше меняет положение из открытого в закрытое. Может ли алгоритм быть адаптирован с учётом такой инерционности?

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение olehs » Чт янв 04, 2018 4:40 pm

Тут есть несколько вариантов:
1. Если ваш клапан все-же поддерживает плавную регулировку (обычную ШИМ-регулировку, многие парафиновые это умеют, надо смотреть доки), можно собрать для него контроллер или купить готовый (гуглить AC Dimmer)
2. Установить довольно маленький фрейм (например 10 сек). В таком случаем будет реализована псевдо-регулировка мощности. У этого варианта есть минус - эта регулировка ни разу не линейная :). Т.е. клапан может открываться при 70 % мощности, а закрываться при 20.
3. Установить заведомо большой фрейм (больше времени открытия/закрытия клапана). В таком случае регулировка буде происходить почти полным перекрытием/открыванием клапанов. Не уверен, что такая регулировка полезна для самой системы отопления.

У меня клапана стоят на радиаторах центрального отопления и я использую 3-й метод с фреймом в 100 сек. В принципе, температура держится в пределах +-0,2 градуса.
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение xor » Пт янв 05, 2018 9:42 pm

Сейчас пробую медленный ШИМ для электроконвектора 2кВт вкл/выкл релюхой

Код: Выделить всё

//интервал 3 минуты
//100% - постоянно вкл
//0%   - постоянно выкл
//х%   - х*(3 минуты/100) вкл, (100-х)*(3 минуты/100) выкл
//to do - учесть t на улице
//$rl = $param['relay'];

$rl = 'nl9'; //$param['relay'] - obj's name
clearTimeOut($rl.'_pid');
$prt = 0;
$Input = (float)gg('temp_00.value'); //текущая температура
$Target = 23.0; //желаемая т-ра
$kp = 1.1; //коэфф пропорционального регулирования
$ki = 0.01; //не использую пока
$kd = 1.0; //не использую пока

$timeSample = 1.8; //1/100 периода = 3 минуты/100

$error = $Target - $Input;
if($error>0){ //мы можем только повышать t
 $prt = min($kp * $error,1.0);  //0..1
}else{ //значение выше уставки
 $prt = min(-$kp * $error,0.2); //компенсация потерь, сначала можно=0
}
 $prt = (int)($prt * 100);
 debmes ('Target ='.$Target);
 debmes ('Input ='.$Input);
 debmes ('error ='.$error);
 debmes ('prt ='.$prt);
//ШИМ
if($prt==0){
   if(gg($rl.'.status')==1){cm($rl.'.turnOff');} //просто выключим
   return;
}else{
 if(gg($rl.'.status')==0){cm($rl.'.turnOn');} //включим <--------------------edited
  setTimeOut($rl.'_pid','cm("'.$rl.'.turnOff");',$prt*$timeSample); //подождем и выключим
}
Последний раз редактировалось xor Пт янв 05, 2018 11:24 pm, всего редактировалось 1 раз.
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: МОДУЛЬ ТЕРМОСТАТ

Сообщение xor » Пт янв 05, 2018 9:50 pm

2018-01-05_21-44-58.png
Вот что получилось
2018-01-05_21-44-58.png (76.73 КБ) 5633 просмотра
Сейчас с коэффициентами играюсь, на рис. показана реакция на открытую форточку
Ответить