#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <EEPROM.h>
#include <Wire.h>
#include "SparkFun_External_EEPROM.h"
ExternalEEPROM ROM;
RTC_DS1307 rtc;
char daysOfTheWeek[7][24] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
int ATOhour;
int ATOminute;
int ATOduration;
int AWCday;
int AWChour;
int AWCminute;
int AWCduration;
int defaults[16] = {
0,
0, 12, 30,
30, 5, 13,
30, 30, 0,
0, 0, 0,
0, 0, 0
};
float defaultFloats[10] = {
0,
2.25, 3.25, 0.125,
0, 0, 0,
0, 0, 0
};
int counter_1;
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define air 2
// #define xx 3
#define fill 4
#define drain 5
#define aux_1 6
#define button_1 7
#define button_2 8
#define button_3 9
#define TX_Enable 10
unsigned long currentMillis;
long buttonTimer = 0;
long longPressTime = 2000;
bool button_1_Active = false;
bool button_2_Active = false;
bool button_3_Active = false;
boolean longPressActive = false;
int Button;
// MPX5010DP variables
#define mpx A3
const float ADC_mV = 4.8828125;
const float sensorOffset = 200.0;
const float sensitivity = 4.413;
const float mmH2O_inH2O = 25.399;
float levelMin;
float levelMax;
float levelTolerance = 0.500;
// Timer_1 variables
int state;
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;
int latchPin = 16;
int dataPin = 14;
int clockPin = 15;
byte switchVar1;
byte switchVar2;
int q;
int mode;
int seq;
int b;
int u;
int error;
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() {
Serial.begin(9600);
Serial.println("/");
lcd.init();
lcd.backlight();
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
pinMode(fill, OUTPUT);
pinMode(drain, OUTPUT);
pinMode(aux_1, OUTPUT);
pinMode(TX_Enable, OUTPUT);
pinMode(air, OUTPUT);
pinMode(button_1, INPUT_PULLUP);
pinMode(button_2, INPUT_PULLUP);
pinMode(button_3, INPUT_PULLUP);
digitalWrite(air, LOW);
digitalWrite(fill, LOW);
digitalWrite(drain, LOW);
digitalWrite(aux_1, LOW);
digitalWrite(TX_Enable, LOW);
if (! rtc.begin()) {
while(1) {
lcd.setCursor(0,1);
lcd.print("Couldn't find RTC");
lcd.noBacklight();
delay(1000);
lcd.backlight();
delay(1000);
}
}
else {
lcd.setCursor(0,1);
lcd.print("RTC BEGIN");
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
DateTime now = rtc.now();
delay(200);
Wire.begin();
ROM.setMemoryType(256);
if (! ROM.begin()) {
while(1) {
lcd.setCursor(0,2);
lcd.print("Couldn't find EEPROM");
lcd.noBacklight();
delay(1000);
lcd.backlight();
delay(1000);
}
}
else {
lcd.setCursor(0,2);
lcd.print("EEPROM BEGIN");
lcd.setCursor(0,3);
lcd.print(ROM.length());
}
delay(1000);
Config();
lcd.clear();
delay(200);
lcd.setCursor(0,0);
lcd.print("AWC Day: ");
lcd.print(AWCday);
lcd.setCursor(0,1);
lcd.print("AWC Hour: ");
lcd.print(AWChour);
lcd.setCursor(0,2);
lcd.print("AWC Minute: ");
lcd.print(AWCminute);
lcd.setCursor(0,3);
lcd.print("AWC Duration: ");
lcd.print(AWCduration);
delay(2000);
lcd.clear();
delay(200);
lcd.setCursor(0,1);
lcd.print("ATO Hour: ");
lcd.print(ATOhour);
lcd.setCursor(0,2);
lcd.print("ATO Minute: ");
lcd.print(ATOminute);
lcd.setCursor(0,3);
lcd.print("ATO Duration: ");
lcd.print(ATOduration);
delay(2000);
lcd.clear();
delay(200);
lcd.setCursor(0,1);
lcd.print("Min: ");
lcd.print(levelMin, 4);
lcd.setCursor(0,2);
lcd.print("Max: ");
lcd.print(levelMax, 4);
delay(2000);
lcd.clear();
digitalWrite(latchPin,0);
delayMicroseconds(20);
digitalWrite(latchPin,1);
q = 1;
switchVar1 = shiftIn(dataPin, clockPin);
address = (switchVar1 + 100);
lcd.setCursor(0,1);
lcd.print("Addr: ");
lcd.print(switchVar1, BIN);
lcd.print(" ");
lcd.print(address);
// Serial.println(address);
delay(1000);
digitalWrite(latchPin,0);
delayMicroseconds(20);
digitalWrite(latchPin,1);
q = 2;
switchVar2 = shiftIn(dataPin, clockPin);
mode = switchVar2;
lcd.setCursor(0,2);
lcd.print("mode: ");
lcd.print(switchVar2, BIN);
lcd.print(" ");
lcd.print(mode);
delay(1000);
lcd.clear();
a = LOW;
blink = 0;
trigger = 0;
cycle = 0;
seq = 1;
b = 0;
u = 0;
error = 0;
counter_1 = 0;
Button = 0;
currentMillis = millis();
for(int i = 1; i <= 15; i++) {
y[i] = 0;
}
for(int i = 1; i <= 9; i++) {
z[i] = 0;
}
Mode();
}
void loop() {
DateTime now = rtc.now();
while(seq == 1) {
clock();
Mode();
sequence();
getSerialData();
if(timer_3() == 0) {
digitalWrite(air, LOW);
}
else if(timer_3() == 1) {
digitalWrite(air, HIGH);
}
else if(timer_3() == 2) {
digitalWrite(air, HIGH);
lcd.setCursor(0,3);
if(waterLevel() < 10.000) {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
else {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
}
if(y[1] == commandConfig) {
digitalWrite(air, LOW);
Config();
}
lcd.setCursor(0,1);
lcd.print("Seq 1 ");
lcd.setCursor(0,2);
lcd.print(Button);
lcd.print(" ");
button();
if(Button == 1) {
}
else if(Button == 11) {
seq = 101;
break;
}
}
while(seq == commandATO) {
digitalWrite(air, HIGH);
lcd.setCursor(0,1);
lcd.print("ATO");
clock();
Mode();
sequence();
if(waterLevel() < (levelMin - levelTolerance)) {
digitalWrite(fill, HIGH);
counter_1++;
lcd.setCursor(0,2);
lcd.print("Fill*");
}
else if((waterLevel() > (levelMin - levelTolerance)) && (waterLevel() < levelMax)) {
digitalWrite(fill, HIGH);
lcd.setCursor(0,2);
lcd.print("Fill ");
}
else if((waterLevel() >= levelMax) && (waterLevel() <= (levelMax + levelTolerance))) {
digitalWrite(fill, LOW);
lcd.setCursor(0,2);
lcd.print(" ");
}
else if(waterLevel() > (levelMax + levelTolerance)) {
digitalWrite(fill, LOW);
digitalWrite(air, LOW);
lcd.setCursor(0,2);
lcd.print("*****");
seq = commandEStop;
}
lcd.setCursor(0,3);
if(waterLevel() < 10.000) {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
else {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
}
while(seq == commandAWC) {
digitalWrite(air, HIGH);
lcd.setCursor(0,1);
lcd.print("AWC");
while(b == 1) {
clock();
Mode();
if(waterLevel() < (levelMin - levelTolerance)) {
digitalWrite(fill, HIGH);
counter_1++;
lcd.setCursor(0,2);
lcd.print("Fill*");
}
else if((waterLevel() > (levelMin - levelTolerance)) && (waterLevel() < levelMax)) {
digitalWrite(fill, HIGH);
lcd.setCursor(0,2);
lcd.print("Fill ");
}
else if((waterLevel() >= levelMax) && (waterLevel() <= (levelMax + levelTolerance))) {
digitalWrite(fill, LOW);
lcd.setCursor(0,2);
lcd.print(" ");
b = 2;
}
else if(waterLevel() > (levelMax + levelTolerance)) {
digitalWrite(fill, LOW);
digitalWrite(air, LOW);
lcd.setCursor(0,2);
lcd.print("*****");
b = 0;
seq = commandEStop;
break;
}
lcd.setCursor(0,3);
if(waterLevel() < 10.000) {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
else {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
}
while(b == 2) {
clock();
Mode();
if(waterLevel() > levelMin) {
digitalWrite(drain, HIGH);
lcd.setCursor(0,2);
lcd.print("Drain");
}
else if((waterLevel() < levelMin) && (waterLevel() >= (levelMin - levelTolerance))) {
digitalWrite(drain, LOW);
b = 3;
}
else if(waterLevel() < (levelMin - levelTolerance)) {
digitalWrite(drain, LOW);
digitalWrite(air, LOW);
lcd.setCursor(0,2);
lcd.print("*****");
b = 0;
seq = commandEStop;
break;
}
lcd.setCursor(0,3);
if(waterLevel() < 10.000) {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
else {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
}
while(b == 3) {
clock();
Mode();
if(waterLevel() < levelMax) {
digitalWrite(fill, HIGH);
lcd.setCursor(0,2);
lcd.print("Refill");
}
else if((waterLevel() >= levelMax) && (waterLevel() < (levelMax + levelTolerance))) {
digitalWrite(fill, LOW);
b = 4;
}
else if(waterLevel() > (levelMax + levelTolerance)) {
digitalWrite(drain, LOW);
digitalWrite(fill, LOW);
digitalWrite(air, LOW);
lcd.setCursor(0,2);
lcd.print("*****");
b = 0;
seq = commandEStop;
break;
}
lcd.setCursor(0,3);
if(waterLevel() < 10.000) {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
else {
lcd.print(waterLevel(), 3);
lcd.print("inH2O ");
}
}
while(b == 4) {
clock();
Mode();
sequence();
digitalWrite(air, LOW);
lcd.setCursor(0,2);
lcd.print("Finished");
}
}
while(seq == commandEStop) {
digitalWrite(drain, LOW);
digitalWrite(fill, LOW);
digitalWrite(aux_1, LOW);
digitalWrite(air, LOW);
clock();
timer_2();
timer_1();
if(u == 0) {
lcd.clear();
lcd.setCursor(0,1);
lcd.print(now.month());
lcd.print("/");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.year());
lcd.print(" ");
lcd.print(now.hour());
lcd.print(":");
lcd.print(now.minute());
lcd.print(":");
lcd.print(now.second());
u = 1;
}
lcd.setCursor(0,2);
lcd.print("ERROR: ");
lcd.print(error);
lcd.setCursor(0,3);
lcd.print("Reset MCU to clear");
if(blink == 0) {
lcd.noBacklight();
}
else if(blink == 1) {
lcd.backlight();
}
if(cycle == 0) {
trigger = 1;
Serial.print(address);
Serial.print(",");
Serial.println(commandEStop);
}
}
while(seq == 101) {
lcd.clear();
delay(20);
lcd.setCursor(0,0);
lcd.print("AWC Day: ");
lcd.print(AWCday);
lcd.setCursor(0,1);
lcd.print("AWC Hour: ");
lcd.print(AWChour);
lcd.setCursor(0,2);
lcd.print("AWC Minute: ");
lcd.print(AWCminute);
lcd.setCursor(0,3);
lcd.print("AWC Duration: ");
lcd.print(AWCduration);
delay(3000);
lcd.clear();
delay(20);
lcd.setCursor(0,1);
lcd.print("ATO Hour: ");
lcd.print(ATOhour);
lcd.setCursor(0,2);
lcd.print("ATO Minute: ");
lcd.print(ATOminute);
lcd.setCursor(0,3);
lcd.print("ATO Duration: ");
lcd.print(ATOduration);
delay(3000);
lcd.clear();
delay(20);
lcd.setCursor(0,0);
lcd.print("Address: ");
lcd.print(address);
lcd.setCursor(0,1);
lcd.print("Mode: ");
lcd.print(mode);
delay(3000);
lcd.clear();
seq = 1;
break;
}
while(seq == 500) {
int page = 1;
int i;
float j;
int x;
lcd.clear();
while(page == 1) {
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("Push any button");
lcd.setCursor(0,2);
lcd.print("to continue");
button();
if(Button == 1 || Button == 2 || Button == 3) {
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 2;
}
}
// ATO Hour
while(page == 2) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("ATO Hour: ");
lcd.print(ATOhour);
lcd.setCursor(0,2);
lcd.print("ATO Hour set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 23);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 23);
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
if((Button == 22) && (x == 1)) {
y[4] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 3;
}
}
// ATO Minute
while(page == 3) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("ATO minute: ");
lcd.print(ATOhour);
lcd.setCursor(0,2);
lcd.print("ATO minute set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 59);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 59);
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[5] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 4;
}
}
// ATO Duration
while(page == 4) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("ATO dur.: ");
lcd.print(ATOhour);
lcd.setCursor(0,2);
lcd.print("ATO dur. set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 59);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 59);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[6] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 5;
}
}
// AWC Day
while(page == 5) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("AWC Day: ");
lcd.print(AWCday);
lcd.setCursor(0,2);
lcd.print("AWC Day set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 6);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 6);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[7] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 6;
}
}
// AWC Hour
while(page == 6) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("AWC Hour: ");
lcd.print(AWChour);
lcd.setCursor(0,2);
lcd.print("AWC Hour set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 23);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 23);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[8] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 7;
}
}
// AWC Minute
while(page == 7) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("AWC Minute: ");
lcd.print(AWCminute);
lcd.setCursor(0,2);
lcd.print("AWC Minute set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 59);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 59);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[9] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 8;
}
}
// AWC Duration
while(page == 8) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("AWC dur.: ");
lcd.print(AWCduration);
lcd.setCursor(0,2);
lcd.print("AWC dur. set: ");
if(i < 10) {
lcd.print("0");
lcd.print(i);
}
else {
lcd.print(i);
}
if(Button == 1) {
i = constrain(i + 1, 0, 59);
}
else if(Button == 3) {
i = constrain(i - 1, 0, 59);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
y[10] = i;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 9;
}
}
// Minimum Water Level
while(page == 9) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("Min. Level: ");
lcd.print(levelMin, 3);
lcd.setCursor(0,2);
lcd.print("Set: ");
if(j < 10) {
lcd.print("0");
lcd.print(j, 3);
}
else {
lcd.print(j, 3);
}
if(Button == 1) {
j = constrain(j + 0.125, 0.0, 40.0);
}
else if(Button == 3) {
j = constrain(j - 0.125, 0.0, 40.0);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
z[1] = j;
lcd.clear();
i = 0;
j = z[1];
x = 0;
page = 10;
}
}
// Maximum Water Level
while(page == 10) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("Max. Level: ");
lcd.print(levelMin, 3);
lcd.setCursor(0,2);
lcd.print("Set: ");
if(j < 10) {
lcd.print("0");
lcd.print(j, 3);
}
else {
lcd.print(j, 3);
}
if(Button == 1) {
j = constrain(j + 0.125, z[1], 40.0);
}
else if(Button == 3) {
j = constrain(j - 0.125, z[1], 40.0);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
z[2] = j;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 11;
}
}
// Water Level Tolerance
while(page == 11) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("Level Tol.: ");
lcd.print(levelMin, 3);
lcd.setCursor(0,2);
lcd.print("Set: ");
if(j < 10) {
lcd.print("0");
lcd.print(j, 3);
}
else {
lcd.print(j, 3);
}
if(Button == 1) {
j = constrain(j + 0.125, 0.125, 4.000);
}
else if(Button == 3) {
j = constrain(j - 0.125, 0.125, 4.000);
}
if(Button == 2) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 1;
}
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,3);
lcd.print("Confirm?");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 22) && (x == 1)) {
z[3] = j;
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 50;
}
}
// Last page. Final confirmation of values before they're written to the EEPROM!!!
while(page == 50) {
button();
lcd.setCursor(0,0);
lcd.print("Config. Page: ");
lcd.print(page);
lcd.setCursor(0,1);
lcd.print("Write Values to ROM?");
if((Button == 2) && (x == 0)) {
lcd.setCursor(0,2);
lcd.print("Hold 1 for NO");
lcd.setCursor(0,3);
lcd.print("Hold 2 for YES");
x = 2;
}
else if((Button == 0) && (x == 2)) {
x = 1;
}
else if((Button == 11) && (x == 1)) {
lcd.clear();
i = 0;
j = 0.0;
x = 0;
page = 1;
}
else if((Button == 22) && (x == 1)) {
y[1] = commandConfig;
y[15] = commandStart;
Config();
delay(100);
lcd.clear();
x = 50;
}
while(x == 50) {
lcd.setCursor(0,2);
lcd.print("Set Mode, Then");
lcd.setCursor(0,3);
lcd.print("Reset MCU to clear");
}
}
}
}
void button() {
if (digitalRead(button_1) == LOW) {
if (button_1_Active == false) {
button_1_Active = true;
Button = 1;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
Button = 11;
}
}
else if(digitalRead(button_1) == HIGH){
if (button_1_Active == true) {
if (longPressActive == true) {
longPressActive = false;
}
button_1_Active = false;
Button = 0;
}
}
if (digitalRead(button_2) == LOW) {
if (button_2_Active == false) {
button_2_Active = true;
Button = 2;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
Button = 22;
}
}
else if(digitalRead(button_2) == HIGH){
if (button_2_Active == true) {
if (longPressActive == true) {
longPressActive = false;
}
button_2_Active = false;
Button = 0;
}
}
if (digitalRead(button_3) == LOW) {
if (button_3_Active == false) {
button_3_Active = true;
Button = 3;
buttonTimer = millis();
}
if ((millis() - buttonTimer > longPressTime) && (longPressActive == false)) {
longPressActive = true;
Button = 33;
}
}
else if(digitalRead(button_3) == HIGH){
if (button_3_Active == true) {
if (longPressActive == true) {
longPressActive = false;
}
button_3_Active = false;
Button = 0;
}
}
}
void clock() {
DateTime now = rtc.now();
lcd.setCursor(0,0);
if(now.month() < 10) {
lcd.print("0");
lcd.print(now.month());
}
else {
lcd.print(now.month());
}
lcd.print("/");
if(now.day() < 10) {
lcd.print("0");
lcd.print(now.day());
}
else {
lcd.print(now.day());
}
lcd.print("/");
lcd.print(now.year());
lcd.print(" ");
if(now.hour() < 10) {
lcd.print("0");
lcd.print(now.hour());
}
else {
lcd.print(now.hour());
}
lcd.print(":");
if(now.minute() < 10) {
lcd.print("0");
lcd.print(now.minute());
}
else {
lcd.print(now.minute());
}
lcd.print(":");
if(now.second() < 10) {
lcd.print("0");
lcd.print(now.second());
}
else {
lcd.print(now.second());
}
}
void sequence() {
DateTime now = rtc.now();
long int nowMinute;
long int ATOstart;
long int ATOstop;
long int AWCstart;
long int AWCstop;
nowMinute = ((now.hour() * 60) + now.minute());
ATOstart = ((ATOhour * 60) + ATOminute);
ATOstop = (ATOstart + ATOduration);
AWCstart = ((AWChour * 60) + AWCminute);
AWCstop = (AWCstart + AWCduration);
if(seq != commandEStop) {
if(y200 != commandStart) {
if(now.dayOfTheWeek() == AWCday) {
if((nowMinute >= AWCstart) && (nowMinute < AWCstop)) {
if(seq != commandAWC) {
b = 1;
}
seq = commandAWC;
lcd.setCursor(4,1);
lcd.print(AWCstop - nowMinute);
}
else {
b = 0;
seq = 1;
}
}
else if(now.dayOfTheWeek() != AWCday) {
if((nowMinute >= ATOstart) && (nowMinute < ATOstop)) {
seq = commandATO;
lcd.setCursor(4,1);
lcd.print(ATOstop - nowMinute);
}
else {
seq = 1;
}
}
}
else if(y200 == commandStart) {
if(y[1] == commandATO) {
seq = commandATO;
}
if(y[1] == commandAWC) {
if(seq != commandAWC) {
b = 1;
}
seq = commandAWC;
if(b == 4) {
y[1] = 0;
b = 0;
seq = 1;
}
}
}
}
}
void timer_1() {
unsigned long 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;
}
}
int timer_3() {
DateTime now = rtc.now();
unsigned long nowSecond;
unsigned long lastSecond;
nowSecond = ((now.hour() * 3600) + (now.minute() * 60) + now.second());
int x;
if((now.minute() % 5 == 0) || now.minute() == 0) {
if((now.second() >= 0) && (now.second() < 5)) {
x = 1;
}
else if((now.second() >= 5) && (now.second() < 59)) {
x = 2;
}
}
else {
x = 0;
}
return x;
}
void getSerialData() {
lcd.setCursor(16,2);
lcd.print("A");
lcd.print(address);
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 == 0) {
}
if(y200 == commandEStop) {
error = address;
a = HIGH;
seq = commandEStop;
}
if(y200 == packet1) {
z[1] = atof(strtok(NULL, ","));
z[2] = atof(strtok(NULL, ","));
z[3] = atof(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet2);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet2) {
z[4] = atof(strtok(NULL, ","));
z[5] = atof(strtok(NULL, ","));
z[6] = atof(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet3);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet3) {
z[7] = atof(strtok(NULL, ","));
z[8] = atof(strtok(NULL, ","));
z[9] = atof(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet4);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet4) {
y[1] = atoi(strtok(NULL, ","));
y[2] = atoi(strtok(NULL, ","));
y[3] = atoi(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet5);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet5) {
y[4] = atoi(strtok(NULL, ","));
y[5] = atoi(strtok(NULL, ","));
y[6] = atoi(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet6);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet6) {
y[7] = atoi(strtok(NULL, ","));
y[8] = atoi(strtok(NULL, ","));
y[9] = atoi(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet7);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet7) {
y[10] = atoi(strtok(NULL, ","));
y[11] = atoi(strtok(NULL, ","));
y[12] = atoi(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(packet8);
digitalWrite(TX_Enable, LOW);
}
if(y200 == packet8) {
y[13] = atoi(strtok(NULL, ","));
y[14] = atoi(strtok(NULL, ","));
y[15] = atoi(strtok(NULL, ","));
delay(200);
digitalWrite(TX_Enable, HIGH);
Serial.print(address);
Serial.print(",");
Serial.println(comRelease);
digitalWrite(TX_Enable, LOW);
}
if(y200 == comRelease) {
for(int i = 1; i <= 15; i++) {
y[i] = 0;
}
for(int i = 1; i <= 9; i++) {
z[i] = 0;
}
}
}
else if(y100 != address) {
}
}
}
void Mode() {
lcd.setCursor(17,1);
lcd.print("M");
if(mode < 10) {
lcd.print("0");
lcd.print(mode);
}
else {
lcd.print(mode);
}
if(mode == 0) {
if(digitalRead(drain) == HIGH) {
digitalWrite(aux_1, HIGH);
}
else if(digitalRead(drain) == LOW) {
digitalWrite(aux_1, LOW);
}
}
else if(mode == 1) {
if(digitalRead(drain) == HIGH) {
digitalWrite(aux_1, HIGH);
}
else if(digitalRead(drain) == LOW) {
digitalWrite(aux_1, LOW);
}
}
else if(mode == 2) {
if(digitalRead(drain) == HIGH) {
digitalWrite(aux_1, HIGH);
}
else if(digitalRead(drain) == LOW) {
digitalWrite(aux_1, LOW);
}
}
else if(mode == 3) {
if(digitalRead(drain) == HIGH) {
digitalWrite(aux_1, HIGH);
}
else if(digitalRead(drain) == LOW) {
digitalWrite(aux_1, LOW);
}
}
if(mode == 7) {
seq = 500;
}
}
void Config() {
while((y[1] != commandConfig) && (y[15] != commandStart)) {
int k;
float j;
int bytesWritten;
int nextAvailable;
int Marker;
bytesWritten = 0;
ROM.get(20, Marker);
if(Marker != commandConfig) {
for(int i = 1, m = 100; i <= 14; i++) {
ROM.get(m, k);
if(k != defaults[i]) {
ROM.put(m, defaults[i]);
bytesWritten++;
delay(50);
}
m = m+2;
k = 0;
}
for(int i = 1, m = 100; i <= 14; i++) {
ROM.get(m, k);
Serial.print("Default Integer Byte ");
Serial.print(i);
Serial.print(", ");
Serial.print("EEPROM Address ");
Serial.print(m);
Serial.print(": ");
Serial.println(k);
m = m+2;
k = 0;
nextAvailable = m;
}
for(int i = 1, m = nextAvailable; i <= 9; i++) {
ROM.get(m, j);
if(j != defaultFloats[i]) {
ROM.put(m, defaultFloats[i]);
bytesWritten++;
delay(50);
}
m = m+4;
j = 0;
}
for(int i = 1, m = nextAvailable; i <= 9; i++) {
ROM.get(m, j);
Serial.print("Default Float Byte ");
Serial.print(i);
Serial.print(", ");
Serial.print("EEPROM Address ");
Serial.print(m);
Serial.print(": ");
Serial.println(j, 4);
m = m+4;
j = 0;
nextAvailable = m;
}
Serial.print("Bytes Written: ");
Serial.println(bytesWritten);
bytesWritten = 0;
Serial.print("Next Available Address: ");
Serial.println(nextAvailable);
ROM.get(102, ATOhour);
ROM.get(104, ATOminute);
ROM.get(106, ATOduration);
ROM.get(108, AWCday);
ROM.get(110, AWChour);
ROM.get(112, AWCminute);
ROM.get(114, AWCduration);
ROM.get(128, levelMin);
ROM.get(132, levelMax);
ROM.get(136, levelTolerance);
}
else if(Marker == commandConfig) {
ROM.get(26, ATOhour);
ROM.get(28, ATOminute);
ROM.get(30, ATOduration);
ROM.get(32, AWCday);
ROM.get(34, AWChour);
ROM.get(36, AWCminute);
ROM.get(38, AWCduration);
ROM.get(48, levelMin);
ROM.get(52, levelMax);
ROM.get(56, levelTolerance);
}
break;
}
while((y[1] == commandConfig) && (y[15] == commandStart)) {
int k;
float j;
int bytesWritten;
int nextAvailable;
bytesWritten = 0;
for(int i = 1, m = 20; i <= 14; i++) {
ROM.get(m, k);
if(k != y[i]) {
ROM.put(m, y[i]);
bytesWritten++;
delay(50);
}
m = m+2;
k = 0;
}
ROM.get(26, ATOhour);
ROM.get(28, ATOminute);
ROM.get(30, ATOduration);
ROM.get(32, AWCday);
ROM.get(34, AWChour);
ROM.get(36, AWCminute);
ROM.get(38, AWCduration);
for(int i = 1, m = 20; i <= 14; i++) {
ROM.get(m, k);
Serial.print("Y Byte ");
Serial.print(i);
Serial.print(", ");
Serial.print("EEPROM Address ");
Serial.print(m);
Serial.print(": ");
Serial.println(k);
m = m+2;
k = 0;
nextAvailable = m;
}
for(int i = 1, m = nextAvailable; i <= 9; i++) {
ROM.get(m, j);
if(j != z[i]) {
ROM.put(m, z[i]);
bytesWritten++;
delay(50);
}
m = m+4;
j = 0;
}
ROM.get(48, levelMin);
ROM.get(52, levelMax);
ROM.get(56, levelTolerance);
for(int i = 1, m = nextAvailable; i <= 9; i++) {
ROM.get(m, j);
Serial.print("Z Byte ");
Serial.print(i);
Serial.print(", ");
Serial.print("EEPROM Address ");
Serial.print(m);
Serial.print(": ");
Serial.println(j, 4);
m = m+4;
j = 0;
nextAvailable = m;
}
Serial.print("Bytes Written: ");
Serial.println(bytesWritten);
bytesWritten = 0;
Serial.print("Next Available Address: ");
Serial.println(nextAvailable);
for(int i = 1; i <= 15; i++) {
y[i] = 0;
}
for(int i = 1; i <= 9; i++) {
z[i] = 0;
}
break;
}
}
float waterLevel() {
float W;
float avgW[10];
for(int i = 0, w = 0; i <= 9; i++) {
avgW[i] = (((analogRead(mpx) * ADC_mV - sensorOffset) / sensitivity) /mmH2O_inH2O);
delay(10);
W = W + avgW[i];
}
W = W / 10;
return W;
}
byte shiftIn(int myDataPin, int myClockPin) {
int i;
int temp = 0;
int pinState;
byte myDataIn = 0;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, INPUT);
if(q == 1) {
for (i=4; i>=0; i--) {
digitalWrite(myClockPin, 0);
delayMicroseconds(0.2);
temp = digitalRead(myDataPin);
if (temp) {
pinState = 1;
//set the bit to 0 no matter what
myDataIn = myDataIn | (1 << i);
}
else {
pinState = 0;
}
digitalWrite(myClockPin, 1);
}
return myDataIn;
}
else if(q == 2) {
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);
delayMicroseconds(0.2);
temp = digitalRead(myDataPin);
if (temp) {
pinState = 1;
//set the bit to 0 no matter what
if(i <= 2) {
myDataIn = myDataIn | (1 << i);
}
}
else {
pinState = 0;
}
digitalWrite(myClockPin, 1);
}
return myDataIn;
}
}