#include <dht.h>
#include <LiquidCrystal_I2C.h>
#define txEnable 2
#define Y 5
#define spare_1 6
#define G 7
#define spare_2 8
#define W 9
#define CWP 10
#define sv_1 11
#define sv_2 12
#define NTC_CDT A0
#define NTC_ESTa A1
#define NTC_ESTw A6
#define NTC_CWT A7
// DHT22 variables
dht DHT_1;
dht DHT_2;
#define IATPIN 3
#define OATPIN 4
float tempIndoor;
float tempOutdoor;
// lcd variables
LiquidCrystal_I2C lcd(0x27, 20, 4);
unsigned long previousMillis;
unsigned long currentMillis;
unsigned long displayOffset;
unsigned long displayMillis;
const int duration_3 = 5000;
int d[5];
int e;
float CDT;
float ESTa;
float ESTw;
float CWT;
const int setpointCW = 38;
const int setpointAC = 85;
const int setpointAH = 50;
const int setpointDelta = 2;
const int CDTlimit = 220;
int hour;
int minute;
int second;
int chillerMode;
int airMode;
int condMode;
// Serial
const long baud = 9600;
const int master = 10;
int address = 101;
char data[64] = {0};
int y100;
int y200;
int y[16];
const int packet1 = 21;
const int chillerEnable = 40;
const int airEnable = 41;
const int condEnable = 42;
const int chillerDisable = 50;
const int airDisable = 51;
const int condDisable = 52;
const int allEnable = 43;
const int allDisable = 53;
const int EStop = 91;
const int EStart = 92;
const int timecode = 56;
const int comRelease = 29;
// Timer_2 variables
int trigger;
int cycle;
unsigned long dur; // milliseconds
long ofst;
int page;
int paragraph;
int sentence;
int verb;
int noun;
void setup() {
pinMode(txEnable, OUTPUT);
pinMode(Y, OUTPUT);
pinMode(spare_1, OUTPUT);
pinMode(G, OUTPUT);
pinMode(spare_2, OUTPUT);
pinMode(W, OUTPUT);
pinMode(CWP, OUTPUT);
pinMode(sv_1, OUTPUT);
pinMode(sv_2, OUTPUT);
digitalWrite(txEnable, LOW);
digitalWrite(Y, LOW);
digitalWrite(spare_1, LOW);
digitalWrite(G, LOW);
digitalWrite(spare_2, LOW);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, LOW);
digitalWrite(sv_2, LOW);
Serial.begin(baud);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("STARTUP");
delay(500);
lcd.setCursor(0,1);
lcd.print("ADDR:");
lcd.print(address);
lcd.print(" / ");
lcd.print(baud);
delay(500);
lcd.setCursor(0,2);
lcd.print("WAITING FOR TIMECODE");
delay(500);
page = 200;
while(page == 200) {
serialCom();
if(y200 != timecode) {
digitalWrite(txEnable, HIGH);
Serial.print(master);
Serial.print(",");
Serial.println(timecode);
digitalWrite(txEnable, LOW);
delay(1000);
}
else if(y200 == timecode) {
page = 1;
break;
}
}
currentMillis = millis();
previousMillis = currentMillis;
displayMillis = millis();
displayOffset = displayMillis;
delay(1000);
lcd.clear();
page = 1;
airMode = 1;
chillerMode = 1;
condMode = 1;
trigger = 0;
cycle = 0;
currentMillis = millis();
dur = 5000;
}
void loop() {
while(page == 501) {
display();
timer_display();
temperature();
lcd.setCursor(0,0);
lcd.print("!CDT LIMIT!");
if(CDT < (CDTlimit - 30)) {
serialCom();
if(y200 != EStop) {
lcd.clear();
page = 1;
break;
}
else if(y200 == EStop) {
lcd.clear();
page = 500;
break;
}
}
}
while(page == 500) {
serialCom();
if(y200 == EStart) {
digitalWrite(txEnable, HIGH);
Serial.print(master);
Serial.print(",");
Serial.println(timecode);
digitalWrite(txEnable, LOW);
delay(1000);
y200 = 0;
lcd.clear();
page = 1;
break;
}
display();
timer_display();
temperature();
digitalWrite(txEnable, LOW);
digitalWrite(Y, LOW);
digitalWrite(G, LOW);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, LOW);
digitalWrite(sv_2, LOW);
lcd.setCursor(0,0);
lcd.print("E-STOP ");
delay(1000);
}
while(page == 1) {
serialCom();
display();
timer_display();
temperature();
logic();
timer_2();
if(paragraph == 0) {
lcd.setCursor(0,0);
lcd.print("!FREEZE! ");
digitalWrite(Y, LOW);
digitalWrite(G, LOW);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, LOW);
digitalWrite(sv_2, LOW);
}
else if(paragraph == 1) {
lcd.setCursor(0,0);
lcd.print("IDLE ");
digitalWrite(Y, LOW);
digitalWrite(G, LOW);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, LOW);
digitalWrite(sv_2, LOW);
}
else if(paragraph == 2) {
lcd.setCursor(0,0);
lcd.print("A/C ");
if(verb == 0) {
digitalWrite(G, HIGH);
dur = 30000;
trigger = 1;
timer_2();
verb = 1;
}
if(verb == 1) {
if(cycle == 1) {
digitalWrite(Y, LOW);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, LOW);
digitalWrite(sv_2, LOW);
}
else if(cycle == 0) {
digitalWrite(Y, HIGH);
digitalWrite(W, LOW);
digitalWrite(CWP, LOW);
digitalWrite(sv_1, HIGH);
digitalWrite(sv_2, LOW);
}
}
}
else if(paragraph == 3) {
lcd.setCursor(0,0);
lcd.print("HEAT ");
}
else if(paragraph == 4) {
lcd.setCursor(0,0);
lcd.print("CHILLER ");
}
}
}
void temperature() {
int chk;
chk = DHT_1.read22(IATPIN);
tempIndoor = ((DHT_1.temperature * 1.8) +32);
chk = DHT_2.read22(OATPIN);
tempOutdoor = ((DHT_2.temperature * 1.8) +32);
const int beta = 3950;
float read_1;
float read_2;
float read_3;
float read_4;
float celsius;
read_1 = 0.0;
read_2 = 0.0;
read_3 = 0.0;
read_4 = 0.0;
celsius = 0.0;
for(int i = 0; i < 10; i++) {
read_1 = (read_1 + analogRead(NTC_CDT));
delay(5);
}
float average_1 = (read_1 / 10);
celsius = 1 / (log(1 / (1023. / average_1 - 1)) / beta + 1.0 / 298.15) - 273.15;
CDT = ((celsius * 1.8) + 32);
for(int i = 0; i < 10; i++) {
read_2 = (read_2 + analogRead(NTC_ESTa));
delay(5);
}
float average_2 = (read_2 / 10);
celsius = 1 / (log(1 / (1023. / average_2 - 1)) / beta + 1.0 / 298.15) - 273.15;
ESTa = ((celsius * 1.8) + 32);
for(int i = 0; i < 10; i++) {
read_3 = (read_3 + analogRead(NTC_ESTw));
delay(5);
}
float average_3 = (read_3 / 10);
celsius = 1 / (log(1 / (1023. / average_3 - 1)) / beta + 1.0 / 298.15) - 273.15;
ESTw = ((celsius * 1.8) + 32);
for(int i = 0; i < 10; i++) {
read_4 = (read_4 + analogRead(NTC_CWT));
delay(5);
}
float average_4 = (read_4 / 10);
celsius = 1 / (log(1 / (1023. / average_4 - 1)) / beta + 1.0 / 298.15) - 273.15;
CWT = ((celsius * 1.8) + 32);
}
void serialCom() {
byte n = Serial.available();
if (n != 0) {
byte m = Serial.readBytesUntil('\n', data, 64);
data[m] = '\0'; //null-byte
y100 = atoi(strtok(data, ","));
y200 = atoi(strtok(NULL, ","));
if(y100 == address) {
if(y200 == timecode) {
y[1] = atoi(strtok(NULL, ","));
y[2] = atoi(strtok(NULL, ","));
y[3] = atoi(strtok(NULL, ","));
delay(200);
hour = y[1];
minute = y[2];
second = y[2];
digitalWrite(txEnable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(comRelease);
digitalWrite(txEnable, LOW);
}
if(y200 == packet1) {
y[1] = atoi(strtok(NULL, ","));
y[2] = atoi(strtok(NULL, ","));
y[3] = atoi(strtok(NULL, ","));
delay(200);
if(y[1] == chillerEnable) {
chillerMode = 1;
}
else if(y[1] == chillerDisable) {
chillerMode = 0;
}
if(y[2] == airEnable) {
airMode = 1;
}
else if(y[2] == airDisable) {
airMode = 0;
}
if(y[3] == condEnable) {
condMode = 1;
}
else if(y[3] == condDisable) {
condMode = 0;
}
digitalWrite(txEnable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(comRelease);
digitalWrite(txEnable, LOW);
}
if(y200 == allEnable) {
chillerMode = 1;
airMode = 1;
condMode = 1;
}
if(y200 == allDisable) {
chillerMode = 0;
airMode = 0;
condMode = 0;
}
if(y200 == EStop) {
page = 500;
}
}
}
}
void display() {
lcd.setCursor(15,0);
if(hour < 10) {
lcd.print("0");
lcd.print(hour);
}
else if(hour >= 10) {
lcd.print(hour);
}
lcd.print(":");
if(minute < 10) {
lcd.print("0");
lcd.print(minute);
}
else if(minute >= 10) {
lcd.print(minute);
}
if(e == 1) {
lcd.setCursor(0,1);
lcd.print("Indoor: ");
if(tempIndoor < 10) {
lcd.print(tempIndoor);
lcd.print(" ");
}
else if(tempIndoor >= 10) {
lcd.print(tempIndoor);
}
lcd.setCursor(0,2);
lcd.print("Outdoor: ");
if(tempOutdoor < 10) {
lcd.print(tempOutdoor);
lcd.print(" ");
}
else if(10 <= tempOutdoor || tempOutdoor < 100) {
lcd.print(tempOutdoor);
lcd.print(" ");
}
else if(tempOutdoor >= 100) {
lcd.print(tempOutdoor);
}
lcd.setCursor(0,3);
lcd.print("CWT: ");
lcd.print(CWT, 1);
lcd.print(" ");
}
else if(e == 2) {
lcd.setCursor(0,1);
lcd.print("CDT: ");
if(CDT < 100){
lcd.print(CDT, 1);
lcd.print(" ");
}
else if(CDT >= 100) {
lcd.print(CDT, 1);
lcd.print(" ");
}
lcd.setCursor(0,2);
lcd.print("EST_a: ");
lcd.print(ESTa, 1);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print("EST_w: ");
lcd.print(ESTw, 1);
lcd.print(" ");
}
else if(e == 3) {
}
else if(e == 4) {
}
}
void timer_display() {
displayMillis = millis();
d[0] = duration_3 * 1;
d[1] = duration_3 * 2;
d[2] = duration_3 * 3;
d[3] = duration_3 * 4;
d[4] = duration_3 * 5;
if(displayMillis < (displayOffset + d[0])) {
e = 1;
}
else if((displayOffset + d[0]) < displayMillis && displayMillis < (displayOffset + d[1])) {
e = 2;
}
else if((displayOffset + d[1]) < displayMillis && displayMillis < (displayOffset + d[2])) {
e = 3;
}
else if((displayOffset + d[2]) < displayMillis && displayMillis < (displayOffset + d[3])) {
e = 4;
}
else if((displayOffset + d[3]) < displayMillis) {
displayOffset = displayMillis;
}
}
void logic() {
if(CDT >= CDTlimit) {
page = 501;
}
if((ESTa > 32) && (ESTw > 32)) {
if(tempIndoor > (setpointAC + setpointDelta)) {
paragraph = 2;
}
else if(tempIndoor < (setpointAH - setpointDelta)) {
paragraph = 3;
}
else if((tempIndoor <= setpointAC) && (tempIndoor >= setpointAH)) {
if(CWT > (setpointCW + setpointDelta)) {
if(chillerMode == 1) {
paragraph = 4;
}
else if(chillerMode == 0) {
paragraph = 1;
}
}
else if(CWT <= setpointCW) {
paragraph = 1;
}
}
}
else if((ESTa <= 32) || (ESTw <= 32)) {
paragraph = 0;
}
}
void timer_2() {
currentMillis = millis();
if(trigger == 1) {
ofst = currentMillis;
trigger = 0;
}
if(currentMillis < (ofst + dur)) {
cycle = 1;
}
if(currentMillis > (ofst + dur)) {
cycle = 0;
}
}Y
G
W
CWP
SV-1
SV-2
IAT
OAT
CWT
EST_cwu
EST_ahu
CDT