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

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





Схема проекта

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

Эта система управляет освещением и поливом растений. Управление освещением и поливом реализовано в ручном и автоматическом режиме. Ручной режим - нажимаем на кнопку - включает или выключаем свет (полив); автоматический режим - по заданному графику (прописанному в коде программы) происходит включение или выключение света (полива).
Управление реализовано на arduino nano, также были использованы:
- блок питания 220 В AC / 9В ВС - 1 шт.;
- блок питания 220 В AC / 5 В ВС - 1 шт.;
- реле 5 В DC - 2 шт.;
- LCD 1602A - 1 шт.;
- Датчик реального времени - 1 шт;
- Водяной насос - 1 шт.;
- Светодиодные лампы - 2 шт;
- Розетки - 2 шт.





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;}

Буду рад конструктивным замечаниям по самому проекту, по оформления, приветствуются предложения по улучшению (какие функции добавить и как реализовать).
Спасибо за внимание.
Вложения
-
131 KB Просмотры: 1