#define S3 0
#define S1 1
#define S2 2
#define V1 3 // Flow restrictor bypass
#define Y 4 // Chiller call for refrigeration
#define V2 5 // RO membrane flush
#define V3 6 // Recirculation
#define LH 7 // High water level switch
#define LL 8 // Low water level switch
#define V4 9 // Tank fill valve
#define V5 10 // RO membrane bypass (pre-filtered)
#define LM 11 // Minimum water level switch (Safety cut-out)
#define PS 12 // Leaving water pressure switch
#define DV 13 // Tank drain valve
#define SV 14 // RO system supply valve
#define PP 15 // leaving water pressure pump
#define PY 16 // Chiller circulation pump
#define B1 17 // Button
#define HB 18 // Heart beat indicator
#define EST_NTC A6
#define CWT_NTC A7
float EST;
float CWT;
const int setpoint = 38;
int page;
int paragraph;
int sentence;
int verb[10];
int noun;
// global variables
unsigned long currentMillis;
// defrost variables
int triggerDefrost;
int cycleDefrost;
unsigned long durDefrost; // milliseconds
long ofstDefrost;
// Timer_1 variables
int state;
unsigned int a;
int blink;
long offTime = 1000;
long onTime = 1000;
unsigned long previousMillis;
// timer_2 variables
int trigger_2;
int cycle_2;
unsigned long dur_2; // milliseconds
long ofst_2;
// timer_3 variables
int trigger_3;
int cycle_3;
unsigned long dur_3; // milliseconds
long ofst_3;
void setup() {
pinMode(S3, INPUT_PULLUP);
pinMode(S1, INPUT_PULLUP);
pinMode(S2, INPUT_PULLUP);
pinMode(LH, INPUT_PULLUP);
pinMode(LL, INPUT_PULLUP);
pinMode(LM, INPUT_PULLUP);
pinMode(PS, INPUT_PULLUP);
pinMode(B1, INPUT_PULLUP);
pinMode(V1, OUTPUT);
pinMode(Y, OUTPUT);
pinMode(V2, OUTPUT);
pinMode(V3, OUTPUT);
pinMode(V4, OUTPUT);
pinMode(V5, OUTPUT);
pinMode(DV, OUTPUT);
pinMode(SV, OUTPUT);
pinMode(PP, OUTPUT);
pinMode(PY, OUTPUT);
pinMode(HB, OUTPUT);
analogWrite(V1, 0);
digitalWrite(Y, LOW);
analogWrite(V2, 0);
analogWrite(V3, 0);
analogWrite(V4, 0);
analogWrite(V5, 0);
digitalWrite(DV, LOW);
digitalWrite(SV, LOW);
digitalWrite(PP, LOW);
digitalWrite(PY, LOW);
digitalWrite(HB, HIGH);
delay(1000);
digitalWrite(HB, LOW);
triggerDefrost = 0;
cycleDefrost = 0;
trigger_2 = 0;
cycle_2 = 0;
trigger_3 = 0;
cycle_3 = 0;
currentMillis = millis();
}
void loop() {
while(page == 0) { // System Off
analogWrite(V1, 0);
digitalWrite(Y, LOW);
analogWrite(V2, 0);
analogWrite(V3, 0);
analogWrite(V4, 0);
analogWrite(V5, 0);
digitalWrite(DV, LOW);
digitalWrite(SV, LOW);
digitalWrite(PP, LOW);
digitalWrite(PY, LOW);
inputs();
if(page != 0) {
break;
}
delay(1000);
}
while(page == 1) { // Normal Operation
inputs();
timer_1();
digitalWrite(HB, a);
NTC();
defrost();
if(cycleDefrost == 0) {
if(EST > 32) {
if(CWT >= (setpoint + 2)) {
digitalWrite(PY, HIGH);
digitalWrite(Y, HIGH);
}
else if(CWT <= setpoint) {
digitalWrite(PY, LOW);
digitalWrite(Y, LOW);
}
}
else if(EST <= 32) {
digitalWrite(PY, LOW);
digitalWrite(Y, LOW);
triggerDefrost = 1;
durDefrost = 300000;
}
}
else {
digitalWrite(PY, LOW);
digitalWrite(Y, LOW);
}
timer_2();
if(digitalRead(PS) == HIGH) {
digitalWrite(PP, LOW);
verb[0] = 0;
}
else if(digitalRead(PS) == LOW) {
if(verb[0] == 0) {
trigger_2 = 1;
dur_2 = 2000;
verb[0] = 1;
}
else if(verb[0] == 1) {
if(cycle_2 == 1) {
digitalWrite(PP, LOW);
}
else if(cycle_2 == 0) {
digitalWrite(PP, HIGH);
}
}
}
if((digitalRead(LL) == LOW) && (digitalRead(LH) == LOW)) {
verb[1] = 0;
analogWrite(V4, 0);
digitalWrite(SV, LOW);
}
else if((digitalRead(LL) == LOW) && (digitalRead(LH) == HIGH)) {
}
else if((digitalRead(LL) == HIGH) && (digitalRead(LH) == HIGH)) {
if(verb[1] == 0) {
digitalWrite(SV, HIGH);
analogWrite(V4, 255);
delay(1000);
for(int i = 255; i > 80; i--) {
analogWrite(V4, i);
}
verb[1] = 1;
}
}
}
while(page == 2) { // Membrane Flush
while(paragraph == 1) {
analogWrite(V1, 0);
digitalWrite(Y, LOW);
analogWrite(V2, 0);
analogWrite(V3, 0);
analogWrite(V4, 0);
analogWrite(V5, 0);
digitalWrite(DV, LOW);
digitalWrite(SV, LOW);
digitalWrite(PP, LOW);
digitalWrite(PY, LOW);
digitalWrite(HB, HIGH);
paragraph = 2;
}
while( paragraph == 2) {
timer_1();
digitalWrite(HB, a);
if(noun == 1) {
dur_2 = 300000;
dur_3 = 420000;
trigger_2 = 1;
trigger_3 = 1;
analogWrite(V1, 255);
analogWrite(V2, 255);
delay(1000);
for(int i = 255; i > 80; i--) {
analogWrite(V1, i);
analogWrite(V2, i);
}
digitalWrite(SV, HIGH);
noun = 2;
}
timer_2();
timer_3();
if(cycle_2 == 0) {
analogWrite(V1, 0);
}
if(cycle_3 == 0) {
analogWrite(V2, 0);
}
if((cycle_2 == 0) && (cycle_3 == 0)) {
digitalWrite(SV, LOW);
digitalWrite(HB, HIGH);
paragraph = 3;
}
}
while(paragraph == 3) {
inputs();
if(page == 0) {
break;
}
else if(page == 1) {
paragraph = 0;
sentence = 0;
noun = 0;
for(int i = 0; i < 10; i++) {
verb[i] = 0;
}
break;
}
}
}
while(page == 3) { // Cleaning Cycle
// set all outputs LOW
while(paragraph == 1) {
analogWrite(V1, 0);
digitalWrite(Y, LOW);
analogWrite(V2, 0);
analogWrite(V3, 0);
analogWrite(V4, 0);
analogWrite(V5, 0);
digitalWrite(DV, LOW);
digitalWrite(SV, LOW);
digitalWrite(PP, LOW);
digitalWrite(PY, LOW);
digitalWrite(HB, HIGH);
paragraph = 2;
}
// Drain
while(paragraph == 2) {
if(digitalRead(LM) == HIGH) {
digitalWrite(DV, LOW);
digitalWrite(HB, LOW);
delay(1000);
paragraph = 3;
verb[2] = 1;
}
else if(digitalRead(LM) == LOW) {
digitalWrite(DV, HIGH);
digitalWrite(HB, HIGH);
}
}
// First fill (pre-filtered water)
while(paragraph == 3) {
if(digitalRead(LL) == HIGH) {
timer_1();
digitalWrite(HB, a);
if(verb[2] == 1) {
analogWrite(V4, 255);
analogWrite(V5, 255);
delay(1000);
for(int i = 255; i > 80; i--) {
analogWrite(V4, i);
analogWrite(V5, i);
}
verb[2] = 2;
}
digitalWrite(SV, HIGH);
}
else if(digitalRead(LL) == LOW) {
digitalWrite(SV, LOW);
analogWrite(V4, 0);
analogWrite(V5, 0);
verb[2] = 1;
paragraph = 4;
sentence = 1;
}
}
// Wash cycle
while(paragraph == 4) {
while(sentence == 1) {
trigger_3 = 1;
dur_3 = 10000; // 900000 (15 minutes)
sentence = 2;
timer_3();
}
while(sentence == 2) {
timer_3();
timer_1();
digitalWrite(HB, a);
if(cycle_3 == 1) {
if(verb[2] == 1) {
analogWrite(V3, 255);
delay(1000);
for(int i = 255; i > 80; i--) {
analogWrite(V3, i);
}
verb[2] = 2;
}
digitalWrite(PY, HIGH);
timer_2();
if(digitalRead(PS) == HIGH) {
digitalWrite(PP, LOW);
verb[0] = 0;
}
else if(digitalRead(PS) == LOW) {
if(verb[0] == 0) {
trigger_2 = 1;
dur_2 = 2000;
verb[0] = 1;
}
else if(verb[0] == 1) {
if(cycle_2 == 1) {
digitalWrite(PP, LOW);
}
else if(cycle_2 == 0) {
digitalWrite(PP, HIGH);
}
}
}
}
else if(cycle_3 == 0) {
analogWrite(V3, 0);
digitalWrite(PY, LOW);
digitalWrite(PP, LOW);
digitalWrite(HB, LOW);
verb[2] = 1;
sentence = 1;
paragraph = 5;
}
}
}
// Drain 2
while(paragraph == 5) {
if(digitalRead(LM) == HIGH) {
digitalWrite(DV, LOW);
digitalWrite(HB, LOW);
delay(1000);
paragraph = 6;
verb[2] = 1;
}
else if(digitalRead(LM) == LOW) {
digitalWrite(DV, HIGH);
digitalWrite(HB, HIGH);
}
}
// Second fill (RO water)
while(paragraph == 6) {
if(digitalRead(LL) == HIGH) {
timer_1();
digitalWrite(HB, a);
if(verb[2] == 1) {
analogWrite(V4, 255);
delay(1000);
for(int i = 255; i > 80; i--) {
analogWrite(V4, i);
}
verb[2] = 2;
}
digitalWrite(SV, HIGH);
}
else if(digitalRead(LL) == LOW) {
digitalWrite(SV, LOW);
analogWrite(V4, 0);
verb[2] = 1;
paragraph = 7;
sentence = 1;
}
}
// DONE! Wait for mode switch to return to NORMAL or OFF
while(paragraph == 7) {
inputs();
if(page == 0) {
break;
}
else if(page == 1) {
paragraph = 0;
sentence = 0;
noun = 0;
for(int i = 0; i < 10; i++) {
verb[i] = 0;
}
break;
}
else {
digitalWrite(HB, HIGH);
}
}
}
while(page == 4) {
}
}
void NTC() {
const int beta = 3950;
float read_1;
float read_2;
float celsius;
read_1 = 0.0;
read_2 = 0.0;
for(int i = 0; i < 10; i++) {
read_1 = (read_1 + analogRead(A6));
delay(5);
}
float average_1 = (read_1 / 10);
for(int i = 0; i < 10; i++) {
read_2 = read_2 + analogRead(A7);
delay(5);
}
float average_2 = (read_2 / 10);
celsius = 1 / (log(1 / (1023.0 / average_1 - 1)) / beta + 1.0 / 298.15) - 273.15;
EST = ((celsius * 1.8) + 32);
celsius = 1 / (log(1 / (1023.0 / average_2 - 1)) / beta + 1.0 / 298.15) - 273.15;
CWT = ((celsius * 1.8) + 32);
}
void inputs() {
if((digitalRead(S1) == HIGH) && (digitalRead(S2) == HIGH) && (digitalRead(S3) == HIGH)) {
page = 0;
}
else if((digitalRead(S1) == LOW) && (digitalRead(S2) == HIGH) && (digitalRead(S3) == HIGH)) {
page = 1;
}
else if((digitalRead(S1) == HIGH) && (digitalRead(S2) == LOW) && (digitalRead(S3) == HIGH)) {
page = 2;
if(paragraph != 3) {
paragraph = 1;
noun = 1;
verb[1] = 0;
}
else if(paragraph == 3) {
paragraph = 3;
}
}
else if((digitalRead(S1) == LOW) && (digitalRead(S2) == HIGH) && (digitalRead(S3) == LOW)) {
page = 3;
if(paragraph != 7) {
paragraph = 1;
}
else if(paragraph == 7) {
paragraph = 7;
}
}
else if((digitalRead(S1) == HIGH) && (digitalRead(S2) == LOW) && (digitalRead(S3) == LOW)) {
page = 4;
}
}
void defrost() {
currentMillis = millis();
if(triggerDefrost == 1) {
ofstDefrost = currentMillis;
triggerDefrost = 0;
}
if(currentMillis < (ofstDefrost + durDefrost)) {
cycleDefrost = 1;
}
if(currentMillis > (ofstDefrost + durDefrost)) {
cycleDefrost = 0;
}
}
void timer_3() {
currentMillis = millis();
if(trigger_3 == 1) {
ofst_3 = currentMillis;
trigger_3 = 0;
}
if(currentMillis < (ofst_3 + dur_3)) {
cycle_3 = 1;
}
if(currentMillis > (ofst_3 + dur_3)) {
cycle_3 = 0;
}
}
void timer_2() {
currentMillis = millis();
if(trigger_2 == 1) {
ofst_2 = currentMillis;
trigger_2 = 0;
}
if(currentMillis < (ofst_2 + dur_2)) {
cycle_2 = 1;
}
if(currentMillis > (ofst_2 + dur_2)) {
cycle_2 = 0;
}
}
void timer_1() {
currentMillis = millis();
if ((a == HIGH) && (currentMillis - previousMillis >= offTime)) {
a = LOW;
previousMillis = currentMillis;
blink = 1;
}
else if((a == LOW) && (currentMillis - previousMillis >= onTime)) {
a = HIGH;
previousMillis = currentMillis;
blink = 0;
}
}
EST
CWT
Chiller Y-call
Drain Valve
Supply Valve
Pressure Pump
Chiller Pump