// https://www.google.com/search?q=%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8+%D0%BC%D0%B5%D0%B3%D0%B0%D0%BF%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D0%B8+%D0%B2+%D0%B0%D1%82%D0%BC%D0%BE%D1%81%D1%84%D0%B5%D1%80%D1%8B&oq=%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%B5%D1%81%D1%82%D0%B8+%D0%BC%D0%B5%D0%B3%D0%B0%D0%BF%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D0%B8&aqs=edge.2.69i57j0i512l8.15853j0j4&sourceid=chrome&ie=UTF-8
// https://arduino-kit.ru/product/datchik-skorosti-vrascheniya
// https://arduino-tex.ru/news/31/raspinovka-esp32-kakie-kontakty-gpio-mozhno-ispolzovat-a.html
#include "RTClib.h" //ds 1307
#define PIN_DO 27
#define PIN_STOP 32
#define HOLES_DISC 23
float PRESSURE = 40;  //Датчик на 40 Mpa
//Сколько метров кабеля намотается-размотается за один оборот зубчатого колеса датчика оборотов????
float STOP_PRESSURE = 150; //Меняй цифру для ограничения давления
volatile unsigned int pulses = 0;
volatile unsigned int state = 0;
float rpm = 0.0;
unsigned long timeOld = 0;
float voltage = 0; // float
float pressure = 0; //float
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void  counter() {
  if (digitalRead(PIN_DO) and state == 0) {
    state = 1; //Появилась дырка
    pulses++;
    //Serial.println(".");
  }
}
void timeShow() {
  DateTime now = rtc.now();
  Serial.print("Current time: ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(PIN_DO, INPUT_PULLUP);
  pinMode(PIN_STOP, OUTPUT);
  digitalWrite(PIN_STOP, LOW);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
  }
  attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
}
void loop() {
  //Дырки нет, установить флаг начала зуба 
  if (digitalRead(PIN_DO) and state == 1)  state = 0;
  //Считаем количество дырок HOLES_DISC раз в секунду
  if (millis() - timeOld >= 1000) {
    detachInterrupt(digitalPinToInterrupt(PIN_DO));
    timeShow();
    rpm = (pulses * 60) / (HOLES_DISC); //Обороты в минуту
    Serial.print(rpm);
    Serial.println(" rpm");
    timeOld = millis();
    pulses = 0;
    attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
    //Читаем датчик давления
    voltage = analogRead(35);
    //Serial.print(voltage);
    pressure = (voltage / 4095)*40; //*10 = Bar или Атмосфер
    //pressure = map(voltage, 0, 4095, 0, PRESSURE);
    Serial.print(pressure);
    Serial.print(" Mpa   ");
    pressure = pressure*9.87;
    Serial.print(pressure);
    Serial.println(" Atm");
    //Ограничение по давлению. Выключаем реле работы лебедки
    if(pressure > STOP_PRESSURE) digitalWrite(PIN_STOP, HIGH);
    else
    digitalWrite(PIN_STOP, LOW);
  }
  delay(10); //Закоментировать при компиляции
}