stell_hawk

<<< Назад

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

Что такое Электротермическая головка: тут
Зачем нужно погодозависимое управление тут
другие статьи связанные с этой темой: тут тут тут

Для понимания того как это работает советую посмотреть видео Дмитрия Лимите
я всё то, что там сказано особо повторять не буду.

В данном случае запрограмирован ПИ регулятор,который смотрит температуру и подачи и обратки.
Исходя из отклонения обратки изменяется уставка подачи.
чтобы не перегреть систему на подаче установлено ограчение в 50 градусов.
на каждом шагу(каждые 10 секунд) система принимает решение подать или снять питание с термоголовки.

код до безумия прост:


//PRESENT_VALUE -текущее значение
//SET_VALUE - уставка обратки
//SET_VALUE2 - уставка подачи
E_1 = SET_VALUE -  PRESENT_VALUE; // Текущее рассогласование
  D_T = K_P*(E_1 - E_2 + 10.0*E_2/K_I); // Приращение на текущем шагу регулирования в цикле 10 секунд
  E_2 = E_1; // Запись рассогласования -1 шаг назад 
  SET_VALUE2 = SET_VALUE2 + D_T;
  SET_VALUE2 = constrain(SET_VALUE2, SET_VALUE, 50.0); //Ограничение уставки подачи от SET_VALUE до 50.0 градусов  

  if(PRESENT_VALUE2<SET_VALUE2)
  {
  power=max_power;
  }
  else
  {
  power=min_power;
  } 

значение min_power и max_power выбираются исходя из особенностей Вашей термоголовки.
в идеале эти значения должны быть 0 и 100. однако учитывая остаточный нагрев головки и тот факт, что головка намного быстрее закрывается чем открывается.
надо найти такие значения при которых время закрытия и открытия будут приблизительно уравняются.
в моем случае отпимальными значениями стали 85 и 100. именно с них Вам стоит начать если будете повторять мой эксперимент.

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

Система с легкостью может быть переделана на регулирование по подаче.в таком случае

E_1 = SET_VALUE2 -  PRESENT_VALUE2;

возможно коэфициенты K_P и K_I немного поменяются. однако вопрос ПИД регулирования всегда начинается с подбора оптимальных коэфициентов. поэтому это в любом случае прийдется сделать.

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

float setvalue(float out)
{
  if(out>10)return 25;
  if(out>5)return 26;
  if(out>0)return 27;
  float value=OUT_ZERO_VALUE-out*(OUT_25_VALUE-OUT_ZERO_VALUE)/25;
  value=(float)round(value*5); 
  value=value/5;
  return value;
};

OUT_ZERO_VALUE - температура которая должна быть при нуле на улице
OUT_25_VALUE - температура которая должна быть при -25 на улице
тут зашито три дополнительных проверки: больше 0 -> 27 градусов, больше 5 -> 26 градусов, больше 10 -> 25 градусов
при этих температурах линейность терятся от слова совсем поэтому стоит так. у Вас может быть совсем по другому.
далее идет округление вычисленной температуры до 0.2 градуса, чтобы каждый цикл не происходило изменение уставки,.а она имела хоть какую-то дискретность.

ШИМ Регулирование 220вольт
Как оказалось при управлении 220 Вольт не получится использовать просто порт Ардуино в режиме ШИМ. потому что частота ШИМ должна быть Не более 100 Гц(а может быть и 50 Гц) - тут мои познания немного страдают. Но это является фактом, частоты которые ВЫ сможете выбрать для регулирования на самой ардуино приведут к тому что ШИМа на реле не будет.

Поэтому единственным вариантом ШИМ 220 воль переменного тока является так называемый медленный ШИМ.
его работа в коде тут
Суть кода заключается в следующем, когда пришло время нового цикла
в функцию приходит значение power это и есть длительность импульса в процентах
в иных случаях в функцию приходит значение power=-1
таким образом функция знает в неё обратились с целью именения установок или с целью исполнения установленного шим.
Когда power>-1 устанавливается

 digitalWrite(RELAY_PIN, HIGH_LEVEL);

и начинается отсчет времени сколько такое состояние должно держаться

   high_level_time= power*1000/100*CYCLE;
    low_level_time=(CYCLE*1000)-high_level_time;

Когда приходит время измениться состоянию состояние меняется на обратное

if(PinState!=LOW_LEVEL&&(millis()-relay_time)>high_level_time)
      {
        digitalWrite(RELAY_PIN, LOW_LEVEL);
    }

Управление реле
Реализация первого классического ПИД регулятора, где значение ШИМ на каждом шаге уменьшается или увеличивается исходя из изменений параметров системы неудалась.
Первой проблемой которая мешает классическому пид регулированию является тот факт, что реле включающее нагрузку имеет переходной процесс который не идеален, и из-за этого система имеет остаточное напряжение что конечно плохо отражается на работе головки -об этом я писал тут.
Так же мне хотелось контроллировать все параметры в котельной поэтому система снимает много больше показаний с датчиков температуры, чем ей нужнно, с 7 датчиков.
Вторая проблема выражалась в том, что часто от цикла к циклу (размер цикла 10 секунд) были пропуски т.е. реле вообще не включалось.

