Подправил немного скетч. Убрал диоды и сделал отображение на дисплее наших главных переменных, которые меняем потенциометрами. Ну и тумблеры. Правил вслепую, без проверки (поленился ставить Proteus и шаманить там дисплей), проверьте, работает ли, надеюсь ничего не забыл.
Потом уже сделаем более красивое отображение данных на дисплее и тайминг лампы.
//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
float z_time = 0;
tmElements_t tm;
int current_hour = 0; //храним текущий час
float day_koef = 1; //коэффициент времени дня
boolean svet_flag = 0; // Флаг света
//--------------Интерфейс---------------------
LiquidCrystal lcd(6, 7, 3, 2, 5, 4);
float display_last_time = 0; //Для засечки таймера обновления дисплея
boolean sliv_flag = 0; // Флаг режима слива
float y_last_time = 0; //Для засечки таймера дребезга кнопки
int led_green = 1; // Главная "зеленая" переменная, частота затоплений
int led_blue = 1; //Продолжительность затопления
//----------------Помпа и клапаны-------------------------
float base_dive_freq = 2000; //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0; //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0; //Засечка. Служебная
float dive_const = 1000; //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000; //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
float base_dive_time = 200; //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0; // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0; //Засечка. Служебная
float dive_time_down = 0; // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0; //Засечка нижней трубы. Служебная
boolean dive_flag = 0; //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0; //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0; //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
//****************************************************************************************
//****************************************************************************************
void setup() {
Serial.begin(9600);
lcd.begin(8, 2);
pinMode(8, INPUT); //Пин для тумблера режимов
pinMode(9, INPUT); //Пин для тумблера света
pinMode(A3, INPUT); //пин для потенциометра
pinMode(A2, INPUT); //пин для потенциометра
pinMode(11, OUTPUT); //пин для нижнего клапана
pinMode(12, OUTPUT); //пин для реле, на которой будет помпа
pinMode(10, OUTPUT); //пин для верхнего клапана
pinMode(13, OUTPUT); //пин для света
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {
//-----------Часы и Serial-------------------------
if((millis() - z_time) > 1000){
RTC.read(tm);
//String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
Serial.println ("Hour "+ String(tm.Second)+" Koeff - " + String(day_koef));
z_time = millis();
current_hour = tm.Hour;
//current_hour = tm.Second; //временная привязка к секундам для проверки правильности коэфф.
if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1; //коэфф. для часов дня
if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2;
}
//------------Вычисление времени работы------------------------
if (!sliv_flag){
dive_freq = base_dive_freq * led_green * day_koef;
dive_time = dive_const + base_dive_time * led_blue;
dive_time_down = pereliv_const + base_dive_time * led_blue;
//------------Работа помпы и клапанов------------------------------
if((millis() - dive_freq_last_time) > dive_freq) { //если время затопления наступило
digitalWrite(12, 1); //включаем помпу
digitalWrite(10, 1); //закрываем клапан
dive_flag = 1; //выставляем флаг, что помпа включена
clapan_up_flag = 1; //выставляем флаг, что клапан закрыт
dive_freq_last_time = millis(); //засечка для вычисления времени следующего включения помпы
dive_time_last_time = millis(); //засечка для вычисления премени выключения помпы
}
if(dive_flag && (millis()-dive_time_last_time) > dive_const){ //если помпа включена и время выключения наступило
digitalWrite(12, 0); //выключаем помпу
dive_flag = 0; //выставляем флаг, что помпа выключена
}
if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){ //если верхний клапан закрыт и время затопления истекло
digitalWrite(10, 0); //открываем верхний клапан
clapan_up_flag = 0; //выставляем флаг, что верхний клапан открыт
digitalWrite(11, 1); //закрываем нижний клапан
clapan_down_flag = 1; //выставляем флаг, что нижний клапан закрыт
dive_time_down_last_time = millis();
}
if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){ //если нижний клапан закрыт и время нижнего затопления истекло
digitalWrite(11, 0); //Открываем нижний клапан
clapan_down_flag = 0; //выставляем флаг, что нижний клапан открыт
}
}
//-------------------Слив----------------------------
if (sliv_flag){
digitalWrite(11, 0);
digitalWrite(10, 0);
digitalWrite(12, 0);
dive_freq_last_time = millis() - (float)86400000; // заставляем базовую программу думать, что последний полив был сутки назад
}
//===================Интерфейс===================================
//-----------Чтение потенциометра-------------------------------
led_green = (int)(analogRead(A3)/100) + 1;
led_blue = (int)(analogRead(A2)/100) + 1;
//-------------Обработка тумблеров-----------------------------
if((millis()-y_last_time)>200){
if (digitalRead(
){sliv_flag = 1;}
else {sliv_flag = 0;}
if (digitalRead(9)){svet_flag = 1;}
else {svet_flag = 0;}
y_last_time = millis();
}
//-------------------Дисплей-------------------------
if ((millis()-display_last_time)>500){
lcd.setCursor(0, 0);
lcd.print((String)led_green);
lcd.setCursor(0, 1);
lcd.print((String)led_blue);
display_last_time = millis();
}
}