Умная домашняя гидропонная установка

RPSVoloch
Offline
Зарегистрирован: 24.10.2015

Всем доброго времени суток.

Это уже не первая версия умной теплицы но при переходе на гидропонику сталкнулся с проблемой.

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

Вот сам скетч:

#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Time RTC_T;

// Основные настройки скрипта. Изменения необходимо произвести под свои нужды!!! 
// Скрипт расчитан на день, но для тех кому необходимо сберечь деньги советую переключить на ночной режим и счётчик будет считать по другому тарифу.
int lumen_on = 05;            // Время включения люменов для досвета по бокам (устанавливается в часах)
int lumen_off = 23;           // Время выключения люменов (устанавливается в часах)
int led_on = 05;              // Время включения диодов (устанавливается в часах)
int led_off = 23;             // Время выключения диодов (устанавливается в часах)
int circ_on = 05;             // Цыркуляция воздуха внутри. Время включения (устанавливается в часах).
int circ_off = 23;            // Цыркуляция воздуха внутри (устанавливаем хоть постоянно) время выключения (устанавливается в часах).
int ventilation_on = 05;      // Включение вентиляции (устанавливается в часах) рекомендую устанавливать во время включения света.
int ventilation_off = 23;     // Отключение вентиляции (устанавливается в часах) рекомендую устанавливать через час после выключения света.
int breeze_on = 01;           // Обдув растишек on (устанавливается в часах).
int breeze_off = 23;          // Обдув растишек off (устанавливается в часах).
int compressor_on = 05;       // Запуск компрессора для нагнетания воздуха в раствор.
int compressor_off = 23;      // Остановка компрессора для нагнетания воздуха в раствор.
int sprayings_on = 23;        // Запускается после выключения света, указываются минуты начала опрыскивания.
int sprayings_off = 24;       // Минуты остановки опрыскивания.
int a_heating_on = 25;        // Температура включения обогрева воздуха (градусы цельсия)
int a_heating_off = 25;       // Температура выключения обогрева воздуха (градусы цельсия)
int a_cooling_on = 25;        // Температура включения охлаждения воздуха (градусы цельсия)
int a_cooling_off = 25;       // Температура выключения охлождения воздуха (градусы цельсия)
int w_heating_on = 25;        // Температура включения обогрева воды (градусы цельсия)
int w_heating_off = 25;       // Температура выключения обогрева воды (градусы цельсия)
int w_cooling_on = 25;        // Температура включения охлаждения воды (градусы цельсия)
int w_cooling_off = 25;       // Температура выключения охлождения воды (градусы цельсия)
int humidifier_on = 55;       // Время включения увлажнителя воздуха (указывается в часах). Рекомендую ставить во время включения вентиляции.
int humidifier_off = 70;      // Время выключения увлажнителя воздуха (указывается в часах). Рекомендую ставить через час после выключения вентиляции

// Пины для подключения к Ардуино датчиков и исполняемых модулей.

// Исполняемые модули
int lumen = 22;            // Люмен
int led = 23;              // Диоды
int circulation = 24;      // Цыркуляция
int breeze = 25;           // Эмитация ветра
int ventilation = 26;      // Вентиляция
int compressor = 27;       // Компрессор
int sprayings = 28;        // опрыскивание
int humidifier = 29;       // Увлажнение воздуха
int a_heating = 30;        // обогрев воздуха
int a_cooling = 31;        // охлождение воздуха
int w_heating = 32;        // обогрев воды (раствора)
int w_cooling = 33;        // охлождение воды (раствора)

