//------------------welcome-----------------//
//-----------Water Treatment Unit-----------//
// This project is made with love by Eng. Aly Hussein to Dr. Fatma Hussein Ali. //
// For more info please contact me on whatsapp +201091185592//
//------------------library-----------------//
#include <DallasTemperature.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HCSR04.h>
//--------------LCD definitions-------------//
LiquidCrystal_I2C lcd(0x27,20,4);
//----------------Analoge inputs------------//
const int stsp = A0;
const int inc = A2;
const int dec = A1;
const int set = A3;
const int emr = A4;
//-----------------UltraSonic---------------//
//---Tank1---Ultrasonic---
UltraSonicDistanceSensor distanceSensor1(39, 41); // Initialize sensor that uses digital pins 13 and 12.
int Tank1_max = 60;
//---Tank2---Ultrasonic---//
UltraSonicDistanceSensor distanceSensor2(45, 43); // Initialize sensor that uses digital pins 13 and 12.
int Tank2_max = 60;
//---Tank3---Ultrasonic---//
UltraSonicDistanceSensor distanceSensor3(47, 49); // Initialize sensor that uses digital pins 13 and 12.
int Tank3_max = 60;
//-----------------Tempreture---------------//
#define Temp 53
OneWire oneWire(Temp);
DallasTemperature sensors(&oneWire);
int SetPoint=0;
//------------------Outputs-----------------//
//const int Pumb = 29;
const int Motor = 23;
const int Heater = 25;
const int Buzzer = 31;
const int RunTimer = 35;
//--------------Timer definitions-----------//
int hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
int add_sec = 3;
bool RUN = true;
bool sec_flag = true;
bool min_flag = true;
bool hrs_flag = true;
long time = 0, timePrev = 0;
//--------------SETUP definitions-----------//
void setup()
{
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(9600);
//---Relay outs---//
//pinMode(Pumb, OUTPUT);
pinMode(Motor, OUTPUT);
pinMode(Heater, OUTPUT);
pinMode(Buzzer, OUTPUT);
pinMode(RunTimer, OUTPUT);
//---Digital write---//
//digitalWrite(Pumb, HIGH);
digitalWrite(Motor, HIGH);
digitalWrite(Heater, HIGH);
digitalWrite(Buzzer, HIGH);
digitalWrite(RunTimer, HIGH);
//--------------Startup Screen-----------//
Serial.begin(9600);
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" WELCOME! ");
lcd.setCursor(0, 1);
lcd.print(" COUNTDOWN TIMER ");
lcd.setCursor(0, 2);
lcd.print("Water Treatment Unit");
lcd.setCursor(0, 3);
lcd.print(" By Dr. FATMA H. ");
delay(4000);
lcd.clear();
lcd.clear();
//drawSolidBorder();
lcd.setCursor(1, 1);
lcd.print("Loading . . . . .");
lcd.setCursor(1, 2);
int count = 18;
while(count > 0 )
{
lcd.print((char)255);
delay(150);
count = count -1;
}
digitalWrite(Buzzer, LOW);
delay(4000);
digitalWrite(Buzzer, HIGH);
//--------------PIN mode definitions-----------//
//---Key press---//
pinMode(stsp, INPUT_PULLUP);
pinMode(inc, INPUT_PULLUP);
pinMode(dec, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(emr, INPUT_PULLUP);
pinMode(RunTimer, INPUT_PULLUP);
//------------Tempreture definitions-------------//
pinMode(Temp, INPUT);
//--------------Timer code definitions-----------//
if (EEPROM.read(add_chk) != check_val)
{
EEPROM.write(add_chk, check_val);
EEPROM.write(add_hrs, 0);
EEPROM.write(add_min, 1);
EEPROM.write(add_sec, 2);
}
else
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = EEPROM.read(add_sec);
}
delay(1000);
INIT();
}
void loop()
{
MAIN();
if (digitalRead(stsp) == LOW){ Starting();}
do { MAIN(); } while ( digitalRead(stsp));
Starting();
do { IFC(); } while ( digitalRead(RunTimer) == HIGH);
TIMER();
}
void MAIN()
{
// Start a new measurement:
//-------------Ultrasonics------------//
// Every 500 miliseconds, do a measurement using the sensor and print the distance in centimeters.
int Cm1 = distanceSensor1.measureDistanceCm();
int Cm2 = distanceSensor2.measureDistanceCm();
int Cm3 = distanceSensor3.measureDistanceCm();
Cm1 = Tank1_max - Cm1; // water height, 0 - 50 cm
Cm2 = Tank2_max - Cm2; // water height, 0 - 50 cm
Cm3 = Tank3_max - Cm3; // water height, 0 - 50 cm
int percent1 = 2 * Cm1;
int percent2 = 2 * Cm2;
int percent3 = 2 * Cm3;
//-------------Temperatures------------//
sensors.requestTemperatures();
float TempC1;
TempC1 = round(sensors.getTempCByIndex(0));
// Showing DATA:
lcd.setCursor(0, 1);
lcd.print("Set Temp.:");
if(digitalRead(inc)==LOW) { if(SetPoint>0) { SetPoint--;}}
if(digitalRead(dec)==LOW) { if(SetPoint<150) { SetPoint++;}}
lcd.setCursor(11, 1);
lcd.print(SetPoint);
lcd.setCursor(14, 1);
lcd.print(char(223));
lcd.print("c");
lcd.setCursor(0, 2);
lcd.print("T1:");
lcd.setCursor(3, 2);
lcd.print(" ");
lcd.setCursor(3, 2);
lcd.print(percent1);
lcd.setCursor(6, 2);
lcd.print("% ");
lcd.setCursor(0, 3);
lcd.print("T2:");
lcd.setCursor(3, 3);
lcd.print(" ");
lcd.setCursor(3, 3);
lcd.print(percent2);
lcd.setCursor(6, 3);
lcd.print("% ");
lcd.setCursor(8, 3);
lcd.print("H:");
if (digitalRead(Heater) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); }
lcd.setCursor(14, 2);
lcd.print("C:");
lcd.setCursor(16, 2);
lcd.print(" ");
lcd.setCursor(16, 2);
lcd.print(TempC1,0);
lcd.setCursor(19, 2);
lcd.print(char(223));
lcd.setCursor(14, 3);
lcd.print("M:");
if (digitalRead(Motor) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); }
delay(5);
if (digitalRead(set) == LOW)
{
delay(100);
while (sec_flag)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET SECONDS: ");
lcd.print(sec);
delay(100);
if (digitalRead(inc) == LOW)
{
sec = sec + 1;
if (sec >= 60) sec = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
sec = sec - 1;
if (sec <= -1) sec = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
sec_flag = false;
delay(250);
}
}
while (min_flag)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET MINUTES: ");
lcd.print(Min);
delay(100);
if (digitalRead(inc) == LOW)
{
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
Min = Min - 1;
if (Min <= -1) Min = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
min_flag = false;
delay(250);
}
}
while (hrs_flag)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET HOURS: ");
lcd.print(hrs);
delay(100);
if (digitalRead(inc) == LOW)
{
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW)
{
hrs = hrs - 1;
if (hrs <= -1) hrs = 0;
delay(100);
}
if (digitalRead(set) == LOW)
{
hrs_flag = false;
delay(250);
}
}
if (hrs == 0 && Min == 0 && sec == 0)
{
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" INVALID TIME ");
lcd.setCursor(0, 2);
lcd.print("!!!!!!!!!!!!!!!!!!!!");
delay(2000);
}
else
{
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
EEPROM.write(add_sec, sec);
}
INIT();
}
}
void Starting()
{
// Start a new measurement:
//-------------Ultrasonics------------//
// Every 500 miliseconds, do a measurement using the sensor and print the distance in centimeters.
int Cms = distanceSensor1.measureDistanceCm();
Cms = Tank1_max - Cms; // water height, 0 - 50 cm
int percents = 2 * Cms;
//if ( percents < 100 ){ digitalWrite(Pumb, LOW);}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Starting : **Wait**");
delay(3000);
lcd.setCursor(0, 1);
lcd.print("Cheking ...");
delay(3000);
lcd.setCursor(0, 2);
lcd.print("Loading Data ...");
delay(3000);
lcd.setCursor(0, 3);
lcd.print("Cycle Started...");
delay(2000);
lcd.clear();
digitalWrite(Buzzer, LOW);
delay(4000);
digitalWrite(Buzzer, HIGH);
}
void IFC()
{
lcd.setCursor(0, 0);
lcd.print("Starting : **Wait**");
// Start a new measurement:
//-------------Ultrasonics------------//
// Every 500 miliseconds, do a measurement using the sensor and print the distance in centimeters.
int Cm11 = distanceSensor1.measureDistanceCm();
int Cm22 = distanceSensor2.measureDistanceCm();
int Cm33 = distanceSensor3.measureDistanceCm();
Cm11 = Tank1_max - Cm11; // water height, 0 - 50 cm
Cm22 = Tank2_max - Cm22; // water height, 0 - 50 cm
Cm33 = Tank3_max - Cm33; // water height, 0 - 50 cm
int percent11 = 2 * Cm11;
int percent22 = 2 * Cm22;
int percent33 = 2 * Cm33;
//-------------Temperatures------------//
sensors.requestTemperatures();
float TempC2;
TempC2 = round(sensors.getTempCByIndex(0));
lcd.setCursor(0, 1);
lcd.print("Tank1:");
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(percent11);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Tank2:");
lcd.setCursor(6, 2);
lcd.print(" ");
lcd.setCursor(6, 2);
lcd.print(percent22);
lcd.print("%");
lcd.setCursor(14, 2);
lcd.print("C:");
lcd.setCursor(16, 2);
lcd.print(" ");
lcd.setCursor(16, 2);
lcd.print(TempC2,0);
lcd.setCursor(19, 2);
lcd.print(char(223));
lcd.setCursor(0, 3);
lcd.print("P:");
//if (digitalRead(Pumb) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); }
lcd.setCursor(6, 3);
lcd.print("H:");
if (digitalRead(Heater) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); }
lcd.setCursor(13, 3);
lcd.print("M:");
if (digitalRead(Motor) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); }
//if( percent11 <= 0 ){ digitalWrite(Pumb, LOW);}
//if( percent11 >= 100 ){ digitalWrite(Pumb, HIGH);}
//if( percent22 <= 50 && percent11 <= 0 ){ digitalWrite(Pumb, LOW);}
if( percent22 >= 70 ){ digitalWrite(Heater, LOW);}
if( percent22 <= 65 ){ digitalWrite(Heater, HIGH);}
if( TempC2 >= SetPoint ){ digitalWrite(Heater, HIGH);}
if( TempC2 >= SetPoint && percent22 >= 100){ digitalWrite(RunTimer, LOW);}
}
void TIMER()
{
sensors.requestTemperatures();
float TempC3;
TempC3 = round(sensors.getTempCByIndex(0));
if (digitalRead(RunTimer) == LOW)
{
lcd.clear();
delay(100);
digitalWrite(Buzzer, LOW);
delay(2000);
digitalWrite(Buzzer, HIGH);
RUN = true;
while (RUN)
{
if (digitalRead(emr) == LOW)
{
delay(500);
if (digitalRead(emr) == LOW)
{
digitalWrite(Motor, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("********************");
lcd.setCursor(0, 1);
lcd.print("* Emergancy STOP *");
lcd.setCursor(0, 2);
lcd.print("********************");
delay(4000);
RUN = false;
INIT();
break;
}
}
digitalWrite(Motor, LOW);
time = millis()/1000;
if(time - timePrev >= 1)
{
sec--;
timePrev = time;
}
if(sec < 0)
{
Min--;
sec = 59;
}
if(Min < 0)
{
hrs--;
Min = 59;
}
if (hrs == -1) hrs = 0;
lcd.setCursor(3, 0);
lcd.print("Remaning Time");
lcd.setCursor(0, 1);
lcd.print("####################");
lcd.setCursor(0, 3);
lcd.print("####################");
lcd.setCursor(6, 2);
if (hrs <= 9)
{
lcd.print('0');
}
lcd.print(hrs);
lcd.print(':');
if (Min <= 9)
{
lcd.print('0');
}
lcd.print(Min);
lcd.print(':');
if (sec <= 9)
{
lcd.print('0');
}
lcd.print(sec);
if (hrs == 0 && Min == 0 && sec == 0)
{
digitalWrite(Motor, HIGH);
lcd.setCursor(0, 0);
lcd.print("####################");
lcd.setCursor(0, 1);
lcd.print(" CYCLE ");
lcd.setCursor(0, 2);
lcd.print(" COMPLETED ");
lcd.setCursor(0, 3);
lcd.print("####################");
delay(4000);
RUN = false;
for (int i = 0; i < 5; i++)
{
digitalWrite(Buzzer, LOW);
delay(10000);
digitalWrite(Buzzer, HIGH);
delay(100);
}
INIT();
}
}
}
}
void INIT()
{
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = EEPROM.read(add_sec);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Timer:");
lcd.setCursor(11, 0);
if (hrs <= 9) { lcd.print('0');}
lcd.print(hrs);
lcd.print(':');
if (Min <= 9) { lcd.print('0');}
lcd.print(Min);
lcd.print(':');
if (sec <= 9) { lcd.print('0');}
lcd.print(sec);
sec_flag = true;
min_flag = true;
hrs_flag = true;
delay(500);
}