Программа управления циклом роста растений
Аэропоника автоматизированная система система управления программа управления
Первая часть – это подключение библиотек для работы с датчиками и дополнительными модулями. Объявление глобальных переменных, таких как: номера выходов на контроллере, переменные для фиксации состояний выходов.
Вторая часть (функция setup() – обязательная функция для работы программы (Листинг 1)). Здесь настраиваются контакты на контроллере, как входы и выходы, соответственно своему назначению. Также здесь происходить включение датчиков и модулей.

Листинг 1 – Начальные установки при включении устройства
void setup() 
{
  Serial.begin(9600);
        pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
        pinMode(relPin1, OUTPUT);
  pinMode(relPin2, OUTPUT);
  pinMode(relPin3, OUTPUT);
  pinMode(sensPin, INPUT_PULLUP);
        digitalWrite(relPin1, LOW);
  digitalWrite(relPin2, LOW);
  digitalWrite(relPin3, LOW);
  
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.createChar(1, degree);        // Создаем символ под номером 1
  
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print(" PRESS BOTTON 1 ");     // Выводим текст
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print(" FOR START ");    // Выводим текст
 }…

Главный управляющий код находится в третьей части и выполняется циклически функцией loop().
Сначала были запрограммированы кнопки аэропонной установки для включения и выключения установки и устройств по отдельности:
 Листинг 2 – Программирование кнопок
{                                  // Кнопка включения
    if(digitalRead(digitalRead(6)==HIGH&&flag1==0)){   // Если нажата кнопка и переменная flag=0, то...
    flag1=1;                            // Включения насоса и озонатора
  digitalWrite(relPin1, !digitalRead(relPin1));
  digitalWrite(relPin2, !digitalRead(relPin2));        }
     if(digitalRead(6)==LOW&&flag1==1){    
// Если кнопка НЕ нажата и переменная flag=1, то...
     flag1=0;   }                 // Кнопка ручного вкл/выкл вентиляции
    if(digitalRead(digitalRead(7)==HIGH&&flag2==0)){   
    flag2=1;                       // Защита кнопки от "дребезга"
    digitalWrite(relPin3, !digitalRead(relPin3));   
    }
    if(digitalRead(7)==LOW&&flag2==1){     
     flag2=0;   }               // Кнопка ручного вкл/выкл насоса
    if(digitalRead(digitalRead(8)==HIGH&&flag3==0)){   
    flag3=1;                // Защита кнопки от "дребезга"
    digitalWrite(relPin2, !digitalRead(relPin2));
   }
    if(digitalRead(8)==LOW&&flag3==1){     
     flag3=0;
    }                  // Кнопка ручного вкл/выкл озонатора
    if(digitalRead(digitalRead(9)==HIGH&&flag4==0)){ 
    flag4=1;                // Защита кнопки от "дребезга"
    digitalWrite(relPin1, !digitalRead(relPin1));
   }
    if(digitalRead(9)==LOW&&flag4==1){  
     flag4=0;
  }    …
В программе предусмотрены возможность аварийного выключения установки в случае повреждения резервуара с водой и включение вентиляции в случае высокой температуры или влажности. 
Листинг 2 – Аварийное выключение 
if(!digitalRead(sensPin)){  // Если на входе уровень логического «0», то ...
  digitalWrite(relPin1, LOW);  // Выключаем насос и озонатор, посылаем сигнал диспетчеру
  digitalWrite(relPin2, LOW);
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print(" EMERGENCY ");     // Выводим текст
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print(" STOP ");    // Выводим текст
  }…
Если на поплавковом датчике на герконовом реле логический «0», то автоматически отключается насос и озонатор, для исключения порчи оборудования, а также для экономии электроэнергии. На дисплей выводится соответствующее сообщение. 
И вторая возможная ситуация, которая может привести к порче растений и оборудования – это перегрев или высокий уровень влажности. 

Листинг 3 – Автоматическое включение вентиляции 
if(humid > 80 or temp > 35){  
  digitalWrite(relPin3, HIGH);  
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print(" VENTILATION ");     // Выводим текст
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print(" INCLUDED ");    // Выводим текст
  delay(10000);     } …

Данные с датчиков считываются и выводятся на дисплей, так же при подключении Arduino к компьютеру, данные выводятся в Serial. 
Листинг 4 – Считывание данных с датчиков
…
int temp = sens.readTemperature(2);
  int humid = sens.readHumidity(2);
…

Листинг 5 – Вывод данных на дисплей
…
lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Humidity =    % ");     // Выводим текст
  lcd.setCursor(11, 0); 
  lcd.print(humid, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Temp     =   \1C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(11, 1);             
  lcd.print(temp, 1); 
     delay(2000);
…

Листинг 6 – Вывод данных в Serial
…
Serial.print("Hum: ");    
    Serial.print(humid);
    Serial.print(" %");
    Serial.print("Temp: ");
    Serial.print(temp);
    Serial.println(" C ");
…
Промышленное выращивание растений методом аэропоники.
Алексей
Макаров
Михайлович
Заведующий кафедры АПП
Кандидат технических наук
Доцент
-
-
РОССИЯ
Григорий
Котельников
Владимирович
Системный аналитик
РОССИЯ
50.43.15
Системы автоматического управления, системы автоматического регулирования и системы автоматического контроля для непрерывных процессов
02.11.IJ
ENGINEERING, INDUSTRIAL
Григорий
Котельников
Владимирович
Автор работы
РОССИЯ
Григорий
Котельников
Владимирович
Физическое лицо
РОССИЯ