#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#include <Wire.h>
#include "SparkFun_External_EEPROM.h"
#define TX_Enable 2
#define DHTPIN 3
#define K_Heat 4
#define K_Cool 5
#define K_Fan 6
#define K_Hum 7
#define K_deHum 8
#define K_OB 9
#define K_Aux_1 10
#define K_Aux_2 11
// #define aa 12
// #define bb 13
#define Pot A0 // 14
#define SW 15
// #define cc 16
// #define ff 17
// #define SDA 18
// #define SCL 19
// #define dd 20
// #define ee 21
long buttonTimer = 0;
long longPressTime = 2000;
bool SW_Active;
bool longPressActive = false;
int Button;
DHT dht(DHTPIN, DHT22);
float humidity;
float temperatureC;
float temperatureF;
unsigned int dhtTime;
long idleTime = 2200;
long readTime = 10;
unsigned long previousDHT = 0;
ExternalEEPROM ROM;
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
char daysOfTheWeek[7][24] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
// Timer_1 variables
unsigned int a;
int blink;
long offTime = 1000;
long onTime = 1000;
unsigned long previousMillis = 0;
// Timer_2 variables
int trigger;
int cycle;
const long duration_2 = 10000; // milliseconds
long offset_2;
// misc variables
unsigned long currentMillis;
int page;
int watchdog;
bool isConfig;
int seq;
// Serial
int address;
char data[64] = {0};
int y100;
int y200;
int y[16];
float z[10];
int packet1 = 21;
int packet2 = 22;
int packet3 = 23;
int packet4 = 24;
int packet5 = 25;
int packet6 = 26;
int packet7 = 27;
int packet8 = 28;
int comRelease = 29;
int commandStart = 30;
int commandStop = 40;
int commandATO = 41;
int commandAWC = 42;
int timecodeSec = 55;
int commandConfig = 56;
int commandDefault = 57;
int commandEStop = 91;
int typeIdent = 300;
void setup() {
pinMode(TX_Enable, OUTPUT);
pinMode(K_Heat, OUTPUT);
pinMode(K_Cool, OUTPUT);
pinMode(K_Fan, OUTPUT);
pinMode(K_Hum, OUTPUT);
pinMode(K_deHum, OUTPUT);
pinMode(K_OB, OUTPUT);
pinMode(K_Aux_1, OUTPUT);
pinMode(K_Aux_2, OUTPUT);
pinMode(SW, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("/");
dht.begin();
lcd.init();
lcd.backlight();
if (! rtc.begin()) {
while(1) {
lcd.setCursor(0,0);
lcd.print("Couldn't find RTC");
lcd.noBacklight();
delay(1000);
lcd.backlight();
delay(1000);
}
}
else {
lcd.setCursor(0,0);
lcd.print("RTC BEGIN");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime now = rtc.now();
delay(1000);
Wire.begin();
ROM.setMemoryType(256);
if (! ROM.begin()) {
while(1) {
lcd.setCursor(0,0);
lcd.print("Couldn't find EEPROM");
lcd.noBacklight();
delay(1000);
lcd.backlight();
delay(1000);
}
}
else {
lcd.setCursor(0,0);
lcd.print("EEPROM BEGIN");
lcd.setCursor(0,1);
lcd.print(ROM.length());
}
delay(1000);
lcd.clear();
delay(20);
dhtTime = HIGH;
a = LOW;
blink = 0;
trigger = 0;
cycle = 0;
currentMillis = millis();
seq = 500;
page = 200;
watchdog = 0;
}
void loop() {
while(seq == 500) {
DateTime now = rtc.now();
int day;
int month;
int year;
int hour;
int minute;
int second;
int heatTo;
int coolTo;
int tempTolerance;
int tempMin;
int tempMax;
int Hum;
int deHum;
int HumTolerance;
bool obRelayMode;
int aux1Mode;
int aux2Mode;
int fanMode;
bool heatType;
bool coolType;
int paragraph;
int j;
float k;
if(page == 200) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("****Reading ROM*****");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("******Complete******");
delay(1000);
lcd.clear();
page = 0;
}
// main menu
if(page == 0) {
// button();
int i;
lcd.setCursor(0,0);
lcd.print("Config:");
lcd.setCursor(0,1);
if(i == 1) {
lcd.print("Date and Time ");
}
else if(i == 2) {
lcd.print("Climate ");
}
else if(i == 3) {
lcd.print("Options ");
}
else if(i == 4) {
lcd.print("Save and Exit ");
}
i = map(analogRead(Pot), 0, 1023, 1, 5);
if(i > 4) {
i = 4;
}
if((digitalRead(SW) == LOW) && (watchdog == 0)){
watchdog = 1;
delay(20);
}
else if((digitalRead(SW) == LOW) && (watchdog == 2)){
watchdog = 2;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 2)){
watchdog = 0;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
if(i == 1) {
page = 1;
paragraph = 1;
watchdog = 0;
lcd.clear();
}
else if(i == 2) {
page = 4;
paragraph = 1;
watchdog = 0;
lcd.clear();
}
else if(i == 4) {
page = 100;
paragraph = 1;
watchdog = 0;
lcd.clear();
}
}
}
// Set date and time
if(page == 1) {
lcd.setCursor(0,0);
lcd.print("Date");
if(paragraph == 1) {
lcd.setCursor(0,1);
lcd.print("Month: ");
if(month < 10) {
lcd.print("0");
lcd.print(month);
}
else {
lcd.print(month);
}
month = map(analogRead(Pot), 0, 1023, 1, 12);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 2;
}
}
if(paragraph == 2) {
lcd.setCursor(0,1);
lcd.print("Day: ");
if(day < 10) {
lcd.print("0");
lcd.print(day);
}
else {
lcd.print(day);
}
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
day = map(analogRead(Pot), 0, 1023, 1, 31);
}
else if(month == 4 || month == 6 || month == 9 || month == 11) {
day = map(analogRead(Pot), 0, 1023, 1, 30);
}
else if(month == 2) {
day = map(analogRead(Pot), 0, 1023, 1, 29);
}
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 3;
}
}
if(paragraph == 3) {
lcd.setCursor(0,1);
lcd.print("Year: ");
lcd.print(year);
year = map(analogRead(Pot), 0, 1023, 2025, 2099);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
page = 2;
paragraph = 1;
}
}
}
if(page == 2) {
lcd.setCursor(0,0);
lcd.print("Time");
lcd.setCursor(0,1);
if(hour < 10) {
lcd.print("0");
lcd.print(hour);
}
else {
lcd.print(hour);
}
lcd.print(":");
if(minute < 10) {
lcd.print("0");
lcd.print(minute);
}
else {
lcd.print(minute);
}
lcd.print(":");
if(second < 10) {
lcd.print("0");
lcd.print(second);
}
else {
lcd.print(second);
}
if(paragraph == 1) {
lcd.setCursor(8,0);
lcd.print("HOUR");
hour = map(analogRead(Pot), 0, 1023, 0, 23);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 2;
}
}
if(paragraph == 2) {
lcd.setCursor(8,0);
lcd.print("MINUTE");
minute = map(analogRead(Pot), 0, 1023, 0, 59);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 3;
}
}
if(paragraph == 3) {
lcd.setCursor(8,0);
lcd.print("SECOND");
second = map(analogRead(Pot), 0, 1023, 0, 59);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 1;
page = 3;
}
}
}
// confirm date and time settings
if(page == 3) {
lcd.setCursor(0,0);
if(hour < 10) {
lcd.print("0");
lcd.print(hour);
}
else {
lcd.print(hour);
}
lcd.print(":");
if(minute < 10) {
lcd.print("0");
lcd.print(minute);
}
else {
lcd.print(minute);
}
lcd.print(":");
if(second < 10) {
lcd.print("0");
lcd.print(second);
}
else {
lcd.print(second);
}
lcd.setCursor(0,1);
lcd.print(day);
lcd.print(",");
lcd.print(month);
lcd.print(",");
lcd.print(year);
button();
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
page = 1;
watchdog = 0;
}
if(Button == 11){
rtc.adjust(DateTime(year, month, day, hour, minute, second));
lcd.clear();
watchdog = 2;
paragraph = 1;
page = 0;
delay(20);
}
}
if(page == 4) {
lcd.setCursor(0,0);
lcd.print("Climate");
if(paragraph == 1) {
button();
int i;
i = map(analogRead(Pot), 0, 1023, 1, 10);
if(i > 9) {
i = 9;
}
lcd.setCursor(0,1);
if(i == 2) {
lcd.print("Heating Temp ");
}
else if(i == 3) {
lcd.print("Cooling Temp ");
}
else if(i == 4) {
lcd.print("Minimum Temp ");
}
else if(i == 5) {
lcd.print("Maximum Temp ");
}
else if(i == 6) {
lcd.print("Humidify ");
}
else if(i == 7) {
lcd.print("Dehumidify ");
}
else if(i == 8) {
lcd.print("Temp Tolerance");
}
else if(i == 9) {
lcd.print("Hum Tolerance ");
}
else if(i == 1) {
lcd.print("Main Menu ");
}
if((digitalRead(SW) == LOW) && (watchdog == 0)){
watchdog = 1;
}
else if((digitalRead(SW) == LOW) && (watchdog == 2)){
watchdog = 2;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 2)){
watchdog = 0;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
if(i == 1) {
page = 0;
paragraph = 1;
watchdog = 2;
lcd.clear();
}
else {
paragraph = i;
watchdog = 0;
lcd.clear();
}
}
}
if(paragraph == 2) {
lcd.setCursor(0,1);
lcd.print("Heat to ");
lcd.print(heatTo);
lcd.print("F");
heatTo = map(analogRead(Pot), 0, 1023, 65, tempMax);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 2;
paragraph = 1;
}
}
if(paragraph == 3) {
lcd.setCursor(0,1);
lcd.print("Cool to ");
lcd.print(coolTo);
lcd.print("F");
coolTo = map(analogRead(Pot), 0, 1023, tempMin, 80);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 2;
paragraph = 1;
}
}
if(paragraph == 4) {
lcd.setCursor(0,1);
lcd.print("Minimum Temp ");
lcd.print(tempMin);
lcd.print("F");
tempMin = map(analogRead(Pot), 0, 1023, 50, 65);
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 2;
paragraph = 1;
}
}
}
// Save and Exit
if(page == 100) {
if(paragraph == 1) {
button();
if(analogRead(Pot) < 512) {
lcd.setCursor(0,0);
lcd.print("Return to Menu");
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 2;
paragraph = 1;
page = 0;
}
}
else if(analogRead(Pot) >= 512) {
lcd.setCursor(0,0);
lcd.print("Save and Exit ");
if(digitalRead(SW) == LOW){
watchdog = 1;
}
else if((digitalRead(SW) == HIGH) && (watchdog == 1)){
lcd.clear();
watchdog = 0;
paragraph = 1;
page = 100;
}
if(Button == 11){
lcd.clear();
isConfig = true;
lcd.clear();
watchdog = 2;
paragraph = 2;
}
}
}
if(paragraph == 2) {
lcd.setCursor(0,0);
lcd.print("*******SAVED********");
lcd.setCursor(0,1);
lcd.print("--Reset Controller--");
}
}
}
}
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 dhtTimer() {
currentMillis = millis();
if ((dhtTime == HIGH) && (currentMillis - previousDHT >= idleTime)) {
dhtTime = LOW;
previousDHT = currentMillis;
humidity = humidity;
temperatureC = temperatureC;
temperatureF = temperatureF;
}
else if((dhtTime == LOW) && (currentMillis - previousDHT >= readTime)) {
dhtTime = HIGH;
previousDHT = currentMillis;
humidity = dht.readHumidity();
temperatureC = dht.readTemperature();
temperatureF = dht.readTemperature(true);
}
}
void button() {
if (digitalRead(SW) == LOW) {
if (SW_Active == false) {
SW_Active = true;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
Button = 11;
Serial.println("***Long Press***");
Serial.println(Button);
}
}
else if(digitalRead(SW) == HIGH){
if (SW_Active == true) {
if (longPressActive == true) {
longPressActive = false;
}
else if (longPressActive == false) {
Button = 1;
Serial.println("***Short Press***");
Serial.println(Button);
}
SW_Active = false;
Button = 0;
Serial.println("***Released***");
Serial.println(Button);
}
}
}Heat
Cool
Fan
Humidify
Dehumidify
O/B
Aux. 1
Aux. 2