#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <IRremote.h>
#include <AnalogMultiButton.h>
// Define LCD pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int selectButton = 4;
const int upButton = 1;
const int downButton = 2;
const int leftButton = 3;
const int rightButton = 0;
// Define button pins
const int onOffButton = 11;
const int runButton = 3;
const int RECV_PIN = 2;
const int buttonsPin = A0;
const int totalButtons = 5;
const int buttonValues[totalButtons] = {0, 145, 335, 510, 750};
AnalogMultiButton buttons(buttonsPin, totalButtons, buttonValues, 50);
int buttonDelay = 500;
IRrecv irrecv(RECV_PIN);
decode_results results;
bool IRSelect = false;
bool IRRun = false;
// Define output pins
const int sounderPin = 1;
const int relayPin = 0;
bool toggleRelay = 0;
// Define presets
int presets[20][5] = {};
int run[5] = {0, 0, 0, 0, 0};
int selectedPreset = 0;
bool programmingMode = false;
bool flashing = false;
int currentParameter = 0;
unsigned int previousTime = 0;
unsigned int flashingTime = 500; // 1 sec
void(* resetFunc) (void) = 0;
void setup() {
// Initialize LCD
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("EBSC CONTROLLER");
lcd.setCursor(0,1);
lcd.print(" BY HOFFMAN");
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("PR FC ED FC ED R");
irrecv.enableIRIn();
// Initialize buttons
pinMode(onOffButton, INPUT_PULLUP);
pinMode(runButton, INPUT_PULLUP);
// Initialize outputs
pinMode(sounderPin, OUTPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(sounderPin, HIGH);
digitalWrite(relayPin, HIGH);
for(int j=0; j<20; j++)
{
selectedPreset = EEPROM.read(6*j);
presets[j][0] = EEPROM.read((6*j)+1);
presets[j][1] = EEPROM.read((6*j)+2);
presets[j][2] = EEPROM.read((6*j)+3);
presets[j][3] = EEPROM.read((6*j)+4);
presets[j][4] = EEPROM.read((6*j)+5);
}
}
void loop() {
// Handle button presses
buttons.update();
if (irrecv.decode(&results))
{
switch(results.value)
{
case 0xAAAAAAAA: // Replace with IR code for Run button
if (!flashing && !programmingMode)
{
setRunParameters();
handleRun();
delay(buttonDelay);
}
break;
case 0xBBBBBBBB: // Replace with IR code for On/Off (Toggle) button
toggleRelay = !toggleRelay;
digitalWrite(relayPin, toggleRelay);
delay(buttonDelay);
break;
case 0xCCCCCCCC: // Replace with IR code for Reset button
resetFunc();
delay(buttonDelay);
break;
}
irrecv.resume(); // Receive the next value
}
if (buttons.isPressed(selectButton) && !flashing)
{
if (!programmingMode)
{
programmingMode = true;
currentParameter = 0;
} else
{
programmingMode = false;
saveToEEPROM();
}
delay(buttonDelay);
}
else if (buttons.isPressed(leftButton) && !flashing)
{
if (programmingMode)
{
currentParameter--;
if(currentParameter == -1)
{
currentParameter = 5;
}
currentParameter = currentParameter % 6;
}
delay(buttonDelay);
}
else if (buttons.isPressed(rightButton) && !flashing)
{
if (programmingMode)
{
currentParameter++;
currentParameter = currentParameter % 6;
}
delay(buttonDelay);
}
else if (buttons.isPressed(upButton))
{
if (programmingMode)
{
if(currentParameter == 0)
{
selectedPreset++;
selectedPreset = selectedPreset % 20;
}
else if(currentParameter == 5)
{
presets[selectedPreset][4]++;
presets[selectedPreset][4] = presets[selectedPreset][4] % 10;
}
else
{
for(int i=1; i<=4; i++)
{
if(currentParameter == i)
{
presets[selectedPreset][i-1]++;
presets[selectedPreset][i-1] = presets[selectedPreset][i-1] % 100;
}
}
}
}
delay(buttonDelay);
}
else if (buttons.isPressed(downButton))
{
if (programmingMode)
{
if(currentParameter == 0)
{
selectedPreset--;
if(selectedPreset < 0)
{
selectedPreset = 19;
}
}
else if(currentParameter == 5)
{
presets[selectedPreset][4]--;
if(presets[selectedPreset][4] < 0)
{
presets[selectedPreset][4] = 9;
}
}
else
{
for(int i=1; i<=4; i++)
{
if(currentParameter == i)
{
presets[selectedPreset][i-1]--;
if(presets[selectedPreset][i-1] < 0)
{
presets[selectedPreset][i-1] = 99;
}
}
}
}
}
delay(buttonDelay);
}
if(digitalRead(runButton) == LOW)
{
setRunParameters();
handleRun();
delay(buttonDelay);
}
if(digitalRead(onOffButton) == LOW)
{
toggleRelay = !toggleRelay;
digitalWrite(relayPin, toggleRelay);
delay(buttonDelay);
}
displayState();
delay(20);
}
void displayState()
{
if (programmingMode)
{
unsigned int currentTime = millis();
if (currentParameter == 0)
{
if((flashing) && ((currentTime-previousTime) > flashingTime))
{
lcd.setCursor(0, 0);
lcd.print(selectedPreset+1);
previousTime = currentTime;
flashing = false;
}
else if((!flashing) && ((currentTime-previousTime) > flashingTime))
{
lcd.setCursor(0, 0);
lcd.print(" ");
previousTime = currentTime;
flashing = true;
}
for(int i=1; i<=5; i++)
{
lcd.setCursor(3*i, 0);
lcd.print(presets[selectedPreset][i-1]);
lcd.print(" ");
}
}
else
{
for(int i = 1; i<=5; i++)
{
if (currentParameter == i)
{
if((flashing) && ((currentTime-previousTime) > flashingTime))
{
lcd.setCursor(3*i, 0);
lcd.print(presets[selectedPreset][i-1]);
previousTime = currentTime;
flashing = false;
}
else if((!flashing) && ((currentTime-previousTime) > flashingTime))
{
lcd.setCursor(3*i, 0);
lcd.print(" ");
previousTime = currentTime;
flashing = true;
}
}
}
}
}
else
{
lcd.setCursor(0, 0);
lcd.print(selectedPreset+1);
lcd.setCursor(3, 0);
lcd.print(presets[selectedPreset][0]);
lcd.setCursor(6, 0);
lcd.print(presets[selectedPreset][1]);
lcd.setCursor(9, 0);
lcd.print(presets[selectedPreset][2]);
lcd.setCursor(12, 0);
lcd.print(presets[selectedPreset][3]);
lcd.setCursor(15, 0);
lcd.print(presets[selectedPreset][4]);
}
}
void setRunParameters()
{
for(int i=0; i<5; i++)
{
run[i] = presets[selectedPreset][i];
}
}
void saveToEEPROM()
{
for(int i=0; i<20; i++)
{
if(i == selectedPreset)
{
EEPROM.write((6*selectedPreset), selectedPreset);
EEPROM.write(((6*selectedPreset)+1), presets[selectedPreset][0]);
EEPROM.write(((6*selectedPreset)+2), presets[selectedPreset][1]);
EEPROM.write(((6*selectedPreset)+3), presets[selectedPreset][2]);
EEPROM.write(((6*selectedPreset)+4), presets[selectedPreset][3]);
EEPROM.write(((6*selectedPreset)+5), presets[selectedPreset][4]);
}
}
}
void handleRun()
{
digitalWrite(sounderPin, LOW);
delay(200);
digitalWrite(sounderPin, HIGH);
delay(5000);
toggleRelay = false;
digitalWrite(relayPin, toggleRelay);
for (int i=presets[selectedPreset][4]; i>0; i--)
{
for(int j=0; j<4; j++)
{
for(int k=run[j]; k>=0; k--)
{
lcd.setCursor((3*(j+1)), 0);
lcd.print(k);
lcd.print(" ");
if(k!=0)
{
digitalWrite(relayPin, toggleRelay);
unsigned int currentTime = millis();
previousTime = millis();
while(currentTime - previousTime < 1000)
{
if(digitalRead(onOffButton) == LOW)
{
k = 0;
j = 3;
i = 1;
digitalWrite(relayPin, HIGH);
delay(buttonDelay);
}
currentTime = millis();
delay(20);
}
}
}
toggleRelay = !toggleRelay;
}
run[4]--;
if(run[4]>0)
{
for(int l=0; l<5; l++)
{
lcd.setCursor((3*(l+1)), 0);
lcd.print(run[l]);
}
}
else
{
lcd.setCursor(15, 0);
lcd.print(run[4]);
digitalWrite(relayPin, HIGH);
digitalWrite(sounderPin, LOW);
delay(200);
digitalWrite(sounderPin, HIGH);
delay(5000);
}
}
}