//Thermostat 1
#define G_T1 2
#define Y1_T1 3
#define Y2_T1 4
#define W1_T1 5
#define W2_T1 6
#define B_T1 7
// Thermostat 2
#define G_T2 8
#define Y1_T2 9
#define Y2_T2 10
#define W1_T2 11
#define W2_T2 12
#define B_T2 13
// Air handler / indoor unit 1
#define G_A1 22
#define W1_A1 23
#define W2_A1 24
#define NTC_A1 A0
// Air handler / indoor unit 2
#define G_A2 25
#define W1_A2 26
#define W2_A2 27
#define NTC_A2 A1
// condenser / outdoor unit 1
#define Y1 28
#define ODF1 29
#define B1 30
#define HPCO1 31
#define LPCO1 32
#define NTC_O1 A2
// condenser / outdoor unit 2
#define Y2 33
#define ODF2 34
#define B2 35
#define HPCO2 36
#define LPCO2 37
#define NTC_O2 A3
// accessory pins
#define Z1 38
#define Z2 39
#define Z3 40
#define Z4 41
#define Z5 42
#define Z6 43
#define Z7 44
#define Z8 45
#define txEnable 52
#define HB 53
float tempEvap_1 = 45;
float tempEvap_2;
float tempEvap_3;
float tempEvap_4;
const int tempMin = 30;
const int tempMax = 140;
int freeze;
const int lockoutSoft = 505;
const int lockoutHard = 506;
int watchdog_1;
int watchdog_2;
int watchdog_3;
int watchdog_4;
int page;
int paragraph;
int sentence;
int verb;
int noun;
// Timer_1 variables
int state;
unsigned int a;
int blink;
long offTime = 1000;
long onTime = 1000;
unsigned long previousMillis;
unsigned long currentMillis;
// Timer_2 variables
int trigger;
int cycle;
long duration_2; // milliseconds
long offset_2 = 30000;
const long delayOnCool = 10000;
const long delayOnHeat = 30000;
const long delayOff = 30000;
void setup() {
Serial.begin(9600);
pinMode(G_T1 , INPUT_PULLUP);
pinMode(Y1_T1, INPUT_PULLUP);
pinMode(Y2_T1, INPUT_PULLUP);
pinMode(W1_T1, INPUT_PULLUP);
pinMode(W2_T1, INPUT_PULLUP);
pinMode(B_T1 , INPUT_PULLUP);
pinMode(G_T2 , INPUT_PULLUP);
pinMode(Y1_T2, INPUT_PULLUP);
pinMode(Y2_T2, INPUT_PULLUP);
pinMode(W1_T2, INPUT_PULLUP);
pinMode(W2_T2, INPUT_PULLUP);
pinMode(B_T2 , INPUT_PULLUP);
pinMode(HPCO1, INPUT_PULLUP);
pinMode(LPCO1, INPUT_PULLUP);
pinMode(HPCO2, INPUT_PULLUP);
pinMode(LPCO2, INPUT_PULLUP);
pinMode(G_A1, OUTPUT);
pinMode(W1_A1, OUTPUT);
pinMode(W2_A1, OUTPUT);
pinMode(G_A2, OUTPUT);
pinMode(W1_A2, OUTPUT);
pinMode(W2_A2, OUTPUT);
pinMode(Y1, OUTPUT);
pinMode(ODF1, OUTPUT);
pinMode(B1, OUTPUT);
pinMode(Y2, OUTPUT);
pinMode(ODF2, OUTPUT);
pinMode(B2, OUTPUT);
digitalWrite(G_A1, LOW);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(G_A2, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
digitalWrite(Y1, LOW);
digitalWrite(ODF1, LOW);
digitalWrite(B1, LOW);
digitalWrite(Y2, LOW);
digitalWrite(ODF2, LOW);
digitalWrite(B2, LOW);
page = 0;
paragraph = 0;
sentence = 0;
verb = 0;
noun = 0;
trigger = 0;
cycle = 0;
currentMillis = millis();
watchdog_1 = 0;
watchdog_2 = 0;
watchdog_3 = 0;
watchdog_4 = 0;
freeze = 0;
}
void loop() {
Serial.println(page);
// Idle
while(page == 0) {
timer_1();
if(blink == 1) {
if(noun == 1){
verb = 1;
PS();
NTC();
Thermostats();
noun = 2;
}
}
else if(blink == 0) {
noun = 1;
}
if(digitalRead(G_T1) == LOW) {
digitalWrite(G_A1, HIGH);
}
else {
digitalWrite(G_A1, LOW);
}
if(digitalRead(G_T2) == LOW) {
digitalWrite(G_A2, HIGH);
}
else {
digitalWrite(G_A2, LOW);
}
digitalWrite(HB, HIGH);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
digitalWrite(Y1, LOW);
digitalWrite(ODF1, LOW);
digitalWrite(B1, LOW);
digitalWrite(Y2, LOW);
digitalWrite(ODF2, LOW);
digitalWrite(B2, LOW);
}
// 1 stage cooling, Compressor 1, thermostat 1
while(page == 1) {
duration_2 = delayOnCool;
timer_1();
if(blink == 1) {
if(noun == 1){
NTC();
Thermostats();
noun = 2;
}
}
else if(blink == 0) {
noun = 1;
}
digitalWrite(HB, a);
if(tempEvap_1 > tempMin) {
if(verb == 1) {
trigger = 1;
verb = 2;
}
else if(verb == 2) {
timer_2();
if(cycle == 1) {
digitalWrite(G_A1, HIGH);
digitalWrite(G_A2, LOW);
}
else if(cycle == 0) {
verb = 3;
}
}
else if(verb == 3) {
PS();
delay(1);
digitalWrite(ODF1, HIGH);
digitalWrite(B1, LOW);
digitalWrite(Y1, HIGH);
digitalWrite(ODF2, LOW);
digitalWrite(B2, LOW);
digitalWrite(Y2, LOW);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
}
}
else if(tempEvap_1 <= tempMin) {
freeze++;
page = lockoutSoft;
noun = 1;
break;
}
}
// 1 stage cooling, Compressor 2, thermostat 1
while(page == 2) {
duration_2 = delayOnCool;
timer_1();
if(blink == 1) {
if(noun == 1){
NTC();
Thermostats();
noun = 2;
}
}
else if(blink == 0) {
noun = 1;
}
digitalWrite(HB, a);
if(tempEvap_1 > tempMin) {
if(verb == 1) {
trigger = 1;
verb = 2;
}
else if(verb == 2) {
timer_2();
if(cycle == 1) {
digitalWrite(G_A1, HIGH);
digitalWrite(G_A2, LOW);
}
else if(cycle == 0) {
verb = 3;
}
}
else if(verb == 3) {
PS();
delay(1);
digitalWrite(ODF1, LOW);
digitalWrite(B1, LOW);
digitalWrite(Y1, LOW);
digitalWrite(ODF2, HIGH);
digitalWrite(B2, LOW);
digitalWrite(Y2, HIGH);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
}
}
else if(tempEvap_1 <= tempMin) {
freeze++;
page = lockoutSoft;
noun = 2;
break;
}
}
// 2 stage cooling, thermostat 1
while(page == 3) {
duration_2 = delayOnCool;
timer_1();
if(blink == 1) {
if(noun == 1){
NTC();
Thermostats();
noun = 2;
}
}
else if(blink == 0) {
noun = 1;
}
digitalWrite(HB, a);
if(tempEvap_1 > tempMin) {
if(verb == 1) {
trigger = 1;
verb = 2;
}
else if(verb == 2) {
timer_2();
if(cycle == 1) {
digitalWrite(G_A1, HIGH);
digitalWrite(G_A2, LOW);
}
else if(cycle == 0) {
verb = 3;
}
}
else if(verb == 3) {
PS();
delay(1);
digitalWrite(ODF1, HIGH);
digitalWrite(B1, LOW);
digitalWrite(Y1, HIGH);
digitalWrite(ODF2, HIGH);
digitalWrite(B2, LOW);
digitalWrite(Y2, HIGH);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
}
}
else if(tempEvap_1 <= tempMin) {
freeze++;
page = lockoutSoft;
noun = 3;
break;
}
}
// HPCO
while(page == 501) {
digitalWrite(G_A1, LOW);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(G_A2, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
digitalWrite(Y1, LOW);
digitalWrite(ODF1, LOW);
digitalWrite(B1, LOW);
digitalWrite(Y2, LOW);
digitalWrite(ODF2, LOW);
digitalWrite(B2, LOW);
delay(200);
if(watchdog_1 >= 3) {
page = lockoutHard;
paragraph = 1;
}
else if(watchdog_1 < 3) {
for(int i; i < 188; i++) {
digitalWrite(HB, HIGH);
delay(200);
digitalWrite(HB, LOW);
delay(200);
digitalWrite(HB, HIGH);
delay(200);
digitalWrite(HB, LOW);
delay(1000);
}
page = 0;
break;
}
}
// LPCO
while(page == 502) {
digitalWrite(G_A1, LOW);
digitalWrite(W1_A1, LOW);
digitalWrite(W2_A1, LOW);
digitalWrite(G_A2, LOW);
digitalWrite(W1_A2, LOW);
digitalWrite(W2_A2, LOW);
digitalWrite(Y1, LOW);
digitalWrite(ODF1, LOW);
digitalWrite(B1, LOW);
digitalWrite(Y2, LOW);
digitalWrite(ODF2, LOW);
digitalWrite(B2, LOW);
delay(200);
if(watchdog_2 >= 5) {
page = lockoutHard;
paragraph = 2;
}
else if(watchdog_2 < 5) {
for(int i; i < 90; i++) {
digitalWrite(HB, HIGH);
delay(200);
digitalWrite(HB, LOW);
delay(200);
digitalWrite(HB, HIGH);
delay(200);
digitalWrite(HB, LOW);
delay(200);
digitalWrite(HB, HIGH);
delay(200);
digitalWrite(HB, LOW);
delay(1000);
}
page = 0;
break;
}
}
}
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;
}
}
void timer_2() {
currentMillis = millis();
if(trigger == 1) {
offset_2 = currentMillis;
trigger = 0;
}
if(currentMillis < (offset_2 + duration_2)) {
cycle = 1;
}
if(currentMillis > (offset_2 + duration_2)) {
cycle = 0;
}
}
void Thermostats() {
// if Thermostat 1 isn't calling...
if((digitalRead(Y1_T1) == HIGH) && (digitalRead(Y2_T1) == HIGH) && (digitalRead(W1_T1) == HIGH) && (digitalRead(W2_T1) == HIGH )) {
page = 0;
if((digitalRead(Y1_T2) == LOW) || (digitalRead(Y2_T2) == LOW) || (digitalRead(W1_T2) == LOW) || (digitalRead(W2_T2) == LOW )) {
if((digitalRead(Y1_T2) == LOW) && (digitalRead(Y2_T2) == HIGH)) {
if(digitalRead(B_T2) == HIGH) {
page = 11;
}
else if(digitalRead(B_T2) == LOW) {
if((digitalRead(W1_T2) == HIGH) && (digitalRead(W2_T2) == HIGH)) {
page = 14;
paragraph = 1;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == HIGH)) {
page = 14;
paragraph = 2;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == LOW)) {
page = 14;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T2) == HIGH) && (digitalRead(Y2_T2) == LOW)) {
if(digitalRead(B_T2) == HIGH) {
page = 12;
}
else if(digitalRead(B_T2) == LOW) {
if((digitalRead(W1_T2) == HIGH) && (digitalRead(W2_T2) == HIGH)) {
page = 15;
paragraph = 1;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == HIGH)) {
page = 15;
paragraph = 2;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == LOW)) {
page = 15;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T2) == LOW) && (digitalRead(Y2_T2) == LOW)) {
if(digitalRead(B_T2) == HIGH) {
page = 13;
}
else if(digitalRead(B_T2) == LOW) {
if((digitalRead(W1_T2) == HIGH) && (digitalRead(W2_T2) == HIGH)) {
page = 16;
paragraph = 1;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == HIGH)) {
page = 16;
paragraph = 2;
}
else if((digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == LOW)) {
page = 16;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T2) == HIGH) && (digitalRead(Y2_T2) == HIGH) && (digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == HIGH)) {
page = 17;
}
else if((digitalRead(Y1_T2) == HIGH) && (digitalRead(Y2_T2) == HIGH) && (digitalRead(W1_T2) == HIGH) && (digitalRead(W2_T2) == LOW)) {
page = 18;
}
else if((digitalRead(Y1_T2) == HIGH) && (digitalRead(Y2_T2) == HIGH) && (digitalRead(W1_T2) == LOW) && (digitalRead(W2_T2) == LOW)) {
page = 19;
}
else {
page = 500;
}
}
}
// if Thermostat 1 is calling...
if((digitalRead(Y1_T1) == LOW) || (digitalRead(Y2_T1) == LOW) || (digitalRead(W1_T1) == LOW) || (digitalRead(W2_T1) == LOW )) {
if((digitalRead(Y1_T1) == LOW) && (digitalRead(Y2_T1) == HIGH)) {
if(digitalRead(B_T1) == HIGH) {
page = 1;
}
else if(digitalRead(B_T1) == LOW) {
if((digitalRead(W1_T1) == HIGH) && (digitalRead(W2_T1) == HIGH)) {
page = 4;
paragraph = 1;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == HIGH)) {
page = 4;
paragraph = 2;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == LOW)) {
page = 4;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T1) == HIGH) && (digitalRead(Y2_T1) == LOW)) {
if(digitalRead(B_T1) == HIGH) {
page = 2;
}
else if(digitalRead(B_T1) == LOW) {
if((digitalRead(W1_T1) == HIGH) && (digitalRead(W2_T1) == HIGH)) {
page = 5;
paragraph = 1;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == HIGH)) {
page = 5;
paragraph = 2;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == LOW)) {
page = 5;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T1) == LOW) && (digitalRead(Y2_T1) == LOW)) {
if(digitalRead(B_T1) == HIGH) {
page = 3;
}
else if(digitalRead(B_T1) == LOW) {
if((digitalRead(W1_T1) == HIGH) && (digitalRead(W2_T1) == HIGH)) {
page = 6;
paragraph = 1;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == HIGH)) {
page = 6;
paragraph = 2;
}
else if((digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == LOW)) {
page = 6;
paragraph = 3;
}
}
}
else if((digitalRead(Y1_T1) == HIGH) && (digitalRead(Y2_T1) == HIGH) && (digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == HIGH)) {
page = 7;
}
else if((digitalRead(Y1_T1) == HIGH) && (digitalRead(Y2_T1) == HIGH) && (digitalRead(W1_T1) == HIGH) && (digitalRead(W2_T1) == LOW)) {
page = 8;
}
else if((digitalRead(Y1_T1) == HIGH) && (digitalRead(Y2_T1) == HIGH) && (digitalRead(W1_T1) == LOW) && (digitalRead(W2_T1) == LOW)) {
page = 9;
}
else {
page = 500;
}
}
}
void PS() {
if((digitalRead(HPCO1) == HIGH) || (digitalRead(HPCO2) == HIGH)) {
page = 501;
watchdog_1 = watchdog_1 + 1;
}
if((digitalRead(LPCO1) == HIGH) || (digitalRead(LPCO2) == HIGH)) {
page = 502;
watchdog_2 = watchdog_2 + 1;
}
}
void NTC() {
}