Hello,
I am having trouble scrolling menu after going into a sub menu. The code works fine and the menu also scrolls when the buttons are pressed. But once i go to sub menu (like case 'A' or Case 'B'), and press * to get back to the home page the scrolling stops. All the functions work; I can still go to sub menu but cannot scroll down or up.
I would highly appreciate if you guys can help me out on this issue.
Regards,
#include <LiquidCrystal.h>
#include <Keypad.h>
int value=0;
int Cement_Weight = 0;
int Sand_Weight = 0;
int Water_Weight = 0;
char selection;
int page_counter=1 ;
int up = 52;
int down = 53;
boolean current_up = LOW;
boolean last_up=LOW;
boolean last_down = LOW;
boolean current_down = LOW;
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {14,15,16,17}; //row pinouts of the keypad (L1, L2, L3, L4)
byte colPins[COLS] = {18,19,20,21}; //column pinouts of the keypad (R1, R2, R3)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd1(2,3,4,5,6,7);
LiquidCrystal lcd2(2,9,4,5,6,7);
void setup()
{
Serial.begin(9600);
lcd1.begin(20,4);
lcd2.begin(20,4);
lcd1.clear();
lcd2.clear();
Live_Weight_Display();
keypad.addEventListener(keypadEvent);
}
boolean debounce(boolean last, int pin)
{
boolean current = digitalRead(pin);
if (last != current)
{
delay(5);
current = digitalRead(pin);
}
return current;
}
void loop()
{
char key = keypad.getKey();
Scroll();
}
void Scroll()
{
current_up = debounce(last_up, up);
current_down = debounce(last_down, down);
//Page Up
if (last_up== LOW && current_up == HIGH)
{
lcd1.clear(); //When page is changed, lcd clear to print new page
if(page_counter <3)
{ //Page counter never higher than 3(total of pages)
page_counter= page_counter +1; //Page up
}
else
{
page_counter= 1; //return to page 1
}
}
last_up = current_up;
//Page Down
if (last_down== LOW && current_down == HIGH)
{
lcd1.clear(); //When page is changed, lcd clear to print new page
if(page_counter >1)
{ //Page counter never lower than 1 (total of pages)
page_counter= page_counter -1; //Page down
}
else
{
page_counter= 3; //return to page 3
}
}
last_down = current_down;
switch (page_counter)
{
case 1:
{
menu();
}
break;
case 2:
{ //Design of page 3
lcd1.setCursor(5,0);
lcd1.print("This is");
lcd1.setCursor(4,1);
lcd1.print("Page 3");
}
break;
case 3:
{ //Design of page 2
lcd1.setCursor(1,0);
lcd1.print("You are now on");
lcd1.setCursor(4,1);
lcd1.print("Page 2");
}
break;
}
}
void Live_Weight_Display()
{
lcd2.clear();
lcd2.print(" Weight Settings");
lcd2.setCursor(0,1);
lcd2.print("Cement Sand Water");
lcd2.setCursor(0,2);
lcd2.print(Cement_Weight);
lcd2.print(" kg");
lcd2.setCursor(8,2);
lcd2.print(Sand_Weight);
lcd2.print(" kg");
lcd2.setCursor(14,2);
lcd2.print(Water_Weight);
lcd2.print(" kg");
}
void menu()
{
lcd1.setCursor(0,0);
lcd1.print("Menu: ");
lcd1.setCursor(0,1);
lcd1.print("For Cement Press A");
lcd1.setCursor(0,2);
lcd1.print("For Sand Press B");
lcd1.setCursor(0,3);
lcd1.print("For Water Press C");
}
void keypadEvent(KeypadEvent key)
{
switch (key)
{
case 'A':
lcd1.clear();
lcd1.print("Enter Cement Weight");
lcd1.setCursor(0,1);
lcd1.print("& Then Press #");
lcd1.setCursor(5,2);
lcd1.print("kg");
Cement_Weight = getTheNumber();
Live_Weight_Display();
break;
case 'B':
lcd1.clear();
lcd1.print("Enter Sand Weight");
lcd1.setCursor(0,1);
lcd1.print("& Then Press #");
lcd1.setCursor(5,2);
lcd1.print("kg");
Sand_Weight = getTheNumber();
Serial.print (Sand_Weight);
Live_Weight_Display();
break;
case 'C':
lcd1.clear();
lcd1.print("Enter Water Weight");
lcd1.setCursor(0,1);
lcd1.print("& Then Press #");
lcd1.setCursor(5,2);
lcd1.print("kg");
Water_Weight = getTheNumber();
Live_Weight_Display();
break;
case 'D':
lcd1.clear();
lcd1.print("Cement:");
lcd1.setCursor(7,0);
lcd1.print(Cement_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,1);
lcd1.print("Sand :");
lcd1.setCursor(7,1);
lcd1.print(Sand_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,2);
lcd1.print("Water :");
lcd1.setCursor(7,2);
lcd1.print(Water_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,3);
lcd1.print("Hold # to reset");
break;
case '*':
lcd1.clear();
page_counter= 1;
loop();
break;
}
switch (keypad.getState())
{
case HOLD:
if (key == '#')
{
Cement_Weight = 0;
Sand_Weight = 0;
Water_Weight = 0;
lcd1.clear();
lcd1.print("Cement:");
lcd1.setCursor(7,0);
lcd1.print(Cement_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,1);
lcd1.print("Sand :");
lcd1.setCursor(7,1);
lcd1.print(Sand_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,2);
lcd1.print("Water :");
lcd1.setCursor(7,2);
lcd1.print(Water_Weight);
lcd1.print(" kg");
lcd1.setCursor(0,3);
lcd1.print("Hold # to reset");
Live_Weight_Display();
}
break;
}
}
int getTheNumber()
{
char buffer[4];
// Input up to 3 numbers until we find a * or #
int i=0;
while (1)
{
char key = keypad.getKey();
// If it's a number AND we have space left, add to our string
if ('0' <= key && key <= '9' && i < 3)
{
buffer[i] = key;
i++;
Serial.print(key);
lcd1.setCursor(i,2);
lcd1.print(key);
}
// If it's a * or #, end
else if ('#' == key && i > 0)
{
// Null terminate
buffer[i] = 0;
int value = atoi(buffer); // Convert to an integer
i = 0;
return value;
break;
}
}
}