//Датчики
int W_Temp = 46;           // Температура воды
int A_Temp = 47;           // Температура воздуха



 void setup()
 {
 rtc.begin();
 Serial.begin(115200); 
 RTC_T = rtc.getTime();


 pinMode(lumen, OUTPUT);             // Люмен
 pinMode(led, OUTPUT);               // Диоды
 pinMode(circulation, OUTPUT);       // Цыркуляция
 pinMode(ventilation, OUTPUT);       // Вентиляция
 pinMode(breeze, OUTPUT);            // Эмитация ветра
 pinMode(compressor, OUTPUT);        // Компрессор
 pinMode(a_heating, OUTPUT);         // обогрев воздуха
 pinMode(a_cooling, OUTPUT);         // охлождение вохдуха
 pinMode(w_heating, OUTPUT);         // обогрев воды
 pinMode(w_cooling, OUTPUT);         // охлождение воды
 pinMode(W_Temp, INPUT);             // Температура воды
 pinMode(A_Temp, INPUT);             // Температура воздуха
}

 void loop()
 {
 Serial.println(rtc.getTimeStr());

/*
////////////////////////////////////////////////////
////////////////////Освещение//////////////////////
////////////////////////////////////////////////////
*/
 Serial.println("!!!!!!!!!!!!!   Lighting   !!!!!!!!!");
// LUMEN
if ((RTC_T.hour) >= lumen_on && (RTC_T.hour) <= lumen_off)
{
     digitalWrite(lumen, HIGH);
     Serial.println("Lumen ON");
 }
else
{
     digitalWrite(lumen, LOW);
     Serial.println("Lumen OFF");
}
 
// LED
if ((RTC_T.hour) >= led_on && (RTC_T.hour) <= led_off)
{
     digitalWrite(led, HIGH);
     Serial.println("Led ON");
 }
else
{
     digitalWrite(led, LOW);
     Serial.println("Led OFF");
}

/*
////////////////////////////////////////////////////
////////////////////Вентиляция//////////////////////
////////////////////////////////////////////////////
*/

//
//Цыркуляция
//
Serial.println("!!!!!!!!!!!!!   Circulation   !!!!!!!!!");
if ((RTC_T.hour) >= led_on && (RTC_T.hour) <= led_off)
{
  // Включить
	  digitalWrite(circulation, HIGH);
      Serial.println("Circulation ON");
}
else
{
  // Выключить
      digitalWrite(circulation, LOW);
      Serial.println("Circulation OFF");
}

//
//  Проветривание
//
 Serial.println("!!!!!!!!!!!!!   Ventilation   !!!!!!!!!");
if ((RTC_T.hour) >= led_on && (RTC_T.hour) <= led_off)
        {
          // Включить
	    digitalWrite(ventilation, HIGH);
        Serial.println("Ventilation ON");
	    }
else
        {
          // Выключить
        digitalWrite(ventilation, LOW);
        Serial.println("Ventilation OFF");
	    }

//
//  Обдув (эмитация ветра)
//
Serial.println("!!!!!!!!!!!!!!!! Breeze !!!!!!!!!!!!!!");
if ((RTC_T.hour) >= breeze_on && (RTC_T.hour) <= breeze_off)
        {
          // Включить
	digitalWrite(breeze, HIGH);
        Serial.println("Breeze ON");
	    }
else
        {
          // Выключить
        digitalWrite(breeze, LOW);
        Serial.println("Breeze OFF");
	    }

//
//Обогрев
//
Serial.println("!!!!!!!!!!!!!   Heating   !!!!!!!!!");


//
//  Охлаждение
//
Serial.println("!!!!!!!!!!!!!   Cooling   !!!!!!!!!");


// Компрессор
Serial.println("!!!!!!!!!!!!!   Compressor   !!!!!!!!!");
 if ((RTC_T.hour) >= compressor_on && (RTC_T.hour) <= compressor_off)
        {
          // Включить
	digitalWrite(compressor, HIGH);
        Serial.println("Compressor ON");
	    }
else
        {
          // Выключить
        digitalWrite(compressor, LOW);
        Serial.println("Compressor OFF");
	    }

// Опрыскивание
Serial.println("!!!!!!!!!!!!!   Sprayings   !!!!!!!!!");

 if ((RTC_T.hour) == lumen_off && (RTC_T.min) >= sprayings_on && (RTC_T.hour) == lumen_off && (RTC_T.min) <= sprayings_off)
        {
          // Включить
	digitalWrite(sprayings, HIGH);
        Serial.println("Sprayings ON");
	    }
else
        {
          // Выключить
        digitalWrite(sprayings, LOW);
        Serial.println("Sprayings OFF");
	    }

// Увлажнение воздуха
Serial.println("!!!!!!!!!!!!!   Humidifier   !!!!!!!!!");
 if ((RTC_T.hour) >= humidifier_on && (RTC_T.hour) <= humidifier_off)
        {
          // Включить
	digitalWrite(humidifier, HIGH);
        Serial.println("Humidifier ON");
	    }
else
        {
          // Выключить
        digitalWrite(humidifier, LOW);
        Serial.println("Humidifier OFF");
	    }
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

 delay (1000);
}

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

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

Вы считываете время в переменную RTC_T только в setup().

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

У меня есть несколько вопросов, проф итнерес, так сказать:

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

2. Нафига увлажнение?

3. У вас есть опыт, указывающий на необходимость подогрева воздуха, и тем более раствора?

 

Я не критикую, я спрашиваю.

RPSVoloch
Offline
Зарегистрирован: 24.10.2015

Каждый раз в консоль выдаёт новое время. НО это не мешает установке жить своей жизнью. Уже склоняюсь к тому что у мозгов в самой микросхеме борода.

