//Программа управления насосом по датчику расстояния
//#include <Ultrasonic.h>
#define ECHO_PIN 2
#define TRIG_PIN 3
#define BUTTON_PIN 8
#define POPLAVOK_PIN 10
#define RELE_PIN 12


boolean pereliv = 0; //переменная для хранения значения с датчика перелива
boolean key = 0;     //переменная для хранения значения с кнопки (1 если кнопка нажата, 0 если нет)
bool nasos_off = 1;
boolean trevoga = 0; //переменная сигнализирующая о наличии тревоги
float maxLevel=40.00;//расстояние в сантиметрах, соответствующее максимальному уровню жидкости в емкости
float minLevel=70.00;//расстояние в сантиметрах, соответствующее минимальному уровню жидкости в емкости

void setup()
{
  Serial.begin(9600); // используем серийный порт
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RELE_PIN, OUTPUT);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // ПОДКЛЮЧИЛИ ПИН КНОПКИ (ИСПОЛЬЗУЕТСЯ ДЛЯ ОТКЛЮЧЕНИЯ РЕЖИМА ТРЕВОГИ)
  pinMode(POPLAVOK_PIN, INPUT_PULLUP); // ПОДКЛЮЧИЛИ ПИН ПОПЛАВКОВОГО ВЫКЛЮЧАТЕЛЯ (НА СЛУЧАЙ ПЕРЕЛИВА)
}

float readDistanceCM() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  int duration = pulseIn(ECHO_PIN, HIGH);
  return duration * 0.034 / 2;
}

void loop()
{
  pereliv = digitalRead(POPLAVOK_PIN);  // считываем состояние поплавкового выключателя
  key = digitalRead(BUTTON_PIN);        // считываем состояние кнопки
  delay(5); // задержка на дребезг контактов

  float rast = readDistanceCM();
  Serial.println(rast); 			// выводим растояние до воды в монитор порта
  
  if (rast > minLevel && !trevoga) {  // если растояние до поверхности воды больше 7 см
    digitalWrite(RELE_PIN, HIGH);      // включаем питание на реле
    digitalWrite(LED_BUILTIN, HIGH);   // подаем сигнал реле на включение насоса
    Serial.println("    OnNasos");
  }else{trevoga=0;}

  if (rast < maxLevel) { //если растояние до поверхности воды меньше maxLevel;
    digitalWrite(LED_BUILTIN, LOW); //даем сигнал на отключение реле
    digitalWrite(RELE_PIN, LOW); //отключаем питание реле
    Serial.println("    OFFNasos");
  }

  if (!pereliv && !trevoga) {//если сработал поплавковый выключатель, то
    trevoga = 1;  //включаем режим тревоги
    digitalWrite(LED_BUILTIN, LOW); //даем сигнал на отключение реле
    digitalWrite(RELE_PIN, LOW); //отключаем питание реле
    tone(7, 2500, 250); //подаем сигнал тревоги с частотой 2500 и длительностью 250мс
   }
  
  delay(100); 								// задержка
  
}