#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
const int I2 = 35; // Режим промывки
const int I1 = 36; // Режим работы
const int I3 = 32; // минимальное давление на входе
const int I4 = 39; // максимальное давление на выходе НВД
const int I5 = 34; // минимальный уровень антискаланта
const int I6 = 14; // максимальный уровень пермиата
const int Q1 = 27; // RED - water pomp
const int Q2 = 26; // GREEN - input solenoid
const int Q3 = 25; // YELLOW - Flushing solenoid
const int Q4 = 33; // BLUE - Flushing solenoid permiat
int modeStatus = 0; // 0 - wait, 1 - work, 2 - flushing, 3 - start work
//int workMode = 0;
int gydroFlushingMode = 0;
//датчики
int permiatMaxLevel = 0;
int antiscalantMinLevel = 0;
int pressureOutputPump = 0;
int pressureInput = 0;
//звдержки и ожидания
int timerGydroFlushing = 5; // время гидро промывки (sec.)
int timerFlushingPermiat = 3000; // время промывки пермиатом (msec.)
int timerInputPressure = 10; // время ожидания давления на входе (sec.)
int delayWaterPompStart = 3; // время задержки запуска НВД (sec.)
//счётчики
int counterInputPressure = 0; // счётчик ожидания давления на входе (sec.)
int counterWaterPompStart = 0; // счётчик ожидания включения НВД (sec.)
int counterGydroFlushing = 0; // счётчик периода гидро промывки (sec.)
int counterGydroFlushingWork = 0; // счётчик времени работы гидро промывки (sec.)
#define MY_PERIOD 1000 // период опроса датчиков (основной цикл) в мс
#define GYDRO_FLUSHING_PERIOD 10 // период вкелючения гидропромывки в sec.
uint32_t tmr1; // переменная таймера
//uint32_t tmr2; // переменная таймера
void setup() {
Serial.begin(115200);
pinMode(I1, INPUT);
pinMode(I2, INPUT);
pinMode(I3, INPUT);
pinMode(I4, INPUT);
pinMode(I5, INPUT);
pinMode(I6, INPUT);
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
pinMode(Q3, OUTPUT);
pinMode(Q4, OUTPUT);
LCD.init();
LCD.setCursor(0, 0);
LCD.println("Status: Wait");
}
void loop() {
if (millis() - tmr1 >= MY_PERIOD) { // ищем разницу
tmr1 = millis(); // сброс таймера
int workMode = digitalRead(I1);
int flushingMode = digitalRead(I2);
pressureInput = digitalRead(I3); // давление на входе
pressureOutputPump = digitalRead(I4); // давление на выходе НВД
antiscalantMinLevel = digitalRead(I5); // минимальный уровень антискаланта
permiatMaxLevel = digitalRead(I6); // максимальный уровень пермиата
//режим работа
if (workMode == HIGH) { // если включен режим работа
if (permiatMaxLevel == HIGH && antiscalantMinLevel == HIGH) { //если min уровень антискаланта = 1 и max пермиата = 0
if (pressureInput == HIGH) { // если давление на входе = 1
if(modeStatus != 1){
startWork();
}else{
if(pressureOutputPump == LOW){
if(gydroFlushingMode != 1){
if(counterGydroFlushing < GYDRO_FLUSHING_PERIOD){
counterGydroFlushing++;
Serial.println(counterGydroFlushing);
}else{
digitalWrite(Q3, HIGH); // включаем соленоид гидро промывки
gydroFlushingMode = 1; // поднимаем флаг гидропромывки
LCD.setCursor(0, 1);
LCD.println("GYDRO FLUSHING");
}
}else{
if(counterGydroFlushingWork < timerGydroFlushing){
counterGydroFlushingWork++;
Serial.println(counterGydroFlushingWork);
}else{
digitalWrite(Q3, LOW); // выключаем соленоид гидро промывки
gydroFlushingMode = 0; // убираем флаг гидропромывки
counterGydroFlushing = 0; // обнуляем счётчики
counterGydroFlushingWork = 0;
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Status: WORK");
}
}
// if (millis() - tmr2 >= GYDRO_FLUSHING_PERIOD) {
// tmr2 = millis();
// digitalWrite(Q3, HIGH); // включаем соленоид гидро промывки
// gydroFlushingMode = 1; // поднимаем флаг гидропромывки
// LCD.setCursor(0, 1);
// LCD.println("GYDRO FLUSHING");
// }
// if(gydroFlushingMode = 1){
// if (millis() >= (tmr2 + timerGydroFlushing)) {
// digitalWrite(Q3, LOW); // выключаем соленоид гидро промывки
// gydroFlushingMode = 0; // убираем флаг гидропромывки
// LCD.clear();
// LCD.setCursor(0, 0);
// LCD.println("Status: WORK");
// }
// }
}else{
// остановка по высокому давления после насоса
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("HIGH I4 pressure");
}
}
} else {
modeStatus = 0; // если пропало давление на входе - выключаем режим работы
// ВЫКЛЮЧИТЬ НАСОС !!!!!
if (counterInputPressure < timerInputPressure) {
counterInputPressure++;
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("LOW I3 pressure");
Serial.println(counterInputPressure);
} else {
digitalWrite(Q1, LOW); // выключаем НВД
digitalWrite(Q3, LOW); // выключаем соленоид гидро промывки
modeStatus = 0; // ставим флаг ожидание
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("ERROR I3 pressure");
}
}
} else { //если уровень антискаланта или пермиата = 0
LCD.clear();
LCD.setCursor(0, 0);
if (permiatMaxLevel == LOW && antiscalantMinLevel == LOW) {
LCD.println("ERROR I5 and I6");
} else if (antiscalantMinLevel == LOW) {
LCD.println("ERROR I5");
} else {
LCD.println("ERROR I6");
}
}
// режим промывки
} else if (flushingMode == HIGH) {
if (modeStatus != 2) {
//flushing();
}
// режим ожидания
} else {
if (modeStatus != 0) {
counterInputPressure = 0;
waiting();
}
}
}
}
void startWork() {
digitalWrite(Q2, HIGH); // открываем соленоид ВХОД
counterInputPressure = 0; // сбрасываем счётчик ожидания давления на входе
if(counterWaterPompStart < delayWaterPompStart){ // задержка перед включением НВД
counterWaterPompStart++;
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Status: WAIT pump");
}else{
digitalWrite(Q1, HIGH); // запускаем НВД
modeStatus = 1; // ставим флаг РАБОТА
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Status: WORK");
}
}
// void flushing() {
// modeStatus = 2;
// digitalWrite(Pin4, HIGH);
// delay(1000);
// digitalWrite(Pin5, HIGH);
// delay(1000);
// digitalWrite(Pin6, HIGH);
// LCD.clear();
// LCD.setCursor(0, 0);
// LCD.println("Status: Flushing");
// delay(1000);
// }
void waiting() {
digitalWrite(Q1, LOW);
digitalWrite(Q2, LOW);
digitalWrite(Q3, LOW);
modeStatus = 0;
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Status: Wait");
}
void stopMaxPermiat() {
digitalWrite(Q3, HIGH);
digitalWrite(Q2, LOW);
digitalWrite(Q4, HIGH);
delay(timerFlushingPermiat);
digitalWrite(Q1, LOW);
delay(5000);
digitalWrite(Q4, LOW);
delay(5000);
digitalWrite(Q3, LOW);
modeStatus = 0;
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Status: Wait permiat level");
}
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}НВТ
вхідний клапан
клапан гідро промивки
клапан промивки перміатом
режим промивки
I3
I4
I5
режим робота
I6