#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "EEManager.h"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);


// Устанавливаем номера пинов к которым подключен дисплей
//LiquidCrystal lcd(16, 15, 4, 0, 2, 14);// (RS, E, DB4, DB5, DB6, DB7)
//#define PIN_Kalib 27// калибровка
#define PIN_Rashod 35//Расходомер
#define PIN_Rele 25// реле насос

#define PIN_On 26// работа сброс D7
#define PIN_Off 32// стоп сброс D7
//#define PIN_ADC 32 //потенциометр
#define BTN1 33    // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define BTN2 34      // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#include "GyverButton.h"
GButton butt1(BTN1);
GButton butt2(BTN2);
//int Pin_Pause=0;
int Eepr = 0;
int Pin_On = 0;
int Pin_Off = 2;
int Pin = 0;
int Kimp = 450; //295 импульс =1 литр
//int ADC;
int Litr = 0;
int ataim = 0;
int btaim = 0;
int ctaim = 0;
volatile int impuls = 1;
int Flag = 0;
bool Flagi = false;
int delta = 100;
void ICACHE_RAM_ATTR buttonTick() {
  impuls ++;   // прерывания +1

}

void setup() {
  // Pin = digitalRead(27);
  lcd.init();
  lcd.backlight();
  EEPROM.begin(100);  // выделить память (больше или равно размеру даты) для esp8266/esp32
  //EEPROM.get(10, Kimp);// прочитать из адреса 10 калибровки
  //EEPROM.get(5, delta);// прочитать из адреса 5 послед уставка

  //Serial.begin(9600); // открыли порт для связи

  // Устанавливаем количество символов в строке (16) и количство строк (2)
  lcd.begin(16, 2);


  //pinMode(PIN_Kalib, INPUT); // калибровка
  pinMode(PIN_Rashod, INPUT_PULLUP); //Расходомер
  pinMode(PIN_Rele, OUTPUT); // реле насос
  pinMode(PIN_On, INPUT); // выкл 
  pinMode(PIN_Off, INPUT); // выкл сброс
  attachInterrupt(PIN_Rashod, buttonTick, FALLING);//Расходомер прерывания

}
void Print() {
  //lcd.clear();


  lcd.setCursor(10, 1);
  lcd.print("     ");
  lcd.setCursor(10, 1);
  lcd.print(Litr);
  lcd.print(" L   ");
  lcd.setCursor(1, 1);
  lcd.print("    ");

  lcd.setCursor(0, 1);
  lcd.print(delta);
  lcd.print(" L");
  //delay(10);
  /*Serial.print(Kimp);
  Serial.print(" IMP/Lit");
  Serial.print("         ");
  Serial.print(Litr);
  Serial.print(" RAS");
  Serial.print("         ");
  Serial.print(delta);
  Serial.print(" UST");
  Serial.print("         ");
  Serial.print(impuls);
  Serial.print(" Imp");
  Serial.print("         ");
  Serial.print(ADC);
  Serial.print(" ADC");
  Serial.println("    ");
  Serial.print(Pin_Off);
  Serial.println("    ");
  */

}
void button() //кнопки +++++++++______---------- 0----200л
{butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  butt2.tick();  // обязательная функция отработки. Должна постоянно опрашиваться
  
  if (butt1.isClick()&&delta<=199) {           // одиночное нажатие
    delta++;                       // инкремент
   
  }
  if (butt2.isClick()&&delta>=2) {           // одиночное нажатие
    delta--;                       // декремент
    
  }
  if (butt1.isStep()&&delta<=199) {            // обработчик удержания с шагами
    delta++;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
    
  }
  if (butt2.isStep()&&delta>=2) {            // обработчик удержания с шагами
    delta--;                       // увеличивать/уменьшать переменную value с шагом и интервалом!
   
  }
}
void Rabota()
{ //--------------------------USTAVKA------------------------------
  if (Pin_Off >= 2) { //если 2раза
    digitalWrite(PIN_Rele, LOW); // отрубаем насос
    //ADC = analogRead(PIN_ADC); // прочитать ацп
   // delta = map(ADC, 0, 4024, 0, 150); //выровнить ацп 0-150
   button();//---+++  0-150л
    impuls = 0; //сброс импульс
    //Litr = 0; //сброс литры
    lcd.setCursor(10, 0);
    lcd.print("RASHOD");
    //Kimp=5;
//digitalWrite(PIN_On_Off, HIGH);
    if (Flagi == true) {
      lcd.setCursor(0, 0);
      lcd.print("USTAVKA   ");
    }
    else
    {
      lcd.setCursor(0, 0);
      lcd.print("       ");



    }
  }
  //-------------------------RASHOD--------------------------------
  if ((Pin_On == 1)&&(Pin_Off <2))

   { lcd.setCursor(0, 0);
    lcd.print("USTAVKA   ");

    if (Flagi == true) {
      lcd.setCursor(10, 0);
      lcd.print("RASHOD");
    }
    else {
      lcd.setCursor(10, 0);
      lcd.print("      ");

    }
    if (( Flag != impuls) && (digitalRead(13) == LOW)) { //проверка предыдущего значения
      Flag = impuls;
      Litr = impuls / Kimp; //295 импульс =1 литр
    }

    if (Litr >= delta) {
      digitalWrite(PIN_Rele, LOW );
     // lcd.setCursor(0, 0);
    //lcd.print("  PUMP STOPPED  ");
    //delay(2000);
    Pin_Off=2;
    }
    else
    {
      digitalWrite(PIN_Rele, HIGH);
    }

  }
 //-------------PAUSE--------------------------------
  if (Pin_Off==1){
digitalWrite(PIN_Rele, LOW);
 lcd.setCursor(0, 0);
    lcd.print("     PAUSE      ");
    } 

}





