ARDUINO Автоматизация гроубокса

Yato

✩✩✩✩✩✩✩
27 Сен 2026
1
0
Всем привет.

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

1.jpg

Эта система управляет освещением и поливом растений. Управление освещением и поливом реализовано в ручном и автоматическом режиме. Ручной режим - нажимаем на кнопку - включает или выключаем свет (полив); автоматический режим - по заданному графику (прописанному в коде программы) происходит включение или выключение света (полива).

Управление реализовано на arduino nano, также были использованы:
  • блок питания 220 В AC / 9В ВС - 1 шт.;
  • блок питания 220 В AC / 5 В ВС - 1 шт.;
  • реле 5 В DC - 2 шт.;
  • LCD 1602A - 1 шт.;
  • Датчик реального времени - 1 шт;
  • Водяной насос - 1 шт.;
  • Светодиодные лампы - 2 шт;
  • Розетки - 2 шт.
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg

C++:
//#define Otladka

// Подключаем библиотеки
#include <Wire.h>
#include <B_knopka.h>
#include <LiquidCrystal_1602_RUS.h>
#include <microDS3231.h>
#include <Arduino.h>

// Присваиваем имена контактам
#define skorost_porta 9600  // Скорость последовательного порта

//Подключение дисплея
#define display_pin_rs 7
#define display_pin_en 8
#define display_pin_d4 9
#define display_pin_d5 10
#define display_pin_d6 11
#define display_pin_d7 12


//Подключение управления реле
#define rele_1_1_osveshenia_pin 2
#define rele_1_2_osveshenia_pin 4
#define rele_poliva_pin 3

//Подключение кнопки
#define knopka_1_pin 6

// Настройка времени включения и отключения освещения
#define chas_vklycheniy_osveshenia 6
#define minuta_vklycheniy_osveshenia 20

#define chas_vyklycheniy_osveshenia 18
#define minuta_vyklycheniy_osveshenia 20

// Настройка времени включения и отключения полива
#define chas_vklycheniy_poliva 6
#define minuta_vklycheniy_poliva 30
#define sekunda_vklycheniy_poliva 00

#define chas_vyklycheniy_poliva 6
#define minuta_vyklycheniy_poliva 30
#define sekunda_vyklycheniy_poliva 14

// Создаем необходимые переменные и объекты классов
uint32_t start;
uint32_t stop;

bool sostoynie_raboty_osvesheniy = false;
bool sostoynie_raboty_poliva = false;

bool vklychit_po_vremy = false;
bool vyklychit_po_vremy = false;

// Создаем обьекты классов
LiquidCrystal_1602_RUS lcd(display_pin_rs, display_pin_en, display_pin_d4, display_pin_d5, display_pin_d6, display_pin_d7);
Knopka knopka_1(knopka_1_pin);
MicroDS3231 rtc;

//Установка
void setup() {
  //Подключаем серийный порт
  #ifdef Otladka
  Serial.begin(skorost_porta);
  #endif
  //Подключаем дисплей
  lcd.begin(16, 2);
  Wire.begin(); 

  // Настраиваем выходы управления реле
  pinMode(knopka_1_pin, INPUT_PULLUP);
  pinMode(rele_1_1_osveshenia_pin, OUTPUT);
  pinMode(rele_1_2_osveshenia_pin, OUTPUT);
  pinMode(rele_poliva_pin, OUTPUT);
  
  digitalWrite(rele_1_1_osveshenia_pin, LOW);
  digitalWrite(rele_1_2_osveshenia_pin, HIGH);
  digitalWrite(rele_poliva_pin, HIGH);

  //rtc.setTime(BUILD_SEC, BUILD_MIN, BUILD_HOUR, BUILD_DAY, BUILD_MONTH, BUILD_YEAR);
  }

