#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int Main_menu = 0;
const int H20_sensor_tripped = 1;
const int Waiting_for_H20_Sensor_Delay_on = 2;
const int Truning_H20_pump_on = 3;
const int Waiting_for_low_H20_level = 4;
const int Pumping_H20 = 5;
const int Pump_tripped_out = 6;
const int Waiting_for_reset = 7;
char Main_R1[] = "FishTank";
char Main_R2[] = "# of Fills ";
char PTO_R1[] = "Pump has";
char PTO_R2[] = "tripped out!";
char LW_R1[] = "Low water has";
char LW_R2[] = "been detected";
char PW_R1[] = "Pumping water";
char PW_R2[] = "";
//--------------- I/O ----------------
int H20LevelSensor = 2;
int H20Pump_Triped_Reset = 3;
int H20Pump_Triped_LED = 11;
int H20Pump = 12;
//int HeartBeat = 13;
//------------------------------------
int ScanRate = 1; //in sec
int H20SensorDelay = 5; //Sensor needs to be on before turning the water pump on
int H20Pump_Max_Timer = 5; //Max time the water pump will be on
int H20Counter = 0;
int Mode = 0;
int Number_of_Fills = 0;
String StringName = "";
void setup()
{
lcd.init();
lcd.backlight();
pinMode (H20LevelSensor, INPUT);
pinMode (H20Pump_Triped_Reset, INPUT);
pinMode (H20Pump_Triped_LED, OUTPUT);
pinMode (H20Pump, OUTPUT);
Serial.begin(115200);
}
void loop()
{
switch (Mode)
{
case Main_menu:
Serial.print ("Main Menu "); Serial.println (Number_of_Fills);
Call_Print_Text(Main_R1,0);
StringName = (String(Main_R2) + String(Number_of_Fills));
Call_Print_Text(StringName,1);
digitalWrite(H20Pump, LOW);
Mode = H20_sensor_tripped;
break;
case H20_sensor_tripped:
if (digitalRead(H20LevelSensor) == LOW)
{
Serial.println("H20 low level has been Detected");
Call_Print_Text(LW_R1,0);
Call_Print_Text(LW_R2,1);
Mode = Waiting_for_H20_Sensor_Delay_on;
}
break;
case Waiting_for_H20_Sensor_Delay_on:
for (int l = 0; l < H20SensorDelay; l++)
{
if (digitalRead(H20LevelSensor) == HIGH) {Mode = Main_menu; break;}
Serial.println(H20SensorDelay -l);
delay(ScanRate * 1000);
}
if (digitalRead(H20LevelSensor) == LOW) {Mode = Truning_H20_pump_on;}
break;
case Truning_H20_pump_on:
digitalWrite(H20Pump, HIGH);
Call_Print_Text(PW_R1,0);
Call_Print_Text("",1);
Serial.println("Pumping H20");
Mode = Pumping_H20;
break;
case Pumping_H20:
for (int l = 0; l < (H20Pump_Max_Timer); l++)
{
StringName = String(H20Pump_Max_Timer - l ) + " Secs";
Call_Print_Text(StringName, 1);
if (digitalRead(H20LevelSensor) == HIGH)
{
Number_of_Fills = Number_of_Fills + 1;
Mode = Main_menu; break;
}
Serial.println(H20Pump_Max_Timer - l );
delay(ScanRate * 1000);
}
if (digitalRead(H20LevelSensor) == LOW) {Mode = Pump_tripped_out;}
break;
case Pump_tripped_out:
digitalWrite(H20Pump_Triped_LED, HIGH);
digitalWrite(H20Pump, LOW);
Call_Print_Text(PTO_R1,0);
Call_Print_Text(PTO_R2,1);
Serial.println("Pump tripped out");
Mode = Waiting_for_reset;
break;
case Waiting_for_reset:
if (digitalRead(H20Pump_Triped_Reset) == LOW)
{
digitalWrite(H20Pump_Triped_LED, LOW);
Serial.println("Reset");
Mode = Main_menu;
}
else
{
digitalWrite(H20Pump_Triped_LED, !digitalRead(H20Pump_Triped_LED));
delay(ScanRate * 1000);
}
break;
}
delay(100);
}
void Call_Print_Text (String Text, int Row)
{
float len = (16 - Text.length()) / 2;
lcd.setCursor (0, Row); lcd.println(" ");
lcd.setCursor (len, Row); lcd.println(Text);
}