#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define readingPressure 0
#define BUTTONup 8 // подключение кнопки выше
#define BUTTONdown 7 // подключение кнопки ниже
#define BUTTONup_min 10 // подключение кнопки выше
#define BUTTONdown_min 9 // подключение кнопки ниже
#define BUTTONrelay_on 6
#define relayOutput 12 // сигнал на реле
LiquidCrystal_I2C lcd(0x27,16,2);
int timeDelay = 100; // задержка для работы кнопок
float dataGhange=8; // значение Pmax
float dataGhange_min=3; // значение Pmin
float pressurefact; // фактическое давленеи воды
float val; // переменная для потенциометра (временная)
float pressuremin=2; // значение Pmin
float button_up = dataGhange;
float button_up_min = dataGhange_min;//+3; // стартовое значение при включении
bool relayState;
// переменные для таймера
unsigned long conditionChangeTimeMAX = 0;
unsigned long conditionChangeTimeMIN = 0;
unsigned long conditionChangeTimeMIN_1 = 0;
unsigned long timerMAXP = 50; // задержка работы насоса после достижения максимального давления
unsigned long timerMINP = 5000; // задержка работы насоса после достижения минимального давления
//переменные для мигания знака меньше
const int period = 500; // Период мигания в миллисекундах (1 секунда)
unsigned long lastTime = 0; // Время последнего мигания
bool starVisible = false; // Флаг, показывающий, видна ли звездочка
//переменные для мигания знака насоса
unsigned long lastTime1 = 0; // Время последнего мигания
bool starVisible1 = false; // Флаг, показывающий, видна ли звездочка
// переменные для перезапуска насоса
// считывание 1 раз после отключения насоса
bool conditionMet = false;
float sensorValue;
unsigned long timerMINP_2 = timerMINP + 5000; // после отключения насоса интервал считывания давления 1 раз
// считывать 1 раз в минуту
float pressureValue;
unsigned long currentMillis = millis();
unsigned long previousMillis = 0;
const long interval = 3000; // Интервал отслеживания давления (1 минута)
// периоды считывания с датчика
// Переменная для хранения времени последнего считывания
unsigned long lastReadTime = 0;
// Интервал между считываниями с датчика давления(500 миллисекунд)
const unsigned long readInterval = 250;
//Флаг обновления дисплея
bool flagclear = false;
bool flagclear2 = false;
// символ насоса
byte simvol[8] = {
B00100,
B00100,
B01110,
B11011,
B01110,
B00100,
B00100,
B00000
};
void setup() {
relayState = false;
pinMode(relayOutput, OUTPUT); //Определение пина на сигнал реле
pinMode(BUTTONup, INPUT); //Выход на пин для кнопки больше
pinMode(BUTTONdown, INPUT); //Выход на пин для кнопки меньше
pinMode(BUTTONrelay_on, INPUT);
lcd.backlight();
lcd.init();
lcd.clear();
lcd.setCursor(0, 0); //Установка курсора 1 строки (Символ, строка)
lcd.print("Pmin<Pfact<Pmax"); //Надпись 1 строки
lcd.setCursor(0, 1);
lcd.print(dataGhange_min, 1);
lcd.setCursor(11, 1);
lcd.print(dataGhange, 1);
Serial.begin(9600);
}
void loop()
{
// считывание показаний с датчика давления с определенной периодичностью
// Получаем текущее время
unsigned long currentTime1 = millis();
// Проверяем, прошло ли достаточно времени с момента последнего считывания
if (currentTime1 - lastReadTime >= readInterval)
{
int raw = analogRead(readingPressure);
float voltage = (float) raw * 5.0 / 1024.0; // напряжение на измерительном контакте ардуино
//Serial.print("Pressure is ");
//Serial.print("\t");
pressurefact = (voltage - 0.5) / 4.0 * 50; // перевод напряжения в давление
//Serial.print(pressurefact);
//Serial.print("\t");
//Serial.println(" m.v.s.");
lastReadTime = currentTime1;
}
// показания на дисплее Pmin
//увеличение значения по нажатию кнопки
if ( digitalRead(BUTTONup_min) == HIGH) //Нажатия кнопки увеличения давления Pmax
{ //...
delay(timeDelay);
dataGhange_min -= 0.1;
lcd.setCursor(0, 1);
lcd.print(dataGhange_min, 1);
}
//уменьшение значения по нажатию кнопки
if ( digitalRead(BUTTONdown_min) == HIGH) //Нажатия кнопки уменьшения давления Pmax
{ //...
delay(timeDelay);
dataGhange_min += 0.1;
lcd.setCursor(0, 1);
lcd.print(dataGhange_min, 1);
}
//Показания на дисплее Pfact после подключении датчика давления заменить pressurefact на pressure_mvs
if (pressurefact>=10)
{
lcd.setCursor(5, 1);
lcd.print(pressurefact, 1);
}
else
{
lcd.setCursor(6, 1);
lcd.print(pressurefact, 1);
}
if (pressurefact<=10 && !flagclear)
{
lcd.setCursor(9, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.print(" ");
flagclear = true;}
if (pressurefact>10)
{
flagclear = false;
}
if (pressurefact>0 && !flagclear2)
{
lcd.setCursor(9, 1);
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.print(" ");
flagclear2 = true;}
if (pressurefact<0)
{
flagclear2 = false;
}
// показания на дисплее Pmax
//увеличение значения по нажатию кнопки
if ( digitalRead(BUTTONup) == HIGH) //Нажатия кнопки увеличения давления Pmax
{ //...
delay(timeDelay);
dataGhange-=0.1;
lcd.setCursor(11, 1);
lcd.print(dataGhange, 1);
}
//уменьшение значения по нажатию кнопки
if ( digitalRead(BUTTONdown) == HIGH) //Нажатия кнопки уменьшения давления Pmax
{ //...
delay(timeDelay);
dataGhange+=0.1;
lcd.setCursor(11, 1);
lcd.print(dataGhange, 1);
}
// Логика - если фактическое давление меньше минимального заданного включить реле
if (pressurefact <= dataGhange_min && pressurefact > pressuremin)
{
relayState = true;
}
//Логика - если фактическое давление меньше допустимого реле выключается, с заданной задержкой timerMINP
if (pressurefact < pressuremin)
{
if (millis() - conditionChangeTimeMIN >= timerMINP)
{
relayState = false;
}
}
else
{
conditionChangeTimeMIN = millis();
}
// Логика - если фактическое давление выше верхнего заданного, то отключить реле, с задержкой timerMAXP
if (pressurefact >= dataGhange && pressurefact>=dataGhange_min && relayState) //возможен в жэтом месте дребезг!!! Проверить!!!
{
if (millis() - conditionChangeTimeMAX >= timerMAXP)
{
relayState = false;
}
}
else
{
conditionChangeTimeMAX = millis(); // Запоминаем время, когда давление стало меньше Pmax
}
// Отдельная логика на отображение значков "< >"
//Первый знак
if (pressurefact < dataGhange_min && pressurefact > pressuremin)
{
lcd.setCursor(4, 1);
lcd.print(">");
}
if (pressurefact > dataGhange_min)
{
lcd.setCursor(4, 1);
lcd.print("<");
}
if (pressurefact == dataGhange_min)
{
lcd.setCursor(4, 1);
lcd.print("=");
}
if (pressurefact > dataGhange)
{
lcd.setCursor(10, 1);
lcd.print(">");
}
if (pressurefact < dataGhange)
{
lcd.setCursor(10, 1);
lcd.print("<");
}
if (pressurefact == dataGhange)
{
lcd.setCursor(10, 1);
lcd.print("=");
}
//мигание знака >
if (pressurefact < pressuremin){
unsigned long currentTime = millis();
// Проверяем, прошло ли достаточно времени для мигания
if (currentTime - lastTime >= period) {
lastTime = currentTime; // Обновляем время последнего мигания
starVisible = !starVisible; // Инвертируем состояние видимости звездочки
lcd.setCursor(4, 1);
lcd.print(">");
if (starVisible) {
lcd.setCursor(4, 1);
lcd.print(" ");
}
}
}
// функция принудительного включения насоса кнопкой
if (digitalRead(BUTTONrelay_on) == HIGH)
{
delay(timeDelay);
relayState = true;
}
// функция перезапуска насоса
// считывание с датчика давления один раз после выключения насоса
/*
if (pressurefact < pressuremin)
{
if (!conditionMet && millis() - conditionChangeTimeMIN_1 >= timerMINP_2) { // Если условие выполнено и показания ещё не считывались
sensorValue = pressurefact; // Считываем показания с датчика
Serial.println(sensorValue); // Выводим показания в последовательный порт
conditionMet = true; // Условие выполнено, устанавливаем флаг
}
}
else
{
conditionMet = false; // Если условие не выполнено, сбрасываем флаг
conditionChangeTimeMIN_1 = millis();
}
// считывание показаний с датчика давления 1 раз в минуту
if (conditionMet && millis() - previousMillis >= interval)
{
pressureValue = pressurefact;
Serial.print("1 раз в минуту "); // Вывод значения на последовательный монитор
Serial.println(pressureValue);
previousMillis = millis();
}
if (pressurefact < pressuremin && pressureValue > sensorValue * 1.30) { // Если P2 больше P1 на 30%
relayState = true; // Включаем насос
}
*/
digitalWrite (relayOutput, relayState);
// Функция отображения символа насоса
if (relayState == true && pressurefact < dataGhange)
{
lcd.createChar(1, simvol);
lcd.setCursor(15,1);
lcd.print(char(1));
}
if (!relayState)
{
lcd.setCursor(15, 1);
lcd.print(" ");
}
// Функция мигания символа насоса
if (relayState && pressurefact >= dataGhange)
{
unsigned long currentTime1 = millis();
// Проверяем, прошло ли достаточно времени для мигания
if (currentTime1 - lastTime1 >= period)
{
lastTime1 = currentTime1; // Обновляем время последнего мигания
starVisible1 = !starVisible1; // Инвертируем состояние видимости звездочки
lcd.createChar(1, simvol);
lcd.setCursor(15,1);
lcd.print(char(1));
if (starVisible1)
{
lcd.setCursor(15, 1);
lcd.print(" ");
}
}
}
}