void loop() {
  if (millis() % 50 == 0) {
    vyvod_sostoyniya_rele_na_display();
    vyvod_vremeni_na_display();
  }
  // УПРАВЛЕНИЕ ОСВЕЩЕНИЕМ АВТОМАТИЧЕСКОЕ
  //Проверяем время включения освещения
  if (rtc.getHours() == chas_vklycheniy_osveshenia & rtc.getMinutes() == minuta_vklycheniy_osveshenia) {
    if (!sostoynie_raboty_osvesheniy) {vklychit_svet();}
  }
  //Проверяем время выключения освещения
  if (rtc.getHours() == chas_vyklycheniy_osveshenia & rtc.getMinutes() == minuta_vyklycheniy_osveshenia) {
    if (sostoynie_raboty_osvesheniy) {vyklychit_svet();}
  }
  //УПРАВЛЕНИЕ ПОЛИВОМ АВТОМАТИЧЕСКОЕ
  ////Проверяем время включения полива
  if (rtc.getHours() == chas_vklycheniy_poliva & rtc.getMinutes() == minuta_vklycheniy_poliva & rtc.getSeconds() == sekunda_vklycheniy_poliva) {
    if (!sostoynie_raboty_poliva) {vklychit_poliv();}
  }
  //Проверяем время выключения полива
  if (rtc.getHours() == chas_vyklycheniy_poliva & rtc.getMinutes() == minuta_vyklycheniy_poliva & rtc.getSeconds() == sekunda_vyklycheniy_poliva) {
    if (sostoynie_raboty_poliva) {vyklychit_poliv();}
  }

  //РУЧНОЕ УПРАВЛЕНИЕ ОСВЕЩЕНИЕМ И ПОЛИВОМ
  int chislo_nazhatij = knopka_1.podschet_nazhatij();
  //Проверяем нажатие кнопки исчитаем количество нажатий
  if (chislo_nazhatij > 0) {
    #ifdef Otladka
      Serial.println(chislo_nazhatij);
      #endif
    switch (chislo_nazhatij) {     
      case 1:
        if (sostoynie_raboty_osvesheniy) {vyklychit_svet();}
        else {vklychit_svet();}
        break;
      case 2:
        if (sostoynie_raboty_poliva) {vyklychit_poliv();}
        else {vklychit_poliv();}
        break;}}
}

//Функция для вывода времени на жк монитор
void vyvod_vremeni_na_display() {
  lcd.setCursor(0, 0);
  int a = rtc.getHours();
  if (a < 10) lcd.print("0");
  lcd.print(a);
  lcd.print(":");
  int b = rtc.getMinutes();
  if (b < 10) lcd.print("0");
  lcd.print(b);
  lcd.print(":");
  int c = rtc.getSeconds();
  if (c < 10) lcd.print("0");
  lcd.print(c);}

void vyvod_sostoyniya_rele_na_display() {
  lcd.setCursor(0, 1);
  lcd.print("Свет");
  lcd.setCursor(5, 1);
  lcd.print(sostoynie_raboty_osvesheniy);

  lcd.setCursor(8, 1);
  lcd.print("Полив ");
  lcd.setCursor(14, 1);
  lcd.print(sostoynie_raboty_poliva);}

//УПРАВЛНИЕ РЕЛЕ
void vklychit_svet() {
  digitalWrite(rele_1_1_osveshenia_pin, 1);
  delay (1000);
  digitalWrite(rele_1_2_osveshenia_pin, 0);
  delay (1000);
  digitalWrite(rele_1_1_osveshenia_pin, 0);
  sostoynie_raboty_osvesheniy = 1;
  }
 

void vyklychit_svet() {
  digitalWrite(rele_1_1_osveshenia_pin, 1);
  delay (1000);
  digitalWrite(rele_1_2_osveshenia_pin, 1);
  delay (1000);
  digitalWrite(rele_1_1_osveshenia_pin, 0);
  sostoynie_raboty_osvesheniy = 0;
  }

void vklychit_poliv() {
  digitalWrite(rele_poliva_pin, 0);
  sostoynie_raboty_poliva = 1;}
void vyklychit_poliv() {
  digitalWrite(rele_poliva_pin, 1);
  sostoynie_raboty_poliva = 0;}
Схема проекта

Схема.PNG

Буду рад конструктивным замечаниям по самому проекту, по оформления, приветствуются предложения по улучшению (какие функции добавить и как реализовать).

Спасибо за внимание.
 

Вложения