Система управления климатом теплицы
Компания: Быстрые Проекты
Город: Дагестан. Махачкала
Используемая продукция ОВЕН:
Заказчиком, который перенял голландский опыт, было создано техническое задание с описанием математической модели управления климатом теплицы. Модель предусматривает нейросетевой (самообучаемый) алгоритм, который позволяет определять оптимальные климатические параметры различных частей теплицы в соответствии с внешними условиями окружающей среды.
По началу при реализации проекта были некоторые сомнения, что контроллер ОВЕН ПЛК110-30 [М02] справится с данной задачей. Однако он прекрасно с ней справляется и показывает хорошие результаты по производительности.
В теплице присутствует собственный раздел метеостанции, который собран на базе покупных элементов и созданного прикладного программного обеспечения.
Система визуализации создана от общего к частному. При взгляде на общий кадр агроному должны быть понятны все основные параметры работы зон, такие как температура стекла, направление ветра, интенсивность солнечной активности, наличие/отсутствие осадков, сила ветра, температура наружного воздуха.
В системе присутствует 16 фрамуг, которые обеспечивают вентиляцию и регулирование качественных параметров микроклимата внутри теплицы: качества воздуха, СО2, температуры и влажности.
Создана зона управления тепловым пунктом. Осуществляется управление центробежными насосами и регулирование 8-ю контурами отопления. Горячая вода подается от внешней котельной.
Для рассадного отделения создана система подсветки физиологическим спектром по расписанию с коррекцией по уровню освещения.
В системе управления используется оборудование ОВЕН:
- Контроллер ПЛК110-30 [М02].
- Преобразователь интерфейсов АС3-М.
- Датчик СО2 ПКГ100-СО2 – 2 шт.
- Датчик температуры и влажности ПВТ100 – 4 шт.
- Релейные модули вывода МВ110-224.8Р – 7 шт.
Из прочего оборудования используются датчики: силы ветра YGS-FS, направления ветра YGS-FX, качества воздуха REGELTECHNIK, дождя Rain and snow Transmitter sensor и солнца Solar Radiation Sensor TSIS. А также модули подключения цифровых термосопротивлений .
Задание микроклимата позволяет выдерживать определенную температуру и градиент прироста температуры в 4 промежутках времени суток (24 часа делится тремя уставками). При переходе заданных временных границ температура начинает меняться от одного значения к другому с заданной скоростью, обеспечивая плавность работы всей теплицы. Тем самым создается комфортная среда для роста растений.
Гибкие в настройках графики MasterSCADA обеспечивают детальный анализ ситуации, происходившей в системе с удобным просмотром истории происходивших изменений.
Во всех зонах теплицы создана система плавного изменения температур в соответствии с задаваемым расписанием. Изменение температуры менее чем градус в минуту позволяет избавить растения от стресса и повысить их урожайность.
Для удешевления системы использовались однопроводные китайские цифровые датчики температур формата 18B20.
Проработана причинно-следственная диаграмма, предназначенная для организации защиты оборудования. При возникновении соответствующей причины на экране загорается красным цветом пиктограмма. На связанном с этими защитами оборудовании на соответствующих мнемосхемах загораются ключи, которые показывают, что данное оборудование включить (открыть) невозможно, оно находится в безопасном режиме. Данные блокировки можно отключить. При нажатии на любую из пиктограмм возникает диалоговое окно, в котором можно пересмотреть положение ключа деблокировки, введя пароль. В этом случае пиктограмма подсвечивается синим цветом.
В настройках системы нейроалгоритма присутствует большое количество настроечных параметров. Авторские права на алгоритм автоматического управления теплицы принадлежат Заказчику данной системы.
Источник статьи: http://owen.ru/project/greenhouse_climate_control_system
Погодный модуль для автоматической теплицы
- Цена: $15,29 + $11.69 (покупалось за $14,44+$9.94)
- Перейти в магазин
В своём предыдущем обзоре я рассказывал об автоматизации дачной теплицы. Обзор закончился на том, что наша теплица научилась поливать две независимые секции (огурцы и томаты) по расписанию, открывать и закрывать форточки по ситуациям внутри теплицы (полив, время, температура, закат/рассвет), использовать тёплую воду (для полива) и холодную (для дождевания во время жары) и, при этом, уметь безболезненно оправляться от сбоев по питанию/водоснабжению. Главным же недостатком являлось то, что теплица ничего не знала о погоде снаружи. Уже в прошлый сезон я наблюдал ситуации, когда льёт ливень, а фрамуги открыты. И хорошо ещё, что в прошлом году не было значительных порывов ветра, а то в интернете полно рассказов, как форточки теплиц выкорчёвывало вместе с петлями и механическими термоприводами.
Закроем эту проблему, построив независимый погодный модуль.
По сути, чёткой привязки погодного модуля именно для работы с теплицей и нет. Модуль — отдельное законченное устройство. Он просто получает информацию о силе ветра, температуре и осадках, программно анализирует порывы ветра и выносит суждения о хорошей или плохой погоде. Точнее, он выносит суждение о том, подходящая ли в данный момент погода для открытых или закрытых форточек в теплице. И по радиоканалу в теплицу сообщает контроллеру, что пора бы закрыть фрамуги или, наоборот, что погода наладилась. Но ничто не мешает принимать и использовать эту информацию не для теплицы, а по своему усмотрению (например, с минимальными доделками скетча, в домашней метеостанции; или сливать эти данные на НародМон).
Самым затратным в реализации проекта оказался датчик ветра, поэтому главным объектом обзора является именно он.
После анализа предложений на просторах интернета, мною был куплен чашечный анемометрический датчик, вынесенный в заголовок. Я ничего не знал о производителе и конструкции, приобретённый лот — это запчасть к их погодным станциям. Оказалось, что его конструкция настолько проста, что я даже не стал делать традиционных фоток типа «распаковка», «с разных ракурсов» и т.д.
Одной единственной картинки будет более чем достаточно.
Датчик конструкционно — это две литые пластмассовые детали: флюгерная часть (три чашки, объединённые с валом) и статорная часть, крепящаяся к опоре. В полусфере ротора расположен магнитик. В статорной части — геркон с припаянным проводом, оканчивающимся разъёмом RG11. И это всё.
За один полный оборот флюгерной части, по задумке конструкторов, геркон должен замкнуться и разомкнуться один раз.
Я подключил датчик к ноге ардуины и попытался посчитать обороты, вращая датчик рукой. Всё вышло именно так, как и ожидалось. Геркон — крайне шумный (в электронном смысле) и помехогенерирующий элемент. Я не знаю, как конструкторы собирались подавлять дребезг (ведь тут применён геркон только на замыкание). У меня каждый раз получалось «плюс/минус погода на Марсе». Потратил день на различные схемные решения и программные методы (включая несколько вилок библиотеки Bounce), вменяемого результата толком не добился: даже на малых оборотах куча ложных срабатываний и дребезга, а уж в боевых условиях, когда период срабатываний будет минимальным, и говорить нечего. Идею применять тут геркон я признал полностью бесперспективной. Я видел только единственную альтернативу: заменить геркон на датчик Холла.
Чтобы не терять времени на нудную и ненужную работу по покупке датчика Холла и постройке минимальной обвязки для нормальной его работы, поступил просто. Взял пыльный заклинивший вентилятор от старого процессорного кулера, у которого было три контакта (питание+датчик оборотов), достал оттуда плату управления целиком и освободил от катушек статора. Плата — кольцевой формы, идеально подходящая во внутренний объём корпуса датчика. Вместо выброшенных обмоток нагрузил микропроцессор бывшего вентилятора парой десятикилоомных резисторов (а иначе он сходил с ума), а сигналы от пробегающего флюгерного магнита штатно снимал с третьего контакта платки. Отличное решение! Никаких ложных срабатываний. Один оборот флюгера — один передний и один задний фронт импульса. А уж подсчитать ардуиной эти передние или задние фронты за секундный интервал — плёвая задача.
С электронной частью датчика ветра разобрались. Теперь его нужно отградуировать. Т.е. превратить частоту (или периоды) импульсов от датчика в метры/сек или км/ч реального ветра. А это уже зависит от количества чаш флюгера, от их объёма и формы, от трения качения в подшипнике, от массы флюгера и других факторов… Словом, калибровка необходима.
Но заставить ветер дуть с различной фиксированной силой, чтобы отградуировать датчик — я не могу. Я не шаман, хотя и сисадмин. Поступил проще. Если мы не можем заставить воздух двигаться с заданной скоростью относительно неподвижного флюгера, то уж заставить двигаться флюгер с заданной скоростью относительно неподвижного воздуха нам вполне по силам!
Для этого нам нужно:
— автомобиль со спидометром;
— открытое окно автомобиля;
— рука, держащая флюгер в этом окне на достаточном расстоянии от корпуса автомобиля;
— стенд, собирающий все данные, необходимые для калибровки.
Стенд в данном случае — это опытная конструкция, собирающая в лог текущую скорость, текущее время и частоту/период, получаемую с датчика ветра. Конструкция собирается лишь на время, и её главная задача — работать правильно и быть достаточно мобильной, чтобы разместиться в движущемся автомобиле.
А дальше был выбран тихий вечер, когда не шевелились даже макушки деревьев, был выбран прямой участок дороги полукилометровой длины, по которой автомобили ездят нечасто и было сделано много-много рейсов «туда-обратно», чтобы свести к минимуму погрешности от теоретически возможного слабого ветерка.
Данные не разочаровали. Всё довольно неплохо укладывалось в линейную зависимость:
Угол наклона прямой — и есть те физические параметры флюгера.
Ардуина пересчитывает частоту импульсов от датчика ветра в привычные нам метры/сек и в удобные для понимания баллы Бофорта.
У того же продавца и в то же время был приобретён и датчик дождя коромысельного типа.
Основой датчика является подвижное коромысло, которое может перекидываться в одно из двух устойчивых положений. Собранные воронкой осадки стекают точно в плоскости, проходящей через ось вращения коромысла. Таким образом, всегда будет наполняться то плечо, которое сейчас выше. И, по мере течения струйки, коромысло будет перекидываться из одного устойчивого положения в другое.
На самом коромысле закреплён магнитик. Догадались? Да-да, в стойке датчика закреплён знакомый геркон. По срабатыванию геркона можно определять, идёт ли сейчас дождь и с какой интенсивностью это происходит.
Вот тут видна плата с припаянным герконом, размещённым в плоскости оси коромысла:
В датчике дождя заменять геркон на датчик Холла я не стал. Тут это действительно неважно. Таких частот, как при вращении флюгера, тут не будет, опрашивать можно спокойно и не торопясь, программно отсекая весь дребезг.
Модуль располагается не внутри теплицы, а на определённом удалении от неё, что очевидно: он находится там, где мне было удобно размещать датчики ветра и дождя и где мне было несложно подать ему питание. Собственно, питание 12v — это единственное, что погодному модулю нужно для работы.
А для связи с теплицей организован радиоканал. Радиоканал я сделал на UART-радиомодулях. Спасибо Юрию за обзор. С этими радиомодулями действительно удобно работать, мне они понравились. Соответственно, контроллер внутри теплицы был дооснащён ответным радиомодулем. Благо, у ArduinoMega аппаратных serial-интерфейсов полно: бери, да пользуйся.
Схематически погодный модуль совсем несложен.
Понижающий DC-DC преобразователь (у меня на KIS-3R33S, но подойдёт любой, токи совсем небольшие) питает ардуину, датчик ветра (поскольку у него внутри плата от старого вентилятора) и радиомодуль.
Ардуина собирает сигналы от платы датчика ветра и от геркона датчика осадков, обрабатывает их и посылает результаты символьным потоком в программный serial-порт, к которому подключён радиомодуль.
Как я уже сказал выше, этот поток можно использовать не только для теплицы. Можно просто логировать этот поток в файл и использовать логи погоды по своему усмотрению. Теплица, со своей стороны, ловит собственным радиомодулем этот поток, выделяет из этого потока только свои ключевые хештеги и реагирует только на них, игнорируя всё остальное, что к ней не относится.
Такой механизм реализован не просто так. Как я выяснил чуть ранее, данные радиомодули спокойно живут на одном канале и в бóльшем, чем 2 шт, количестве. Модули никак не мешают друг другу, а совершенно добросовестно принимают и отправляют всё то, что идёт в данном радиоканале. Если один радиомодуль что-то передаёт, все другие на этом канале спокойно примут этот поток. Если передают сразу два, то в принимаемом остальными модулями потоке никаких битовых коллизий не возникает.
Практически это означает, что на огороде или в доме в будущем могут быть организованы ещё какие-то точки, «подписанные» на радиоканал о погоде или о теплице, и алгоритм должен быть таким, чтобы засорение эфира не приводило к нежелательным последствиям. Да, в данной реализации радиообмен организован на достаточно низком уровне OSI, мне в моей конструкции этого хватает. Если структура разрастётся и станет более сложной, свяжу точки в беспроводную сетку, и тогда уже можно будет реализовать какой-нибудь MQTT поверх TCP/IP. Пока же мне обмена символьным потоком хватает «за глаза», всё просто, надёжно и устойчиво.
Конструктивно погодный модуль прост и лаконичен. Небольшая коробочка, к которой подводится питание и в разъёмы которой подключаются погодные датчики.
Ещё я оснастил эту коробочку маленькой незаметной тактовой кнопкой и парой светодиодов. Мне это было нужно на этапе тестирования всей системы. Помимо основного («боевого») режима, тактовой кнопочкой можно включить принудительную трансляцию в эфир сообщений о, якобы, «плохой» погоде (не взирая на реальные показания датчиков ветра и дождя) или принудительную трансляцию о «хорошей» погоде (аналогично). Тестовые режимы в EEPROM не сохраняются и после включения или перезагрузки погодный модуль будет функционировать в основном, правильном режиме.
Для тех, кто решит повторить описанную тут конструкцию, я приготовил архив с исходником и всеми необходимыми библиотеками.
На случай, если архив протухнет, повторю код ещё и тут:
#include
#include
#include
#include
#include
#include
#define ReposeTime 250 // Период времени, который будет считаться спокойствием
#define ReposeTheres 9 // Критическая сила ветра 9 единиц = 6 bft
#define MaxCountLife 60 // Период учёта максимальной силы ветра, сек
#define AlarmLockLife 4 // Критическое время между порывами ветра, сек
#define RainMaxTime 900 // Период времени, за который не выпадет осадков, сек
#define MaxWeatherInformer 25 //Сводки погоды каждые 25 секунд
#define DHT1PIN 8 // К этому пину подключается датчик температуры
#define DHT1TYPE DHT21 // DHT 21 (AM2301)
#define WindPin 2
#define RainPin 3
#define ButtonPin 10
#define GreenLed 11
#define RedLed 12
int Wcount, Wcount2, MaxWcount, CountLife=0;
int Rcount=0;
int BofortWind=0;
int Repose=0;
byte Alarm=0;
byte AlarmLock=0;
byte PrintLock=true;
byte WeatherPrintLock=true;
byte WeatherInformer=0;
byte Screen=false;
byte Screenmode;
byte Mode=0;
byte RainNow=false;
long RainLength=0;
long LastRainLength=0;
int LastRcount=0;
int LastMinuteRain, MinuteRain=0;
int RainPeriod=0;
byte firsttime;
DHT dht1(DHT1PIN, DHT1TYPE);
SoftwareSerial ss(9, 7); // К этим пинам подключается RadioUART.
Bounce Button = Bounce(ButtonPin,40 );
Bounce Rain = Bounce(RainPin,400 );
void TickEvery1s()
<
Wcount2=Wcount;
Wcount=0;
if (CountLife>0)
if (Repose>0)
if (AlarmLock>0)
void D2Int() <
// Приращение счетчика по прерыванию
Wcount++;
>
pinMode (WindPin, INPUT_PULLUP);
pinMode (RainPin, INPUT_PULLUP);
attachInterrupt(0, D2Int, RISING);
pinMode (ButtonPin, INPUT_PULLUP);
pinMode (RedLed, OUTPUT); digitalWrite(RedLed, HIGH);
pinMode (GreenLed, OUTPUT); digitalWrite(GreenLed, HIGH);
MsTimer2::set(1000, TickEvery1s); // 1000ms period
MsTimer2::start();
Rcount=0;
Wcount=0;
MinuteRain=0;
RainPeriod=0;
PrintLock=true;
firsttime=1;
>
if (Button.update())
if (Mode==1) digitalWrite(RedLed,LOW); else digitalWrite(RedLed,HIGH);
if (Mode==2) digitalWrite(GreenLed,LOW); else digitalWrite(GreenLed,HIGH);
if (Rain.update()) <
if (firsttime==0) <
Rcount++;
MinuteRain++;
RainPeriod=RainMaxTime; >
firsttime=0;
>
if ((WeatherInformer==0) && (WeatherPrintLock==false)) <
switch(Screenmode) <
case 0:
ss.print(“Rain value in minute: „); ss.print(LastMinuteRain);
ss.print(“. Total lenght: „); ss.print(LastRainLength);
ss.print(“ sec. Total value: „); ss.print(LastRcount);ss.println(“.»);break;>
case 1:
ss.print(«Current wind „);ss.print(Wcount2*1.3,1);ss.print(“ m/s, „);ss.print(BofortWind);ss.print(“ bft. „);
GetBofort(MaxWcount);
ss.print(“Maximum wind in minute „);ss.print(MaxWcount*1.3,1);ss.print(“ m/s, „);ss.print(BofortWind);ss.println(“ bft. „); break;>
>
if (Screenmode==0)
h1 = dht1.readHumidity();
t1 = dht1.readTemperature();
printDHT();
WeatherPrintLock=true;
>
delay(10);
>
В константах менять, думаю, ничего не надо. В двух местах при выводе значений в «метрах в секунду» встречается коэффициент 1.3. В процедуре пересчёта в Бофорты этот коэффициент уже учтён внутри таблицы. Это значение «1.3» — и есть тот коэффициент, который мы получили в результате градуировки датчика ветра на испытательном стенде. Под флюгер с другими физическими параметрами или другой конструкции, градуировку придётся проводить заново и получить другой коэффициент, увязывающий электрические «импульсы в секунду» с «метрами в секунду» реального ветра.
Описанный тут датчик ветра удачно пережил зиму. Я его поставил прошлой осенью; на зиму, правда, натянул сверху большой полиэтиленовый пакет и обвязал. Весной освободил. Пока всё работает отлично.
Это лето наглядно доказало своими ураганами и дождями очевидную целесообразность применения такого погодного модуля. Урон от выдранных с корнем фрамуг, петель или механических открывалок, а также от залива объёмов дождя, превращающего грядки внутри теплицы в маленькую Венецию, был бы несравнимо выше затрат на построение данного модуля.
PS: Да, чуть не забыл. Для тех, кто интересуется проектом теплицы из моего предыдущего обзора. Я там дописал несколько абзацев по итогам годовой эксплуатации теплицы.
PPS: Никто ничего для обзора не предоставлял и не спонсировал. Всё, что описано в конструкции, покупалось в разное время за свои собственные деньги или было найдено в собственных закромах.
Источник статьи: http://mysku.ru/blog/ebay/51160.html