// 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); //Закоментировать при компиляции
}