Drivent и PID регулирование - не наш метод. Собственная логика регулировки CO2 в спальне с помощью оконного привода

27 апреля 2020, 17:03

О влиянии высокой концентрации углекислого газа (CO2) в помещении, я писал в цикле статей про климат. А так как у меня умный дом, то и за микроклиматом у себя в квартире я следил довольно пристально. И мне надоело постоянно проветривать спальню перед сном, или держать окно открытым в режиме микропроветривания (особенно зимой).

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

Итак, исходное состояние:

Датчики работают под управлением ESPEasy на nodeMCU v.3. Место замера - недалеко от изголовья кровати, дабы замерять фактическое состояние именно там, где необходимо.

Привод установлен на окне в спальне и регулировка осуществляется по показаниям уровня CO2. На начальном этапе, контроля температуры не было, так как было не до того.

Первоначально была попытка использовать алгоритм ПИД регулирования. Она привела к состояниям постоянного перерегулирования системы, которая не достигала состояния покоя ни по показателям CO2, ни по состоянию привода (он постоянно туда-сюда двигался). Поверьте мне, я даже математическую модель считал... Но при пропорциональном коэффициенте равном единице, без использования других параметров (а так советуют все статьи по первоначальной настройке регулятора) - система не достигала покоя никогда. Смена временных интервалов с увеличением до нескольких часов и т.д. и т.п. - не помогала.

1600x_image.png?1587994743
1600x_image.png?1587994743

Я занимался мучением привода почти месяц (хороший такой краш тест устроил), так же, как и настройкой ПИД компонента в Node Red. Кроме того, что система постоянно подвергалась регулировке, меня не устраивало много других факторов.

Во-первых,  система не приходила в покой вообще никогда, по причине постоянно меняющейся внешней среды. CO2 оставался в желаемом коридоре - это факт, но достигалось это постоянной работой привода на открытие и закрытие окна.

К тому же у ПИД регулятора не было нужных мне настроек, например, с добавлением пороговых показателей и коридора значений.

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

Еще одной предпосылкой к разработке собственного решения меня привел тот факт, что во время вынужденного простоя привода (я его отключил по определенным причинам), окно было открыто где-то на 15% постоянно. И это привело к довольно ожидаемому результату, который, в общем-то, и был целевым. Постоянное нормальное состояние уровня CO2 в комнате.

1600x_image.png?1587994742

Это, по-сути и стало последней каплей в этой битве с ПИД регулировкой и сподвигло меня "запилить" свою логику.

Так как я далеко не программист, то мне помог наш прекрасный чатик по Node Red, а благодаря абсолютно неоценимой помощи Андрея Ошева, все это превратилось в рабочую модель, которая сейчас проходит обкатку и мне нравится результат.

Логика работы

Так как инертность системы небольшая, то есть реакция наступает практически сразу после оказанного воздействия, опрос датчика CO2 производится с периодичностью раз в 10 секунд. Это избыточно, но мне хотелось наблюдать над раскачкой системы, если она произойдет.

Опять же, так как система реагирует быстро, то показания могут гулять вверх и вниз довольно оперативно, и основная проблема регулирования заключается в том, что если мы берем просто определенный период времени, то мы можем случайным образом попасть на снижение, повышение или горизонталь значений CO2. Соответственно, принятие решения о том, открывать окно, дабы снизить CO2 или прикрыть, так как все ок - будет делаться каждый раз, когда будут поступать показания и привод будет дергаться туда-сюда постоянно. Правда через заданные промежутки времени, но все равно часто. Это и есть основная проблема PID регулирования. На каждый входящий параметр осуществляется действие. Меня это не устраивало. Поэтому я решил, что надо отслеживать тенденцию показаний уровня углекислого газа, и в зависимости от нее принимать решение. Поэтому мы будем действовать в несколько этапов.

Первое действие, которое производится с показаниями - сборка массива из 20 последовательных данных. Это требуется для того, чтобы понять, что происходит с уровнем CO2 и что нам нужно сделать в дальнейшем.

Эти 20 параметров анализируются следующим образом:

  • каждый элемент массива сравнивается с предыдущим, путем вычитания (из значения под номером 2 вычитается значение 1, из 3 вычитается 2 и так далее);
  • подсчитывается количество отрицательных, положительных и нулевых значений;
  • сравнивается их количество, и в зависимости от того, каких больше, выдается результат;
  • дополнительно из всех 20 значений вычисляется среднее, чтобы использовать его как текущее показание CO2 в дальнейшем.

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

Следующим этапом мы настраиваем параметры комфортной среды и пограничных условий работы системы.

