#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define readingPressure 0
#define BUTTONup 8                                              // подключение кнопки выше
#define BUTTONdown 7                                            // подключение кнопки ниже
#define BUTTONup_min 10                                              // подключение кнопки выше
#define BUTTONdown_min 9                                            // подключение кнопки ниже
#define BUTTONrelay_on 6
#define relayOutput 12                                                  // сигнал на реле
LiquidCrystal_I2C lcd(0x27,16,2);

int timeDelay = 100; // задержка для работы кнопок
float dataGhange=8;                                             // значение Pmax
float dataGhange_min=3;                                             // значение Pmin
float pressurefact;                                          // фактическое давленеи воды
float val;                                                      // переменная для потенциометра (временная)
float pressuremin=2;                                            // значение Pmin
float button_up = dataGhange;
float button_up_min = dataGhange_min;//+3;                                // стартовое значение при включении
bool relayState;

// переменные для таймера
unsigned long conditionChangeTimeMAX = 0;
unsigned long conditionChangeTimeMIN = 0;
unsigned long conditionChangeTimeMIN_1 = 0;
unsigned long timerMAXP = 50; // задержка работы насоса после достижения максимального давления
unsigned long timerMINP = 5000; // задержка работы насоса после достижения минимального давления

//переменные для мигания знака меньше
const int period = 500; // Период мигания в миллисекундах (1 секунда)
unsigned long lastTime = 0; // Время последнего мигания
bool starVisible = false; // Флаг, показывающий, видна ли звездочка
//переменные для мигания знака насоса
unsigned long lastTime1 = 0; // Время последнего мигания
bool starVisible1 = false; // Флаг, показывающий, видна ли звездочка

// переменные для перезапуска насоса
// считывание 1 раз после отключения насоса
bool conditionMet = false;
float sensorValue;
unsigned long timerMINP_2 = timerMINP + 5000; // после отключения насоса интервал считывания давления 1 раз

// считывать 1 раз в минуту
float pressureValue;
unsigned long currentMillis = millis();
unsigned long previousMillis = 0;  
const long interval = 3000; // Интервал отслеживания давления (1 минута)

// периоды считывания с датчика
// Переменная для хранения времени последнего считывания 
unsigned long lastReadTime = 0;
// Интервал между считываниями с датчика давления(500 миллисекунд)
const unsigned long readInterval = 250;

//Флаг обновления дисплея
bool flagclear = false;
bool flagclear2 = false;

// символ насоса
byte simvol[8] = {
  B00100,
  B00100,
  B01110,
  B11011,
  B01110,
  B00100,
  B00100,
  B00000
};

void setup() {

relayState = false;
  pinMode(relayOutput, OUTPUT);                                         //Определение пина на сигнал реле
  pinMode(BUTTONup, INPUT);                                     //Выход на пин для кнопки больше
  pinMode(BUTTONdown, INPUT);                                   //Выход на пин для кнопки меньше
  pinMode(BUTTONrelay_on, INPUT);

  lcd.backlight();
  lcd.init();
  lcd.clear();
  lcd.setCursor(0, 0);                                          //Установка курсора 1 строки (Символ, строка)
  lcd.print("Pmin<Pfact<Pmax");                                     //Надпись 1 строки
  lcd.setCursor(0, 1);
  lcd.print(dataGhange_min, 1);
  lcd.setCursor(11, 1);
  lcd.print(dataGhange, 1);
  Serial.begin(9600);
 }

