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