PaulS:
Consistent placement of curly braces is a good thing. I prefer the middle style, with every { and every } on a line by itself. I can tolerate the first and last style. What I can't abide is MIXING styles.I do not like the use of count to hold the digits and val to hold the value. I'd prefer digits to hold the digits and count to hold the value.
These two issues have been handled:
#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 int LCD_COLS = 16;
const int 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] = {6, 7, 8, 9}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 12, 11}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
bool a = true;
void setup()
{
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);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Count:");
}
//unsigned long total;
void loop()
{
const byte entryMaxSize = 5;
static char digits[entryMaxSize + 1];
static byte x; // index
char key = keypad.getKey();
if (key != NO_KEY) // Check for a valid key.
{
switch (key)
{
case 'A':
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Count:");
x = 0; // reset the counter
a = true;
break;
case 'D':
if (a)
{
if (x == 0)
{
invalidCount();
}
else
{
lcd.clear();
lcd.print("Count Set:");
for (byte i = 0; i < x; i++)
{
lcd.print(digits[i]);
unsigned long count = atol(digits);
a = false;
}
}
}
break;
default:
if (a)
{
// if not 5 characters yet
if (x < 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[x++] = key;
digits[x] = '\0';
lcd.print( key ) ; // new print statement <<<<<<<<<<<<<<<<
//total = ((count[ 0 ] - '0') * 10000UL + (count[ 1 ] - '0') * 1000 + (count[ 2 ] - '0') * 100 + (count[3] - '0') * 10 + (count[4] - '0'));
}
}
else
{
countWarning();
}
}
break;
}
}
}
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
a = 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
a = false;
}
PaulS:
What is the point in creating the variable val if you are never going to use it? THAT is what the compiler is asking you.
unsigned long count = atol(digits);
I've declared 'count' as unsigned long and used the 'atol' function to convert 'digits' which is a string into an UL, so why does compiler say I've not used it. Doesn't 'count' now hold an unsigned long int?
Gautam