Вообще тут вырезаны функции управления температурой, контроля уровня PH в растворе, обогрев и охлождение воздуха и раствора, опрыскивание растений из 4 разных ёмкостей по расписанию (привязывается к дням недели). Уж если всё это в халяву выпустить то мне кажеться это слишком жирно будет. А так есть стимул допилить при условии что вот оно уже готовое только дополни.

Установка автономна. За  исключением набора жидкостей в резервуары (но думаю и это в скором времени реализую)

Например в не большом помещении установлено лед понель и 8 люминисцентных ламп. Температура без охлождения подскакивает до 52 градусов по цельсию что не есть гуд для растений. И раствор так же превращается в кипяток. Пришлось доделывать конструкцию.

Обогев нужен был 2 раза: когда отключили отопление, а на улице был дубак (-31 градус) за счёт вентиляции выгнало весь воздух из теплицы в жилое помещение и температура упала ниже положенного. Проверялось в Мурманске так что на всякий пожарный лучше пусть будет чем не будет и потом за голову хвататься. А вообще штука вксьма беспонтовая только если вы не проживаете на севере или где либо где частенько бывает холодно и нет отопления.

Вентиляция крайне необходимая вещь так как нужно воздух обогощённый СО2 вгонять и выгонять обогощённый кислородом в помещение где живут люди. Убиваем 2 зайцев 1 выстрелом. (исключение когда у растений ночь так как они СО2 выделяют)

Цыркуляция внутри обеспечивает равномерное распределение температуры что позволяет эффективнее контролировать температуру.

Обдув: можно конечно и без него но все забывают о плесени из за влажности, а таким образом мы снижаем риск её образования + укрепляем сами растения (перец сладкий, мята, салат, декоративные помидоры чери) так как деформация создаёт микротрещины которые заростают и стебель увеличивается в диаметре превращаясь в древовидный.

Увлажнитель воздуха штука очень нужная но только когда у растений ночь и выключена вентиляция (смысл выгонять всю влагу наружу), Есть определённые виды растений которые любят влажный климат (например все тропические растения) но так же есть растения которым влажность до фени (кактусы... но какой дурак их будет в гидропонике выращивать).

Суммарная стоимость с тем набором элементов что у меня есть составляет 11000р (мозг, шилд, реле, датчики,пельтье,компрессор,провода,инверторы для люменов и люмены,диодная понель на 327 ват). Лед понель собрана в домашних условиях так как травить платы умею да и вообще занимаюсь ремонтом всего что питается от электричества. Всё остальное куплено на али в 7 раз дешевле (заказывал оптом и то что не понадобилось продал)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RPSVoloch пишет:

Каждый раз в консоль выдаёт новое время. НО это не мешает установке жить своей жизнью.

Странно почему 2 раза отписалось... Если можно удалите этот пост.

Вы заставляете повторять, вместо того, чтобы проверить...

В консоли у вас выводится время, которое вам отдает экземпляр класса DS3231 - rtc: Serial.println(rtc.getTimeStr());

В сомом скетче вы используете время, сохраненное в переменной RTC_T. Но время в эту переменную вы вносите единожды, в функции в setup(): RTC_T = rtc.getTime();

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

RPSVoloch пишет:

...

Уж если всё это в халяву выпустить то мне кажеться это слишком жирно будет.

...

Вот только тот факт, что вы альтруистически делитесь своей работой, не дает мне в полной мере прокоментировать качество этой работы.

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

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

...

RPSVoloch
Offline
Зарегистрирован: 24.10.2015

Gippopotam

Так вы не стесняйтесь. В конструкции нет недостатков и всё продумано исходя из того что есть у меня. Да и всё в большинстве зависит от того какого типа гидропонная установка используется (в моём случае это DWC на 30 литров и на 4 растения средних размеров). Испаряется за счёт нагнетания воздуха по 2.2 литра в 18 часов из раствора и распыляется до 500мл за ночь. Так что влажность там 72 - 81.

Так же есть установка попроще но там скетчик вообще мизерный. На 4 растения без контроля температуры габаритами 600х170х160мм и ардуино используется как таймер не более (это дешевле чем покупать таймер в разетку).

 

RPSVoloch
Offline
Зарегистрирован: 24.10.2015

Gippopotam пишет:

Вы заставляете повторять, вместо того, чтобы проверить...

В консоли у вас выводится время, которое вам отдает экземпляр класса DS3231 - rtc: Serial.println(rtc.getTimeStr());

В сомом скетче вы используете время, сохраненное в переменной RTC_T. Но время в эту переменную вы вносите единожды, в функции в setup(): RTC_T = rtc.getTime();

Попробовал по вашему и результат тот же. (засунул переменную в  void loop())

Скорее всего у меня мозг в очередной раз вымер (релюшка 1 переодически пробивает на дату и пускает в дата пин ардуины 12в)