#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
//(4 řádky, 4 sloupce)
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'.', '0', '=', '/'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
String X = "";
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
}
//zpracování stisknutých kláves
void proces(char x) {
if (isDigit(x) || x == '.') {
X += x;
lcd.print(x);
}
else if (strchr("+-*/", x)) { //strchr hledá zadaný znak "+-*/"
X += x;
lcd.clear();
lcd.print(X);
}
else if (x == '=') {
float vysledek = eval(X); // Vyhodnocení výrazu a získání výsledku
X = String(vysledek); // Konverze výsledku na řetězec
lcd.clear();
lcd.print(X);
}
}
//vyhodnocení výrazu
float eval(String X) { //eval vyhodnocuje
float a = 0;
float b = 0;
char pocet;
int najdi = 0;
// nalezení operátoru a rozdělení
for (int i = X.length() - 1; i >= 0; i--) {
if (strchr("+-*/", X[i])) { //X[i] je operátor("+-*/")
pocet = X[i];
najdi = i;
break;
}
}
// netusim jak funguje ale děla to desetinna čisla
a = X.substring(0, najdi).toFloat();
b = X.substring(najdi + 1).toFloat();
// Provedení operace
switch (pocet) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
void loop() {
char Key = keypad.getKey(); // Čtení kláves
if (Key) proces(Key); // Zpracování stisknuté klávesy
}