I've tried the following now.
#include <EEPROM.h>
#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip
// LCD geometry
const byte LCD_COLS = 16;
const byte LCD_ROWS = 2;
#include <Keypad.h>
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] = {11, 10, 9, 8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
bool getNumber = true;
bool countfromMem = true;
unsigned long count;
const byte entryMaxSize = 5;
static char digits[entryMaxSize + 1];
static byte index;
void setup()
{
Serial.begin(115200);
lcd.begin(LCD_COLS, LCD_ROWS);
lcd.setCursor(3, 0);
lcd.print(" PRIYA");
lcd.setCursor(3, 1);
lcd.print("ELECTRONICS");
delay(100);
for (int positionCounter = 0; positionCounter < 40; positionCounter++)
{
lcd.scrollDisplayLeft();
delay(120);
}
delay(800);
readCount();
checkForCount();
}
void readCount()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Count:");
lcd.setCursor(11, 0);
lcd.print(EEPROM.get(0, count)); // <<<<<<<<< read from EEPROM & print in it
}
void checkForCount()
{
if (count > 0)
{
countfromMem = true;
}
else
{
countfromMem = false;
index = 0; // reset counter
getNumber = true;
}
}
void loop()
{
if (keypad.getKeys()) // check for keypad activity
{
// we won't handle multiple keypresses, just single ones, so just key index 0
const byte key = keypad.key[0].kchar;
const byte state = keypad.key[0].kstate; // IDLE, PRESSED, HOLD, RELEASED
switch (key)
{
case 'A': initializeCounter(); Serial.println(key); break;
case 'D': setCount(); Serial.println(key); break;
default: getCount(state, key);
}
}
}
void initializeCounter()
{
readCount();
checkForCount();
}
unsigned long tempcount; // temporary count created by key entry
void getCount(const byte state, char key)
{
if (state == PRESSED)
{
if (getNumber)
{
// if not 5 characters yet
if (index < entryMaxSize)
{
// add key to userinput array and increment counter
if ( key >= '0' && key <= '9' ) // key is of type char and has a value between 0 and 9 so do something with it.
{
digits[index++] = key;
digits[index] = '\0';
tempcount = atol(digits);
char displayText[17] = "";
snprintf(displayText, sizeof(displayText), "Set Count: %5lu", tempcount);
lcd.setCursor(0, 0);
lcd.print(displayText);
}
}
else
{
countWarning();
}
}
}
}
void setCount()
{
if (countfromMem)
{
lcd.clear();
lcd.print("Count Set: ");
lcd.print(count);
countfromMem = false;
}
else if (getNumber)
{
if (count == 0)
{
invalidCount();
}
else
{
lcd.clear();
lcd.print("Count Set: ");
for (byte i = 0; i < index; i++)
{
lcd.print(digits[i]);
getNumber = false;
}
unsigned long count = atol(digits);
Serial.print(count);
EEPROM.put(0, count); // <<<<<<<<< save to EEPROM here
}
}
}
void invalidCount()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Invalid Count!!");
lcd.setCursor(0, 1);
lcd.print("Press A"); // suggesting the user to enter the count again
countfromMem = false;
getNumber = false;
}
void countWarning()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("5 Digits Only!!"); // warning for the user if more than permitted digits are entered
lcd.setCursor(0, 1);
lcd.print("Press A"); // suggesting the user to enter the count again
countfromMem = false;
getNumber = false;
}