Оказалось, что нормальное состояние регулятора - головка колеблется в пределе 80%-100% заполнения шим сигнала.(0-2 секунды длительность импульса)
Изрядно поковырявшись в коде я обнаружил, что на опрос 1 датчика температуры система тратит около 200 мс времени. в моем случае если необходимо было держать состояние выхода арудины в том или ином состоянии менее чем 1 секунду из-за опроса датчиком случалось так что уже наступало время нового цикла ПИД регулирования и часть кода которая отвечала за изменение состояние реле просто пропускалась. и чем ближе мы подходили к 100% тем чаще были пропуски.
поэтому от такого регулирования принято решение отказаться. хотя если снизить количество датчиков и вставить вызов функции pid_relay() внутрь цикла опроса датчиков (т.е. выполнять функцию между каждым опросом каждого последующего датчика температуры) то "мертвое" время можно сократить до 200 мс.
есть опасение что этого будет недостаточно. уменьшение мертвого времени можно добиться применив аналоговые датчики температуры.

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

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


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

Чтобы избежать проблемы разного хода штоков я подложил гайку. разница между ходами составляла около 2мм. гайка была 4 мм.
поэтому система работала, но не перекрывала полностью байпасную линию.Этот ньюанс я победил просто не плотно прикрутив головку.
система работала хорошо. был написан классический пид регулятор. float pid()
Как раз при настройке работы с данной головкой вскрылись подробности связанные с временем считывания показаний с датчиков температуры

на графике показаны значение температуры, уставка, и мощность передаваемая на шим описанный выше.
Система в целом работала стабильно, но раскачивала сама себя за счёт транспортной составляющей(в среднем 12 минут от момента приоткрытия клапана до момента изменения температуры на обратке).
разброс 4,2 градуса. (+/- 2,1). средняя температура за сутки практически равна уставке(K_P=5, K_I=1000). в целом такая система может спокойно регулировать теплый пол.

Однако оставлять систему в которой головка прикручена на глаз было не продуктивно.
Я потратил сутки, но нашел в нашей деревене - Новосибириске, у одного из официальных диллеров родную головку 220В нормально открытую.
для системы лучше было бы использовать головку на 24 Вольта, но к сожалению в наличии её не было.

Родная термоголовка - белая

Поставив родную головку меня ожидал сюрприз -система не заработала для данной головки. проблема крылась в том что для фирменной головки watts 22CX,
видимо в целях экономии потребляемой энергии, использовали как написано в инструкции "встроенный нагревательный элемент (PTC)"
а он в зависимости от начальной точки нагрева имел динамическое значение мощности необходимой для сдвига головки. поэтому диапазон регулирования сместился в пределы 98-100% что давало время сработки стало крутиться возле 200 мс, чего недостаточно даже для опроса одного датчика.
в системе начались глобальные пропуски действий.
Был написан очень сложный алгоритм float pid2(),который анализировал кучу параметров и мог смотреть не только в завтрашнйи день, но и..... ну вы поняли....
результат он дал не очень хороший. в течении двух дней мы пытались сделать корректировки и уточнения, но это не особо помогало, по сути мы смогли добиться только результата схожего с работой зеленой головки.

На третий день Дмитрий, на основе тех кусков кода что я ему слал, прислал простой и лаконичный код, описанный в самом начале статьи,. что удивительно -код скомпилировался с первого раза. я даже проверять его не стал. закинул и всё заработало.

В текущий момент колебания системы в основном укладываются +/-0,2. однако в моменты изменения суещственного изменения ситуации (включился котел или открылся или закрылся конутр теплых полов) случаются вылеты до +/- 2 градусов.

графики работы моей системы доступны в режиме онлайн по ссылке

Для реализации использован arduino 2560+ARDUINO YUN SHIELD.+ 3 датчика ds18b20
Мне очень не нравится использовать w5100/w5500/enc28j60 для ардуино . это всегда приводит к глюкам работы системы.
не так давно я прикупил на али yun shield -штука довольно интересная. это шилд который на борту имеет линукс. и работает с ардуино через консоль.
не знаю как по Вашим, но по моим ощущениям когда ардуина работает без общения с внешним миром(радио, блютуз, вайфай, провод) она работает стабильно.
в данной связке получается что за работу с сетью отвечает другая железка, и пока что она работает около месяца - и полет отличный.

код доступен тут
как настроить код есть в описании к программе на гитхабе.

Систему можно повторить на любом: самом дешевом контроллере или наоборот на очень стабильном контроллере.
Ей необходимо всего 3(или даже 2) цифровых входа и 1 цифровой выход.

Запись в базу данных
В связи с тем? что цикл всего 10 секунд запрашивать данные со стороны сервера было бы неразумно
за интеграцию отвечает вот этот код
на стороне сервера должна быть таблица dump.sql и файл dragino.php который принимает значения в таблицу.

Интеграция с мажордомо

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

ЗЫ: каждую картинку в статье можно нажать правой кнопкой и посмотреть в нормальном виде.
а так же можно поизучать графики онлайн.
там есть множество разделов. которые показывают много интересного :-)

Обсуждение (0) (4)

Смотрите так же:
16.02.2020 Регулирование трехходым смешением по подаче или по обратке?
06.02.2020 О разряде батареи датчиков температуры и влажности xiaomi
30.12.2019 Управление трехходовым клапаном нажимного действия с помощью электротермической головки
28.12.2019 Погодозависимое управление теплыми полами при трехходовом смешении
28.12.2019 Не все твердотельные реле одинаково полезны.
28.12.2019 Электротермическая головка. что внутри?
07.10.2019 Считываем показания с газового счетчика BK с помощью датчика открытия дверей от Xiaomi
07.10.2019 Простые устройства (ПУ)->Тип:Счётчик (counter) подключение к датчику импульсов

Новосибирск, Россия

На форуме: stellhawk