В качестве исходных данных берутся следующие значения:

  • текущее положение окна;
  • скорость ветра;
  • минимально допустимая температура в помещении;
  • текущая температура в помещении;
  • состояние регулирования окна (включено оно или нет);
  • состояние показаний CO2 из предыдущего шага (повышение, снижение или покой);
  • следующий уровень открытия окна;
  • шаг регулирования окна;
  • верхний и нижний пределы для окна (обычно от 0 до 100%);
  • собственно, само показание CO2 усредненное в прошлом шаге.

А теперь немного пояснений на тему того, зачем все это. Положения окна - понятно: текущее, предыдущее и следующее, нужны для управления приводом.

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

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

Что касается температуры в помещении, то на личном опыте я понял, что мне комфортно спать при температуре не ниже определенного порога. Соответственно, я не хочу, чтобы она опускалась ниже. Поэтому если уровень CO2 позволяет мне подержать окно закрытым, чтобы воздух нагрелся, то окно закрывается и ждет либо достижения максимума содержания газа в воздухе, либо его нагрева до приемлемых значений, чтобы продолжать работать системе для проветривания.

Состояние показаний CO2 из предыдущего шага используется для того, чтобы понять, в какую сторону воздействовать на привод: открывать, закрывать или ничего не делать.

Соответственно, со всеми этими пороговыми значениями мы работаем следующим образом (блок схему я начал рисовать, но как-то ниасилил):

  • если CO2 больше 800, но состояние "покой", то меняем состояние на "повышение" (открывает окно на следующий шаг), чтобы не зависало на повышенных показаниях;
  • если CO2 находится между 600 и 700, то в любом случае объявляется состояние покоя (это целевой коридор показаний);
  • если CO2 меньше 600 и состояние "покой", то меняем состояние на "понижение" (прикрывает окно на следующий шаг);
  • если CO2 больше 800 или меньше 500, то шаг изменения открытия окна устанавливается в 5%;
  • если CO2 находится в промежутке от 500 до 800, то шаг изменения открытия окна устанавливается в 2%;
  • если скорость ветра больше 7 м/с, то шаг изменения открытия окна делится на 2, с округлением до целого значения;
  • если состояние открытия окна - "повышение", то к текущему состоянию прибавляется шаг. Если состояние - "понижение", то от текущего состояния отнимается шаг. Если система в покое, то ничего не происходит;
  • если температура в комнате ниже лимита или равна ему, а CO2 меньше 1000ppm, то окно закрывается полностью и дальше начинает по предыдущим условиям открываться понемногу, опять же при условии, что температура выше допустимой.

Вот в общем-то и вся логика.

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

В итоге, все это меня радует уже скоро неделю, и меня устраивает почти все.

Выглядит ситуация сейчас примерно таким образом:

1600x_image.png?1588007019

Регулировка осуществляется плавно, пограничные параметры не нарушаются, хотя замеры немного нетипичны и уровень СО2 довольно высокий, в сравнении с обычным состоянием, но я грешу на тепло и то, что в моем вентиляционном стояке все дружно решили проветрить квартиры, поэтому тяги почти нет и сквозняк практически не ощущается. Но даже в таких, довольно тяжелых условиях, система работает стабильно и без особых раскачек.

