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