// home version
const byte ON = HIGH;
const byte OFF = LOW;
const byte OPEN = HIGH;
const byte CLOSED = LOW;
const byte WaterAvailable = LOW;
const byte tankFull = HIGH; // a HIGH reading of the upper sensor == tank is full
const byte tankEmpty = HIGH; // a HIGH reading of the lower sensor == tank is empty
const byte lowLevel1_Pin = 3;
const byte highLevel1_Pin = 4;
const byte sump_Pin = 5; // Sump Level
const byte lowLevel2_Pin = 6;
const byte highLevel2_Pin = 7;
const byte lowLevel3_Pin = 8;
const byte highLevel3_Pin = 9;
const byte motor_Pin = 12; // thirteen is unlucky.
const byte valve1_Pin = A0;
const byte valve2_Pin = 10;
const byte valve3_Pin = 11;
void setup() {
// INPUTS
pinMode(lowLevel1_Pin, INPUT_PULLUP);
pinMode(highLevel1_Pin, INPUT_PULLUP);
pinMode(lowLevel2_Pin, INPUT_PULLUP);
pinMode(highLevel2_Pin, INPUT_PULLUP);
pinMode(lowLevel3_Pin, INPUT_PULLUP);
pinMode(highLevel3_Pin, INPUT_PULLUP);
pinMode(sump_Pin, INPUT_PULLUP);
// OUTPUTS
digitalWrite(motor_Pin,OFF);
digitalWrite(valve1_Pin,CLOSED);
digitalWrite(valve2_Pin,CLOSED);
digitalWrite(valve3_Pin,CLOSED);
pinMode(motor_Pin, OUTPUT);
pinMode(valve1_Pin, OUTPUT);
pinMode(valve2_Pin, OUTPUT);
pinMode(valve3_Pin, OUTPUT);
// delay(1000); // why?
}
void loop() {
delay(125); // no need for speed here
// static bool pumpState = OFF;
// alternate state variables
static bool tank1Needs, tank2Needs, tank3Needs;
// static bool valveState = CLOSED;
/* real world section input
bool tank1Full = digitalRead(highLevel1_Pin);
bool tank2Full = digitalRead(highLevel2_Pin);
bool tank3Full = digitalRead(highLevel3_Pin);
bool tank1Empty = digitalRead(lowLevel1_Pin);
bool tank2Empty = digitalRead(lowLevel2_Pin);
bool tank3Empty = digitalRead(lowLevel3_Pin);
*/
/* simpulated input section */
analogRead(A1);
int tank1Level = analogRead(A1);
analogRead(A2);
int tank2Level = analogRead(A2);
analogRead(A3);
int tank3Level = analogRead(A3);
bool tank1Full = tank1Level > 923;
bool tank2Full = tank2Level > 923;
bool tank3Full = tank3Level > 923;
bool tank1Empty = tank1Level < 100;
bool tank2Empty = tank2Level < 100;
bool tank3Empty = tank3Level < 100;
/* end of simulated tank sensor input */
// basic hysteresis
if (tank1Empty) tank1Needs = true;
if (tank2Empty) tank2Needs = true;
if (tank3Empty) tank3Needs = true;
if (tank1Full) tank1Needs = false;
if (tank2Full) tank2Needs = false;
if (tank3Full) tank3Needs = false;
// might as well top off the other tanks
if (tank1Empty || tank2Empty || tank3Empty) {
if (!tank1Full) tank1Needs = true;
if (!tank2Full) tank2Needs = true;
if (!tank3Full) tank3Needs = true;
}
// only in case the sump has enough water for pumping
if (digitalRead(sump_Pin) != WaterAvailable) {
digitalWrite(valve1_Pin, CLOSED);
digitalWrite(valve2_Pin, CLOSED);
digitalWrite(valve3_Pin, CLOSED);
digitalWrite(motor_Pin, OFF);
return; // no water available, all done
}
digitalWrite(valve1_Pin, tank1Needs ? OPEN : CLOSED);
digitalWrite(valve2_Pin, tank2Needs ? OPEN : CLOSED);
digitalWrite(valve3_Pin, tank3Needs ? OPEN : CLOSED);
digitalWrite(motor_Pin, (tank1Needs || tank2Needs || tank3Needs) ? ON : OFF);
}