Ну и напоследок - флоу для Node Red, в котором это все расписано (перед импортом флоу в свой нодеред, его надо прогнать через HTML декодер, чтобы заменить HTML вставки). Там, в принципе, все довольно понятно, правда для использования потребуется много телодвижений по формированию глобальных переменных, которые у меня собираются в разных местах (потому в общем-то и глобальные).

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


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Никита Герасимов  (Rapidshe)
    Drivent 6 месяцев назад

    Можно попробовать подогревать воздух кондиционером при допустимой температуре работы внешнего блока

    • Виталий Никольский (bigmanekb)

      для этого надо иметь кондиционер :) к тому же есть обратный вариант... лето, кондиционер и открытое окно - несовместимы... так что тут тоже надо думать, но это просто уже дополнительные переменные.... может я все таки соберусь поставить себе кондей наконец. Особенно если Haier засветит бюджетную управляемую модель, как рассказывал Олег на вчерашнем стриме

      • (annenkov)
        (annenkov) 6 месяцев назад
        То есть отопление зимой и открытое окно совместимы, а охлаждение летом и открытое окно несовместимы... Где логика?

        • Виталий Никольский (bigmanekb)

          отопление чаще всего центральное и очень часто нерегулируемое. В этом случае бессмысленно. К тому же отключать отопление и открывать окно с минусовым воздухом - чревато разморозкой системы. Я как то раз устроил по молодости такое.

          А вот открывать окно при работающем кондиционере - свихнет ему мозги и смысла никакого кроме бесполезной траты ресурсов :)

  2. Бендер Задунайский (Nathareth)
    Бендер Задунайский (Nathareth) отредактировано 6 месяцев назад

    Сам привод не совсем конечно для спальни. Посмотрел видео, привод изрядно жужжит. В ночи все слышнее.
    Было бы здорово на каких-нибудь бесшумных движках. У меня терморегуляторы на 220В, даже припав ухом не слышно как шток толкают.

    • Виталий Никольский (bigmanekb)

      с определенными настройками он практически бесшумен. Жужжит он при стандартных параметрах напряжения, но если выставить 24В питания и 6В самому мотору, то он очень тихий

    • Виталий Никольский (bigmanekb)

      терморегуляторы только открытие и закрытие без промежуточных ?

      • Бендер Задунайский (Nathareth)

        Да, там или открыто или закрыто. В зависимости от выставленного температурного коридора sonoff basic открывает или закрывает. Все просто и совсем бесшумно.

        • Виталий Никольский (bigmanekb)

          сонофф бесшумный ? да лаааадно :)))) хотя я полагаю он не в спальне стоит конечно. Но два положения это два положения... можно конечно гистерезис замутить, но инертность системы большая да... в общем окном получается точнее рулить показаниями. Но это не про отопление. Бесшумных оконных приводов я не встречал, но вот бризеры вполне себе бесшумные. И мы сегодня описанную в статье логику прикрутили к 150й модели бризера Xiaomi. Так что посмотрим на результат.

          • Бендер Задунайский (Nathareth)
            Бендер Задунайский (Nathareth) отредактировано 6 месяцев назад

            Бесшумный! Чтоб мне провалиться ) Просто он стоит под подоконником в метрах 4-х от кровати. У меня чуткий сон, но я его за зиму не слышал ни разу. А всякое жужжанье услышу мгновенно.

            Гистерезисы мутить бессмысленно. Я изучал графики, после этого принял решение так и оставить. Оговорюсь - вариант не для экономии, потому что даже в лютую зиму у меня окно в откидном положении всю ночь. Привычка. Зато сплю как танк )
            Температурный коридор: включение  меньше 18 градусов, выключение - больше 19. В среднем за ночь цикла 3-4. Остывают очень медленно, нагреваются мгновенно, а потом идет набор 1-2 градусов за час-полтора. Так как зима была теплая, большей частью система находилась в покое. 

            Но если рулить еще и окном, тут уж сразу, ясное дело, появляется существенная экономия средств.

  3. Сергей Сафронов (deda)
    Сергей Сафронов (deda) отредактировано 6 месяцев назад
    Комментарий удален
  4. Сергей Сафронов (deda)
    Сергей Сафронов (deda) 6 месяцев назад

    Норм

  5. (vadimvspb)
    (vadimvspb) 6 месяцев назад

    Вроде оставлял комментарий, пропал куда-то. А не слишком ли жарко в спальне? По западным исследованиям лучшая температура для крепкого сна 16-20 градусов Цельсия.

    • Виталий Никольский (bigmanekb)

      с учетом обдувающего ветерка - норм :)))) комфортная 18, это если спишь под одеялом... а я не люблю кутаться :))) так что мне комфортно 22.2, хотя я экспериментировал и с более низкими температурами, но на фоне легкого прохладного бриза - 22.2 мой уровень комфорта

К списку статей

Устройства в материале

Оконный привод Drivent

Производитель: Drivent

ESP8266 NodeMcu v3

Производитель: Espressif Systems
Заказать на:
JD

Датчик co2 Senseair s8-53

Производитель: noname
Заказать на:

Датчик давления/температуры BMP280

Производитель: noname
Заказать на:

Скидки для сообщества

Z-Wave Ukraine

+380 68 641 9670
Промокод:
Sprut-UA
Размер скидки:
15%

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
02 ноября 2018, 12:14
Кнопка звонка с уведомлениями в HomeKit
15 октября 2018, 09:05
Прошивка для Sonoff c нативным HomeKit
15 ноября 2018, 09:42
Способы автоматизации механических ворот
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
01 октября 2018, 07:43
Нативный HomeKit на ESP8266
02 июля 2020, 07:24
Я хочу поделиться своей разработкой: "умным открывателем пластикового окна". В статье вы найдете все необходимое, чтобы повторить проект и изготовить собственный привод для открывания окна с использованием штатной фурнитуры окна.
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
02 октября 2018, 18:41
Установка SDK для компиляции прошивок под HomeKit