void loop() {

 
  
  //--------------КНОПКИ ++++++++++------------______-------------
  if ((digitalRead(BTN1) == HIGH)&&(digitalRead(BTN2) == HIGH)) //сохранить послед знач. уставка
  {
    lcd.setCursor(0, 0);
    
    lcd.print("  SAVE USTAVKA  ");
    //delta=15; //если некорректные значения уставки зашить 1 раз 
    EEPROM.put(5, delta); // поместить в EEPROM по адресу 5
          EEPROM.commit();
          delay(3000);
    }
 //--------------таймер мигания LCD--------------
  if ((millis() - ataim) > 500) //мигание LCD
  { Flagi = !Flagi;

    ataim = millis();

  }
//------------------КНОПКИ On---Off------------------  
if (digitalRead(PIN_On) == LOW) {
Pin_On=1;
Pin_Off=0;
}


if ((digitalRead(PIN_Off) == HIGH)&&((millis() - ctaim) > 500)){
Pin_On=0;
Pin_Off++;
//delay(500);
 ctaim = millis();
}


  
    //-----------------------KALIBROVKA------------------------------
  /* if ((Pin == 1) && (millis() - btaim >= 3000)) //запуск калибровки если прошло 2сек on Pin_Kalib
    {
       Pin = digitalRead(PIN_Kalib);
      //Flpin = true;
    }

    else if (digitalRead(PIN_Kalib) == 1)
    {
      btaim = millis() ;
    }
*/
 if ((Pin == 0) && (digitalRead(BTN2) == HIGH) &&(millis() - btaim >= 5000)) //запуск калибровки если прошло 5сек on Pin_Kalib
    {
       Pin = digitalRead(PIN_Off);
      //Flpin = true;
    }

    else if (digitalRead(PIN_Off) == 0)
    {
      btaim = millis() ;
    }

    if (Pin == 1) //запуск калибровки если прошло 2сек on Pin_Kalib
    { //delta=1;
      //----------USTAVKA----------
      if (Pin_Off>=1) { //если нажато кнопка 13
        digitalWrite(PIN_Rele, LOW); // насос off
        //ADC = analogRead(PIN_ADC); // прочитать ацп
       // delta = map(ADC, 0, 4024, 1, 150); //выровнить ацп 0-150
        button(); //---+++  0-150л
        impuls = 0; //сброс импульс
        Litr = 0; //сброс литры
        lcd.setCursor(6, 0);
        lcd.print("KALIBROVKA");


        if (Flagi == true) {
          lcd.setCursor(0, 0);
          lcd.print("USTA. ");
        }
        else
        {
          lcd.setCursor(0, 0);
          lcd.print("     ");

        }
        //------------SAVE KALIBROVKA---------------
        if ((Eepr == 1) && (Kimp > 50)) { //не сохраняет калибровку если меньше 50 импульс на 1 литр
          EEPROM.put(10, Kimp); // поместить в EEPROM по адресу 10
          EEPROM.commit();
          digitalWrite(PIN_Rele, LOW); //  насос off
          lcd.setCursor(0, 0);
          lcd.print("SAVE  ");
          Serial.println("  SAVE  ");
          delay(10000);
          Eepr = 0;
        }
      }
      //--------------------------------------------
      if (Pin_On == 1){
        digitalWrite(PIN_Rele, HIGH);
        lcd.setCursor(0, 0);
        lcd.print("OnPump");
        Eepr = 1; //разрешение на сохранение калибровки 
        if ( Flag != impuls) { //проверка предыдущего значения
          Flag = impuls;
          Kimp = impuls / delta; //найти импульс на литр
        }

      }
      /*Serial.print(Kimp);
        Serial.print(" IMP/Lit");
        Serial.print("         ");
        Serial.print(delta);
        Serial.print(" USTa");
        Serial.println("    ");*/


      lcd.setCursor(6, 0);
      lcd.print("KALIBROVKA");

      lcd.setCursor(7, 1);
      lcd.print("          ");

      lcd.setCursor(7, 1);
      lcd.print(Kimp);
      lcd.print(" imp/L");

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

      lcd.setCursor(0, 1);
      lcd.print(delta);
      lcd.print(" L");
      // delay(10);

    }
    else {
      Rabota(); //основная работа
      Print(); // вывод LCD
    }




  }
NOCOMNCVCCGNDINLED1PWRRelay Module