How can I modify the millis related variables in my program, so that when I press '#', the automode starts running case 1 immediately?
#include <LiquidCrystal.h>
#include <Keypad.h>
//KEYPAD SETUP
const byte ROWS = 4; //DEFINE NUMBER OF ROWS ON KEYPAD
const byte COLS = 3; //DEFINE NUMBER OF COLUMNS ON KEYPAD
char keys[ROWS][COLS] = { //ARRAY FOR KEYPAD KEYS
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};//END ARRAY FOR KEYPAD KEYS
byte rowPins[ROWS] = {3, 10, 9, 2}; //PINS WHERE THE ROWS OF THE KEYPAD IS CONNECTED
byte colPins[COLS] = {17, 16, 15}; //PINS WHERE THE COLUMNS OF THE KEYPAD IS CONNECTED
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );//MAKING KEYMAP FOR KEYPAD
//LCD DISPLAY SETUP
LiquidCrystal lcd(7, 6, 5, 4, A0, 8); //PINS WHERE THE LCD DISPLAY IS CONNECTED
/*
* LCD RS pin to digital pin 7
* LCD Enable pin to digital pin 6
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin A0
* LCD D7 pin to digital pin 8
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor: VO on display connected directly to GND.
* ends to +5V and ground For optimising contract, use a potmeter as described
* wiper to LCD VO pin (pin 3)
*/
const unsigned long debounceValue = 50UL; //SETTING FOR DEBOUNCE TIME IN MILLISECONDS
unsigned long debounceTime; //VARIABLE FOR DEBOUNCING KEYS PRESSED
boolean change; //SETTING BOOLEAN VARIABLE FOR TOGGLING BETWEEN MANUAL AND AUTOMODE
boolean manKey1; //SETTING BOOLEAN VARIABLE FOR MANUAL OPERATION
boolean manKey2; //SETTING BOOLEAN VARIABLE FOR MANUAL OPERATION
boolean manKey3; //SETTING BOOLEAN VARIABLE FOR MANUAL OPERATION
const byte rly1 = 11; //DEFINE RELAY 1 VARIABLE ON PIN11
const byte rly2 = 12; //DEFINE RELAY 2 VARIABLE ON PIN12
const byte rly3 = 13; //DEFINE RELAY 3 VARIABLE ON PIN13
unsigned long currentMillis; //CURRENTMILLIS MUST BE UNSIGNED LONG TO AVOID STACK OVERFLOW
unsigned long RLYmillis; //RLYMILLIS MUST BE UNSIGNED LONG TO AVOID STACK OVERFLOW
unsigned long RLYdelay = 10000;//RLYDELAY MUST BE UNSIGNED LONG TO AVOID STACK OVERFLOW - DECIDES THE AMOUNT OF TIME EACH RELAY SHOULD BE ON IN AUTOMODE
byte currentState; //MAKE VARIABLE CURRENTSTATE
//INITIALIZE SETUP
void setup()
{
Serial.begin(9600); //SET BAUD RATE
lcd.begin(20, 2); // SETTING UP LCD'S NUMBER OF COLUMNS AND ROWS
debounceTime = millis(); //DEBOUNCETIME = CURRENT TIME
pinMode(rly1, OUTPUT); //RELAY 1 PIN IS OUTPUT
digitalWrite(rly1, LOW); //INITIALLY RELAY 1 IS OFF
pinMode(rly2, OUTPUT); //RELAY 2 PIN IS OUTPUT
digitalWrite(rly2, LOW); //INITIALLY RELAY 2 IS OFF
pinMode(rly3, OUTPUT); //RELAY 3 PIN IS OUTPUT
digitalWrite(rly3, LOW); //INITIALLY RELAY 2 IS OFF
keypad.addEventListener(keypadEvent); //INITIALIZE CHECKUP ON KEYPAD USAGE
} // END OF SETUP
//INITIALIZE THE MAIN LOOP
void loop()
{
char key = keypad.getKey();
//================== is it time to check the switches?
if (millis() - debounceTime >= debounceValue)
{
debounceTime = millis(); //re-initialize to the current time
}
if (change == 1) {
automode();
}
else if (change == 0) {
manualmode();
}
}//END MAIN LOOP=============================================================================================
//INITIALIZE THE MANUAL MODE FUNCTION========================================================================
void manualmode (void)
{
lcd.setCursor(0, 0);
lcd.print ("Manual Mode Enabled ");
if (manKey1 == 1) {
digitalWrite (rly1, HIGH);
lcd.setCursor(0, 1);
lcd.print ("1:ON ");
}
else if (manKey1 == 0) {
digitalWrite (rly1, LOW);
lcd.setCursor(0, 1);
lcd.print ("1:OFF");
}
if (manKey2 == 1) {
digitalWrite (rly2, HIGH);
lcd.setCursor(6, 1);
lcd.print ("2:ON ");
}
else if (manKey2 == 0) {
digitalWrite (rly2, LOW);
lcd.setCursor(6, 1);
lcd.print ("2:OFF");
}
if (manKey3 == 1) {
digitalWrite (rly3, HIGH);
lcd.setCursor(12, 1);
lcd.print ("3:ON ");
}
else if (manKey3 == 0) {
digitalWrite (rly3, LOW);
lcd.setCursor(12, 1);
lcd.print ("3:OFF");
}
}//END MANUAL MODE FUNCTION==================================================================================
//INITIALIZE THE AUTOMODE FUNCTION========================================================================
void automode (void)
{
lcd.setCursor(0, 0);
lcd.print ("Automode Enabled ");
//print the number of seconds since reset:
//lcd.setCursor(0, 1);
//lcd.print ("Been running for:");
//lcd.setCursor(18, 1);
//lcd.print(millis() / 1000);
currentMillis = millis();
if (currentMillis - RLYmillis >= RLYdelay)
{
RLYmillis = currentMillis;
switch (currentState)
{
//***************************
case 1:
lcd.setCursor(0, 1);
lcd.print ("Relay 1 ON ");
digitalWrite(rly1, HIGH);
currentState = 2;
break;
//***************************
case 2:
lcd.setCursor(0, 1);
lcd.print ("Relay 2 ON ");
digitalWrite(rly1, LOW);
digitalWrite(rly2, HIGH);
//Change to the next state
currentState = 3;
break;
//***************************
case 3:
lcd.setCursor(0, 1);
lcd.print ("Relay 3 ON ");
digitalWrite(rly2, LOW);
digitalWrite(rly3, HIGH);
//Change to the next state
currentState = 4;
break;
//***************************
case 4:
lcd.setCursor(0, 1);
lcd.print ("All relays OFF ");
digitalWrite(rly3, LOW);
//Change to the next state
currentState = 1;
break;
//***************************
default:
currentState = 1; //Back to state 1
} // END SWITCH/CASE===========================================================
} //END IF STATEMENT=============================================================
} //END THE AUTOMODE FUNCTION======================================================
void keypadEvent(KeypadEvent key) {
//MANUAL MODE OPERATION PARAMETERS
if (keypad.getState() == PRESSED) {
if (key == '1' && change == 0) { //IF KEY '1' IS PRESSED AND VARIABLE CHANGE == 0,
if (key == '1') { //TOGGLE VARIABLE MANKEY1
if (manKey1) manKey1 = 0;
else manKey1 = 1;
}//END BOOLEAN TOGGLE FOR VARIABLE MANKEY1
}//END 'IF KEY 1'
if (key == '2' && change == 0) {//IF KEY '2' IS PRESSED AND VARIABLE CHANGE == 0,
if (key == '2') { //TOGGLE VARIABLE MANKEY2
if (manKey2) manKey2 = 0;
else manKey2 = 1;
}//END BOOLEAN TOGGLE FOR VARIABLE MANKEY2
}//END 'IF KEY 2'
if (key == '3' && change == 0) { //IF KEY '3' IS PRESSED AND VARIABLE CHANGE == 0,
if (key == '3') { //TOGGLE VARIABLE MANKEY3
if (manKey3) manKey3 = 0;
else manKey3 = 1;
}//END BOOLEAN TOGGLE FOR VARIABLE MANKEY3
}//END 'IF KEY 3'
}//END MANUAL MODE OPERATION PARAMETERS
//AUTOMODE OPERATION PARAMETERS
if (keypad.getState() == PRESSED) {
if (key == '#') { //IF KEY '#' IS PRESSED, TOGGLE VARIABLE CHANGE
if (change) change = 0;
else change = 1;
lcd.setCursor(0, 1);
lcd.print (" "); //CLEARING THE DISPLAY LINE 2 TO AVOID CONFLICT WHEN TOGGLING BETWEEN AUTO AND MANUAL
}//END BOOLEAN TOGGLE FOR VARIABLE CHANGE
}//END AUTO MODE OPERATION PARAMETERS
}//END KEYPADEVENT FUNCTION
Also, if an explanation comes with the solution, it'd be awesome! ![]()