#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
/*----- Keypad setup -----*/
const byte rows = 4;
const byte columns = 4;
const char Keys[rows][columns] = {
{'7', '8', '9', '/'},
{'4', '5', '6', '*'},
{'1', '2', '3', '-'},
{'C', '0', '=', '+'}
};
const byte rowsPin[rows] = {9, 8, 7, 6};
const byte columnsPin[columns] = {5, 4, 3, 2};
Keypad myKeypad = Keypad(makeKeymap(Keys), rowsPin, columnsPin, rows, columns);
/*------------------------*/
LiquidCrystal_I2C lcdDisplay(0x27,12,2);//lcd setup
/*========== Creating number ==========*/
long int createNumber(char symbol, long int Num){
int tempMemory = (int)symbol - 48;//tempMemory = char's value changed to int
if(tempMemory == 0) {
return Num * 10;//return number with 0 in the end example(Num = 123 => return 1230)
} else {
return Num * 10 + tempMemory;//return number with tempMemory in the end example(Num = 10, tempMemory = 3 => 103)
}
}
/*============ Calculating result ========*/
long int Calculations(long int num1, char arithmeticSign, long int num2) {
switch(arithmeticSign) {
case '/':
if(num1 == 0 || num2 == 0){//num1 or num2 == 0
lcdDisplay.clear();
lcdDisplay.print("ERROR");
delay(1500);
lcdDisplay.clear();
return 0;
} else {
num1 = num1 / num2;//calculations
lcdDisplay.clear();//clear lcd
lcdDisplay.print(num1);//printing result of the calculations
delay(500);
return num1;//return result of the calculations
}
case '*':
num1 = num1 * num2;
lcdDisplay.clear();
lcdDisplay.print(num1);
delay(500);
return num1;
case '-':
num1 = num1 - num2;
lcdDisplay.clear();
lcdDisplay.print(num1);
delay(500);
return num1;
case '+':
num1 = num1 + num2;
lcdDisplay.clear();
lcdDisplay.print(num1);
delay(500);
return num1;
case 'C':
lcdDisplay.clear();
return 0;
}
}
void setup() {
lcdDisplay.init();
lcdDisplay.backlight();
Serial.begin(9600);
}
long int num1 = 0;//later it is a result
char arithmeticSign;//*, /, -, +, =, C = clear all
long int num2 = 0;
String whichNum = "num1";//specifies which number user types
void loop() {
char pressedKey = myKeypad.getKey();
switch(pressedKey) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
lcdDisplay.print(pressedKey);
if(whichNum == "num1") {
num1 = createNumber(pressedKey, num1);
Serial.print("num1 => ");
Serial.println(num1);
} else {
num2 = createNumber(pressedKey, num2);
Serial.print("num2 => ");
Serial.println(num2);
}
break;
case '/':
case '*':
case '-':
case '+':
if(whichNum == "num1") {
whichNum = "num2";
} else if(whichNum == "num2") {
num1 = Calculations(num1, arithmeticSign, num2);
num2 = 0;
whichNum = "num2";
}
lcdDisplay.print(pressedKey);
arithmeticSign = pressedKey;
break;
case 'C':
lcdDisplay.clear();
whichNum = "num1";
num1 = 0;
num2 = 0;
break;
case '=':
if(whichNum == "num1") {
whichNum = "num2";
} else if(whichNum == "num2") {
num1 = Calculations(num1, arithmeticSign, num2);
num2 = 0;
whichNum = "num1";
}
break;
}
}