// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi

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

LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
//#include <EEManager.h>
//EEManager memory(data);

// Устанавливаем номера пинов к которым подключен дисплей
//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_Off 26// работа сброс
#define PIN_ADC 32 //потенциометр
int Eepr = 0;
int Pin=0;
int Kimp = 5; //295 импульс =1 литр
int ADC;
int Litr = 0;
int ataim = 0;
int btaim = 0;
volatile int impuls = 1;
int Flag = 0;
bool Flagi = false;
int delta = 0;
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
  Serial.begin(9600); // открыли порт для связи
  // Устанавливаем количество символов в строке (16) и количство строк (2)
  lcd.begin(16, 2);
  // Выводим на дисплей надпись
  //  lcd.print("USTAVKA");
  //Устанавливаем курсор на вторую строчку (Первая строка - 0 , вторая - 1) и 8 символ читая с левой стороны
  // lcd.setCursor(10, 0);
  // Выводим на дисплей надпись "LCD 1602"
  // lcd.print("RASHOD");
  pinMode(PIN_Kalib, INPUT); // калибровка
  pinMode(PIN_Rashod, INPUT_PULLUP); //Расходомер
  pinMode(PIN_Rele, OUTPUT); // реле насос
  pinMode(PIN_On_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("    ");

}


void Rabota()
{ //--------------------------USTAVKA------------------------------
  if (digitalRead(PIN_On_Off) == HIGH) { //если нажато кнопка 13
    digitalWrite(PIN_Rele, LOW); // отрубаем насос
    ADC = analogRead(PIN_ADC); // прочитать ацп
    delta = map(ADC, 230, 1024, 0, 150); //выровнить ацп 0-150
    impuls = 0; //сброс импульс
    Litr = 0; //сброс литры
    lcd.setCursor(10, 0);
    lcd.print("RASHOD");
    //Kimp=5;

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

     

    }
  }
  //-------------------------RASHOD--------------------------------
  else
  {
    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 );
    }
    else
    {
      digitalWrite(PIN_Rele, HIGH);
    }

  }
}

void loop() {
  if ((millis() - ataim) > 500)
  { Flagi = !Flagi;

    //delay(500);
    ataim = millis();

  }
  if (Pin == 0)
  {
    //-----------------------KALIBROVKA------------------------------
Pin = digitalRead(PIN_Kalib);
btaim = millis();

  }
 
  if ((Pin == 1) && (millis() - btaim > 2000))   //запуск калибровки если прошло 1сек при старте
  {Serial.println(btaim);
    //----------USTAVKA----------
    if (digitalRead(PIN_On_Off) == HIGH) { //если нажато кнопка 13
      digitalWrite(PIN_Rele, LOW); // отрубаем насос
      ADC = analogRead(PIN_ADC); // прочитать ацп
      delta = map(ADC, 230, 1024, 0, 150); //выровнить ацп 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) {
        //EEPROM.put(10, Kimp); // поместить в EEPROM по адресу 10
        //EEPROM.commit();
        digitalWrite(PIN_Rele, LOW); // отрубаем насос
        lcd.setCursor(0, 0);
        lcd.print("SAVE  ");
        Serial.println("  SAVE  ");
        delay(3000);
        Eepr = 0;
      }
    }
    //--------------------------------------------
    else {
      digitalWrite(PIN_Rele, HIGH);
       lcd.setCursor(0, 0);
        lcd.print("OnPump");
      Eepr = 1;
      if (( Flag != impuls) && (digitalRead(PIN_On_Off) == LOW)) { //проверка предыдущего значения
        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(9, 1);
    lcd.print("          ");

    lcd.setCursor(9, 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