void loop() 
{

// считывание показаний с датчика давления с определенной периодичностью
  // Получаем текущее время
  unsigned long currentTime1 = millis();
  // Проверяем, прошло ли достаточно времени с момента последнего считывания
  if (currentTime1 - lastReadTime >= readInterval)
{
  int raw = analogRead(readingPressure);
  float voltage = (float) raw * 5.0 / 1024.0;     // напряжение на измерительном контакте ардуино
  //Serial.print("Pressure is ");
  //Serial.print("\t");
  pressurefact = (voltage - 0.5) / 4.0 * 50;          // перевод напряжения в давление
  //Serial.print(pressurefact);
  //Serial.print("\t");
  //Serial.println(" m.v.s.");
  lastReadTime = currentTime1;
}

// показания на дисплее Pmin
//увеличение значения по нажатию кнопки
if ( digitalRead(BUTTONup_min) == HIGH)                             //Нажатия кнопки увеличения давления Pmax
{                                                               //...
  delay(timeDelay);
  dataGhange_min -= 0.1;
  lcd.setCursor(0, 1);
  lcd.print(dataGhange_min, 1);
}
//уменьшение значения по нажатию кнопки
if ( digitalRead(BUTTONdown_min) == HIGH)                           //Нажатия кнопки уменьшения давления Pmax
{                                                               //...
  delay(timeDelay);
  dataGhange_min += 0.1;
  lcd.setCursor(0, 1);
  lcd.print(dataGhange_min, 1);
}

//Показания на дисплее Pfact после подключении датчика давления заменить pressurefact на pressure_mvs
if (pressurefact>=10)
{
lcd.setCursor(5, 1);
lcd.print(pressurefact, 1);
}
else
{
lcd.setCursor(6, 1);
lcd.print(pressurefact, 1);
}                                

if (pressurefact<=10 && !flagclear)
{
  lcd.setCursor(9, 1);
  lcd.print(" ");
  lcd.setCursor(5, 1);
  lcd.print(" ");
  flagclear = true;}

if (pressurefact>10) 
{
  flagclear = false;
}

if (pressurefact>0 && !flagclear2)
{
  lcd.setCursor(9, 1);
  lcd.print(" ");
  lcd.setCursor(5, 1);
  lcd.print(" ");
  flagclear2 = true;}

if (pressurefact<0) 
{
  flagclear2 = false;
}



// показания на дисплее Pmax
//увеличение значения по нажатию кнопки
if ( digitalRead(BUTTONup) == HIGH)                             //Нажатия кнопки увеличения давления Pmax
{                                                               //...
  delay(timeDelay);
  dataGhange-=0.1;
  lcd.setCursor(11, 1);
  lcd.print(dataGhange, 1);
}
//уменьшение значения по нажатию кнопки
if ( digitalRead(BUTTONdown) == HIGH)                           //Нажатия кнопки уменьшения давления Pmax
{                                                               //...
  delay(timeDelay);
   dataGhange+=0.1;
  lcd.setCursor(11, 1);
  lcd.print(dataGhange, 1);
}

// Логика - если фактическое давление меньше минимального заданного включить реле
if (pressurefact <= dataGhange_min  && pressurefact > pressuremin) 
{
  relayState = true;
 }

  //Логика - если фактическое давление меньше допустимого реле выключается, с заданной задержкой timerMINP

    if (pressurefact < pressuremin)
    {
      if (millis() - conditionChangeTimeMIN >= timerMINP) 
      {
        relayState = false;
      }
    } 
      else 
      {
        conditionChangeTimeMIN = millis(); 
      }
      
      
    // Логика - если фактическое давление выше верхнего заданного, то отключить реле, с задержкой timerMAXP
    if (pressurefact >= dataGhange && pressurefact>=dataGhange_min && relayState) //возможен в жэтом месте дребезг!!! Проверить!!!
    {

      if (millis() - conditionChangeTimeMAX >= timerMAXP) 
      {
      relayState = false;
      }
    } 
  else 
  {
  conditionChangeTimeMAX = millis();  // Запоминаем время, когда давление стало меньше Pmax
  }

// Отдельная логика на отображение значков "< >"
//Первый знак
if (pressurefact < dataGhange_min && pressurefact > pressuremin)
{
lcd.setCursor(4, 1);
lcd.print(">");
}
if (pressurefact > dataGhange_min)
{
lcd.setCursor(4, 1);
lcd.print("<");
}
if (pressurefact == dataGhange_min)
{
lcd.setCursor(4, 1);
lcd.print("=");
}
if (pressurefact > dataGhange)
{
lcd.setCursor(10, 1);
lcd.print(">");
}
if (pressurefact < dataGhange)
{
lcd.setCursor(10, 1);
lcd.print("<");
}
if (pressurefact == dataGhange)
{
lcd.setCursor(10, 1);
lcd.print("=");
}

//мигание знака >
if (pressurefact < pressuremin){
 unsigned long currentTime = millis();

  // Проверяем, прошло ли достаточно времени для мигания
  if (currentTime - lastTime >= period) {
    lastTime = currentTime; // Обновляем время последнего мигания
    starVisible = !starVisible; // Инвертируем состояние видимости звездочки

lcd.setCursor(4, 1);
lcd.print(">");

if (starVisible) {
lcd.setCursor(4, 1);
lcd.print(" ");
  }
  }
}

// функция принудительного включения насоса кнопкой
if (digitalRead(BUTTONrelay_on) == HIGH)
{
delay(timeDelay);
relayState = true;
}
    
// функция перезапуска насоса
// считывание с датчика давления один раз после выключения насоса
/*
if (pressurefact < pressuremin)
{
    if (!conditionMet && millis() - conditionChangeTimeMIN_1 >= timerMINP_2) { // Если условие выполнено и показания ещё не считывались
    sensorValue = pressurefact; // Считываем показания с датчика
    Serial.println(sensorValue); // Выводим показания в последовательный порт
    conditionMet = true; // Условие выполнено, устанавливаем флаг
    }
} 
else 
{
conditionMet = false; // Если условие не выполнено, сбрасываем флаг
conditionChangeTimeMIN_1 = millis(); 
}

// считывание показаний с датчика давления 1 раз в минуту
  if (conditionMet && millis() - previousMillis >= interval) 
  {
  pressureValue = pressurefact; 
  Serial.print("1 раз в минуту "); // Вывод значения на последовательный монитор
  Serial.println(pressureValue);
  previousMillis = millis();
  }

if (pressurefact < pressuremin && pressureValue > sensorValue * 1.30) { // Если P2 больше P1 на 30%
relayState = true; // Включаем насос
} 
*/
digitalWrite (relayOutput, relayState);

// Функция отображения символа насоса
if (relayState == true && pressurefact < dataGhange)
{
lcd.createChar(1, simvol);
lcd.setCursor(15,1); 
lcd.print(char(1)); 
}
if (!relayState) 
{
lcd.setCursor(15, 1); 
lcd.print(" "); 
}

// Функция мигания символа насоса
if (relayState && pressurefact >= dataGhange)
{
 unsigned long currentTime1 = millis();
  // Проверяем, прошло ли достаточно времени для мигания
  if (currentTime1 - lastTime1 >= period) 
    {
    lastTime1 = currentTime1; // Обновляем время последнего мигания
    starVisible1 = !starVisible1; // Инвертируем состояние видимости звездочки
lcd.createChar(1, simvol);
lcd.setCursor(15,1); 
lcd.print(char(1)); 

if (starVisible1) 
{
lcd.setCursor(15, 1);
lcd.print(" "); 
}
}
}
}
$abcdeabcde151015202530354045505560fghijfghij