Classes/Fall 2024/csci218/Labs/Final Project/MenuTest/MenuTest.ino

543 lines
10 KiB
C++

#define outputA 6
#define outputB 7
#define buttonPin 8
#define lightPin 13
#define waterLPin 10
#include <LiquidCrystal.h>
int waterPin = A0;
int pinValue, pinValueVolt;
float waterPer;
int counter = 0;
int aState;
int aLastState;
int bState;
int bLastState;
int buttonState;
int lastButtonState;
int hourTen = 0;
int hourOne = 0;
int minTen = 0;
int minOne = 0;
int hourTenL = 1;
int hourOneL = 0;
int minTenL = 0;
int minOneL = 0;
int minWaterTen = 8;
int minWaterOne = 2;
int minWater = (minWaterTen * 10) + minWaterOne;
int timeScale = 1;
int timePassed = 0;
long unsigned int hourSec = ((hourTenL * 10) + hourOneL) * 60;
long unsigned int lightOnSec = (hourSec + ((minTenL * 10) + minOneL)) * 60;
long unsigned int scaledLightOnSec;
long unsigned int scaledLightOffSec;
unsigned long secDay;
unsigned long secLeft;
long unsigned int preTime;
long unsigned int currTime;
bool flipOn = true;
char menuList[][10] = {"View", "Water", "Light", "Flip"};
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int subTimeMenu(int pos, int val, int condVal = 0);
int adjustHourTen(int val);
int adjustHourOne(int val, int condVal);
int adjustMinTen(int val);
int adjustMinOne(int val);
void setup() {
// put your setup code here, to run once:
pinMode(outputA, INPUT_PULLUP);
pinMode(outputB, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(lightPin, OUTPUT);
pinMode(waterLPin, OUTPUT);
hourSec = ((hourTenL * 10) + hourOneL) * 60;
lightOnSec = (hourSec + ((minTenL * 10) + minOneL)) * 60;
Serial.begin(9600);
aLastState = digitalRead(outputA);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(menuList[0]);
}
void loop() {
// put your main code here, to run repeatedly:
updateInputVals();
delay(50);
secDay = 86400 / timeScale;
scaledLightOnSec = lightOnSec / timeScale;
scaledLightOffSec = secDay - scaledLightOnSec;
pinValue = analogRead(waterPin);
pinValueVolt = (5.0 / 1023) * pinValue;
waterPer = 100 - (((pinValue - 200) / (float)(700)) * 100);
Serial.print("Water Per: ");
Serial.print(waterPer);
currTime = millis();
if (currTime - preTime >= 1000) {
preTime = currTime;
timePassed++;
}
if (waterPer < minWater) {
digitalWrite(waterLPin, HIGH);
} else {
digitalWrite(waterLPin, LOW);
}
if (!secLeft) {
flipOn =!flipOn;
toggleLight();
timePassed = 0;
}
if (flipOn) {
Serial.print(" Light off ");
secLeft = secDay - scaledLightOffSec - timePassed;
} else {
Serial.print(" Light on ");
secLeft = secDay - scaledLightOnSec - timePassed;
}
if (!counter) {
lcd.setCursor(0, 0);
lcd.print("Moisture: ");
lcd.print(waterPer);
lcd.setCursor(0, 1);
lcd.print("Time: ");
float hours = secLeft / (float)3600;
Serial.print("Hours left: ");
Serial.println(hours);
if (hours <= 9) {
lcd.print("0");
}
lcd.print(hours);
if (flipOn) {
lcd.print(" on ");
} else {
lcd.print(" off");
}
}
if (!aState && aState != aLastState) {
counter++;
if (counter > 3) {
counter = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(menuList[counter]);
}
if (!bState && bState != bLastState) {
counter--;
if (counter < 0) {
counter = 3;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(menuList[counter]);
}
if (!buttonState && buttonState != lastButtonState) {
switch (counter) {
case 0:
toggleLight();
break;
case 1:
buttonState = 2;
lastButtonState = 0;
waterMenu();
lcd.print(menuList[counter]);
break;
case 2:
buttonState = 2;
lastButtonState = 0;
timeMenu();
lcd.print(menuList[counter]);
break;
case 3:
toggleLight();
flipOn = !flipOn;
timePassed = 0;
counter = 0;
break;
}
}
updatePreInputVals();
}
void waterMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.blink();
lcd.print("Min Per: ");
lcd.print(minWaterTen);
lcd.print(minWaterOne);
lcd.print(" x");
int posI[] = {9, 10, 12};
int pos = 0;
int loop = 1;
while (loop) {
updateInputVals();
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
lcd.setCursor(9, 0);
lcd.print(minWaterTen);
lcd.print(minWaterOne);
lcd.print(" x");
lcd.setCursor(posI[pos], 0);
delay(50);
if (a) {
pos++;
if (pos > 2) {
pos = 0;
}
}
if (b) {
pos--;
if (pos < 0) {
pos = 2;
}
}
if (button) {
switch (pos) {
case 0:
buttonState = 2;
lastButtonState = 0;
minWaterTen = adjustMinOne(minWaterTen, posI[pos]);
pos++;
break;
case 1:
buttonState = 2;
lastButtonState = 0;
minWaterOne = adjustMinOne(minWaterOne, posI[pos]);
pos++;
break;
case 2:
loop = 0;
minWater = (minWaterTen * 10) + minWaterOne;
delay(150);
lcd.noBlink();
lcd.clear();
break;
}
}
updatePreInputVals();
}
}
void toggleLight() {
digitalWrite(lightPin, LOW);
delay(50);
digitalWrite(lightPin, HIGH);
delay(50);
digitalWrite(lightPin, LOW);
}
void timeMenu() {
lcd.setCursor(0, 0);
lcd.print("Time On: ");
lcd.blink();
int loop = 1;
int posI[] = {9, 10, 12, 13, 15};
int pos = 0;
while (loop) {
updateInputVals();
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
lcd.setCursor(9, 0);
lcd.print(hourTenL);
lcd.print(hourOneL);
lcd.print(":");
lcd.print(minTenL);
lcd.print(minOneL);
lcd.print(" x");
lcd.setCursor(posI[pos], 0);
delay(50);
if (a) {
pos++;
if (pos > 4) {
pos = 0;
}
}
if (b) {
pos--;
if (pos < 0) {
pos = 4;
}
}
if (button) {
switch (pos) {
case 0:
buttonState = 2;
lastButtonState = 0;
hourTenL = adjustHourTen(hourTenL, posI[pos]);
pos++;
break;
case 1:
buttonState = 2;
lastButtonState = 0;
hourOneL = adjustHourOne(hourOneL, hourTenL, posI[pos]);
pos++;
break;
case 2:
buttonState = 2;
lastButtonState = 0;
minTenL = adjustMinTen(minTenL, posI[pos]);
pos++;
break;
case 3:
buttonState = 2;
lastButtonState = 0;
minOneL = adjustMinOne(minOneL, posI[pos]);
pos++;
break;
case 4:
loop = 0;
hourSec = ((hourTenL * 10) + hourOneL) * 60;
lightOnSec = (hourSec + ((minTenL * 10) + minOneL)) * 60;
timePassed =0;
if (!lightOnSec) {
lightOnSec = 1;
}
delay(50);
lcd.noBlink();
lcd.clear();
break;
}
}
updatePreInputVals();
}
}\
int adjustHourTen(int val, int col) {
while(1) {
updateInputVals();
delay(20);
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
if (a) {
val++;
if (val > 2) {
val = 0;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (b) {
val--;
if (val < 0) {
val = 2;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (button) {
return val;
}
updatePreInputVals();
}
}
int adjustHourOne(int val, int hr, int col) {
while(1) {
updateInputVals();
delay(20);
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
int max = 9;
if (hr == 2) {
max = 3;
}
if (a) {
val++;
if (val > max) {
val = 0;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (b) {
val--;
if (val < 0) {
val = max;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (button) {
return val;
}
updatePreInputVals();
}
}
int adjustMinTen(int val, int col) {
while(1) {
updateInputVals();
delay(20);
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
if (a) {
val++;
if (val > 5) {
val = 0;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (b) {
val--;
if (val < 0) {
val = 5;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (button) {
return val;
}
updatePreInputVals();
}
}
int adjustMinOne(int val, int col) {
while(1) {
updateInputVals();
delay(20);
bool a = checkInput(aState, aLastState);
bool b = checkInput(bState, bLastState);
bool button = checkInput(buttonState, lastButtonState);
if (a) {
val++;
if (val > 9) {
val = 0;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (b) {
val--;
if (val < 0) {
val = 9;
}
lcd.setCursor(col, 0);
lcd.print(val);
lcd.setCursor(col, 0);
}
if (button) {
return val;
}
updatePreInputVals();
}
}
void updateInputVals() {
buttonState = digitalRead(buttonPin);
aState = digitalRead(outputA);
bState = digitalRead(outputB);
}
void updatePreInputVals() {
lastButtonState = buttonState;
aLastState = aState;
bLastState = bState;
}
bool checkInput(int currVal, int preVal) {
if (!currVal && currVal != preVal) {
return true;
} else {
return false;
}
}