Here is the code for the Arduino: https://gist.github.com/klearchos/7b3965ce4db81e89756d0042cf85fc9e
#define POT_1_FLOAT_SENSOR 2
#define POT_1_RELAY_1 11
#define PIPE_1_FLOAT_SENSOR 5
#define PIPE_1_RELAY_1 9
#define PIPE_2_FLOAT_SENSOR 3
#define PIPE_2_RELAY_2 10
#define PIPE_3_RELAY_3 12
#define PIPE_3_FLOAT_SENSOR 4
// pot 1
const unsigned long POT_1_MAX_WATERING_PERIOD = 120000;
const unsigned long POT_1_DRAIN_PERIOD = 70000;
unsigned long pot1StartMillis = 0;
unsigned long pot1DelayStartMillis = 0;
// Pipe 2
const unsigned long PIPE_2_MAX_WATERING_PERIOD = 300000;
const unsigned long PIPE_2_DRAIN_PERIOD = 300000;
unsigned long pipe2DelayStartMillis = 0;
unsigned long pipe2StartMillis = 0;
// Pipe 3
const unsigned long PIPE_3_MAX_WATERING_PERIOD = 760000;
const unsigned long PIPE_3_DRAIN_PERIOD = 300000;
unsigned long pipe3DelayStartMillis = 0;
unsigned long pipe3StartMillis = 0;
// Pipe 1
const unsigned long PIPE_1_MAX_WATERING_PERIOD = 180000;
const unsigned long PIPE_1_DRAIN_PERIOD = 300000;
unsigned long pipe1DelayStartMillis = 0;
unsigned long pipe1StartMillis = 0;
bool pot1RedFlag = false;
bool pot1SetStartTime = false;
bool pipe1RedFlag = false;
bool pipe1SetStartTime = false;
bool pipe2RedFlag = false;
bool pipe2SetStartTime = false;
bool pipe3RedFlag = false;
bool pipe3SetStartTime = false;
void setup()
{
Serial.begin(9600);
// initialize the pushbutton pin as an input:
pinMode(POT_1_FLOAT_SENSOR, INPUT_PULLUP);
pinMode(POT_1_RELAY_1, OUTPUT);
digitalWrite(POT_1_RELAY_1, LOW);
pinMode(PIPE_1_FLOAT_SENSOR, INPUT_PULLUP);
pinMode(PIPE_1_RELAY_1, OUTPUT);
digitalWrite(PIPE_1_RELAY_1, LOW);
pinMode(PIPE_2_FLOAT_SENSOR, INPUT_PULLUP);
pinMode(PIPE_2_RELAY_2, OUTPUT);
digitalWrite(PIPE_2_RELAY_2, LOW);
pinMode(PIPE_3_FLOAT_SENSOR, INPUT_PULLUP);
pinMode(PIPE_3_RELAY_3, OUTPUT);
digitalWrite(PIPE_3_RELAY_3, LOW);
pot1StartMillis = millis();
pipe1StartMillis = millis();
pipe2StartMillis = millis();
pipe3StartMillis = millis();
}
void loop()
{
checkAbstractWateringTimer(pot1SetStartTime, pot1RedFlag, pot1DelayStartMillis,
POT_1_DRAIN_PERIOD, POT_1_MAX_WATERING_PERIOD,
pot1StartMillis, POT_1_FLOAT_SENSOR, POT_1_RELAY_1);
checkAbstractWateringTimer(pipe1SetStartTime, pipe1RedFlag, pipe1DelayStartMillis,
PIPE_1_DRAIN_PERIOD, PIPE_1_MAX_WATERING_PERIOD,
pipe1StartMillis, PIPE_1_FLOAT_SENSOR, PIPE_1_RELAY_1);
checkAbstractWateringTimer(pipe2SetStartTime, pipe2RedFlag, pipe2DelayStartMillis,
PIPE_2_DRAIN_PERIOD, PIPE_2_MAX_WATERING_PERIOD,
pipe2StartMillis, PIPE_2_FLOAT_SENSOR, PIPE_2_RELAY_2);
checkAbstractWateringTimer(pipe3SetStartTime, pipe3RedFlag, pipe3DelayStartMillis,
PIPE_3_DRAIN_PERIOD, PIPE_3_MAX_WATERING_PERIOD,
pipe3StartMillis, PIPE_3_FLOAT_SENSOR, PIPE_3_RELAY_3);
delay(200);
}
void checkAbstractWateringTimer(bool &abstractSetStartTime, bool &abstractRedFlag, unsigned long &abstractDelayStartMillis,
unsigned long abstractDrainPeriod, unsigned long abstractMaxWateringPeriod,
unsigned long &abstractStartMillis, int abstractFloatSensor, int abstractRelay) {
if (!abstractSetStartTime || (abstractSetStartTime && millis() - abstractDelayStartMillis >= abstractDrainPeriod)) {
if(digitalRead(abstractFloatSensor) == LOW && !abstractRedFlag) // Need one more condition in order to emulate the delay...
{
digitalWrite(abstractRelay, LOW);
Serial.println("Pot 1 pump is open");
// Set it only once at the beginning
if (pot1SetStartTime) {
abstractStartMillis = millis();
abstractSetStartTime = false;
}
Serial.print("duration ");
Serial.println(millis() - abstractStartMillis);
if (millis() - abstractStartMillis >= abstractMaxWateringPeriod) //test whether the MAX watering period has elapsed
{
// Close pump and do not oopen it again. Red Flag...
Serial.println("Pot 1 pump is closed and the red flag is ON");
digitalWrite(abstractRelay, HIGH);
abstractRedFlag = true;
}
}
else
{
Serial.println("Pot 1 Pump is closed");
digitalWrite(abstractRelay, HIGH);
abstractSetStartTime = true;
abstractDelayStartMillis = millis();
}
}
}