float maths;
float leftNum = NAN;
float rightNum = NAN;
char operater = '\0';
String leftString;
String rightString;
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', '+' },
{ '4', '5', '6', '-' },
{ '7', '8', '9', '*' },
{ '^', '0', '=', '/' }
};
uint8_t colPins[COLS] = { 5, 4, 3, 2 };
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
Serial.println(String(leftNum));
}
void processKey(char thisKey) {
if (thisKey == '=') {
doMaths(leftNum,operater,rightNum);
leftNum = maths;
}
if (thisKey == '^') {
operater = '\0';
lcd.setCursor(1,0);
lcd.clear();
lcd.clear();
rightNum = NAN;
leftNum = NAN;
leftString = '0';
rightString = '0';
}
switch (thisKey) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (operater == '\0') {
leftString = leftString+String(thisKey);
leftNum = leftString.toDouble();
lcd.setCursor(1,0);
lcd.print(leftNum);
} else {
rightString = rightString+String (thisKey);
rightNum = rightString.toDouble();
lcd.setCursor(1,1);
lcd.print(rightNum);
}
}
switch (thisKey) {
case '+':
case '-':
case '*':
case '/':
rightNum = 0;
rightString = '0';
Serial.println(String(leftNum));
if (leftNum == NAN) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Error, Please Pr");
lcd.setCursor(0,1);
lcd.print("ess Number First");
delay(1000);
lcd.clear();
} else {
operater = thisKey;
lcd.setCursor(0,1);
lcd.print(operater);
}
}
}
void doMaths(float left, char doThis, float right) {
switch (doThis) {
case '+':
maths = left+right;
break;
case '-':
maths = left-right;
break;
case '*':
maths = left*right;
break;
case '/':
maths = left/right;
}
if (maths == int(maths)) {
lcd.clear();
lcd.setCursor(1,0);
lcd.print(int(maths));
lcd.setCursor(0,1);
lcd.print('=');
} else {
lcd.clear();
lcd.setCursor(1,0);
lcd.print(maths);
lcd.setCursor(0,1);
lcd.print('=');
}
}
void loop() {
char key = keypad.getKey();
if (key) {
processKey(key);
}
}