#include <Arduino.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
String val = "";
String win = "calc";
int menuPage = 1;
int maxPage = 6;
int piXS = 0;
String pi1 = "3.14159265358979";
String pi2 = "3238462643383279";
int befMenP;
bool MenuStart = false;
bool PiStart = false;
bool randomNumberGeneratorStart = false;
// number generator
int cursorY = 0;
String num1 = "";
String num2 = "";
bool countedNG = false;
// e dice
bool eDiceStart = false;
int diceNum;
// Settings
int settingsPage = 1;
String language = "Cesky";
bool settingsStart = false;
bool diagnosticsStart = false;
int maxSettingsPage = 2;
double evaluateExpression(String expression) {
int len = expression.length();
char operators[len];
double operands[len];
int op_index = 0;
int num_index = 0;
for (int i = 0; i < len; i++) {
char c = expression.charAt(i);
if (c == ' ')
continue;
if (isdigit(c)) {
double num = 0;
while (i < len && isdigit(expression.charAt(i))) {
num = num * 10 + (expression.charAt(i) - '0');
i++;
}
i--;
operands[num_index++] = num;
} else if (c == '(') {
operators[op_index++] = c;
} else if (c == ')') {
while (op_index > 0 && operators[op_index - 1] != '(') {
double b = operands[--num_index];
double a = operands[--num_index];
char op = operators[--op_index];
if (op == '+') {
operands[num_index++] = a + b;
} else if (op == '-') {
operands[num_index++] = a - b;
} else if (op == '*') {
operands[num_index++] = a * b;
} else if (op == '/') {
operands[num_index++] = a / b;
}
}
op_index--; // remove '('
} else {
while (op_index > 0 && precedence(operators[op_index - 1]) >= precedence(c)) {
double b = operands[--num_index];
double a = operands[--num_index];
char op = operators[--op_index];
if (op == '+') {
operands[num_index++] = a + b;
} else if (op == '-') {
operands[num_index++] = a - b;
} else if (op == '*') {
operands[num_index++] = a * b;
} else if (op == '/') {
operands[num_index++] = a / b;
}
}
operators[op_index++] = c;
}
}
while (op_index > 0) {
double b = operands[--num_index];
double a = operands[--num_index];
char op = operators[--op_index];
if (op == '+') {
operands[num_index++] = a + b;
} else if (op == '-') {
operands[num_index++] = a - b;
} else if (op == '*') {
operands[num_index++] = a * b;
} else if (op == '/') {
operands[num_index++] = a / b;
}
}
return operands[0];
}
int precedence(char op) {
if (op == '+' || op == '-') {
return 1;
}
if (op == '*' || op == '/') {
return 2;
}
return 0;
}
const byte ROWS = 4; // počet řádků na klávesnici
const byte COLS = 4; // počet sloupců na klávesnici
// definice symbolů pro klávesy
char keys[ROWS][COLS] = {
{'1','2','3','+'},
{'4','5','6','-'},
{'7','8','9','*'},
{'D','0','=','/'}
};
// definice pinů pro sloupce a řádky
byte rowPins[ROWS] = {12, 11, 10, 9}; // připojené k pinům pro řádky
byte colPins[COLS] = {8, 7, 6, 5}; // připojené k pinům pro sloupce
// vytvoření instance objektu klávesnice
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool clr;
void setup() {
//Serial.begin(9600);
//Serial.print("Started!");
//Serial.println(evaluateExpression(val));
lcd.init();
lcd.backlight();
if (language == "English") {
lcd.setCursor(4,0);
lcd.print("Welcome");
lcd.setCursor(6,1);
lcd.print("o_o");
} else if (language == "Cesky") {
lcd.setCursor(4,0);
lcd.print("Vitejte");
lcd.setCursor(6,1);
lcd.print("o_o");
}
delay(2000);
lcd.clear();
}
void loop() {
char key = keypad.getKey();
if(win == "calc") {
if (key) {
if (key == '=') {
lcd.setCursor(0,1);
lcd.print(evaluateExpression(val));
if (val == "/00/") {
win = "menu";
lcd.clear();
}
val = "";
clr = false;
} else if (key == 'D') {
val = "";
lcd.clear();
clr = true;
} else {
if (clr == false) {
clr = true;
lcd.clear();
}
val += key;
lcd.setCursor(0,0);
lcd.print(val);
clr = false;
}
}
}else if (win == "menu") { // MENU
if (MenuStart == false) {
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
}
befMenP = menuPage;
if (key == '-') {
menuPage++;
if (maxPage+1 == menuPage) {
menuPage = 1;
}
//delay(500);
} else if (key == '+') {
menuPage--;
if (menuPage == 0) {
menuPage = maxPage;
}
//delay(500);
} else if (key == '=') {
if (menuPage == 1) {
win = "calc";
lcd.clear();
MenuStart = false;
} else if (menuPage == 2) {
win = "pi";
lcd.clear();
PiStart = false;
MenuStart = false;
} else if (menuPage == 3) {
win = "randomNumberGenerator";
lcd.clear();
MenuStart = false;
randomNumberGeneratorStart = false;
} else if (menuPage == 4) {
win = "eDice";
lcd.clear();
MenuStart = false;
eDiceStart = false;
} else if (menuPage == 5) {
win = "diagnostics";
lcd.clear();
diagnosticsStart = false;
} else if (menuPage == 6) {
win = "settings";
lcd.clear();
settingsStart = false;
}
}
/*
Serial.println(befMenP);
Serial.println(menuPage);
Serial.println(key);
*/
if (befMenP != menuPage) {
if (menuPage == 1) {
lcd.clear();
if (language == "English") {
lcd.print("Calculator");
lcd.setCursor(0,0);
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
lcd.setCursor(0,0);
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
lcd.setCursor(0,0);
}
} else if (menuPage == 2) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Pi");
} else if (menuPage == 3) {
lcd.clear();
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("Random number");
lcd.setCursor(0,1);
lcd.print("generator");
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("Generator");
lcd.setCursor(0,1);
lcd.print("nahodnych cisel");
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("Penghasil");
lcd.setCursor(0,1);
lcd.print("angla acak");
}
} else if (menuPage == 4) {
lcd.clear();
lcd.setCursor(0,0);
if (language == "Cesky") {
lcd.print("Hraci kostka");
} else if (language == "English") {
lcd.print("Dice");
} else if (language == "Bahasa Indonesia") {
lcd.print("Dadu");
}
} else if (menuPage == 5){
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Diagnostics");
} else if (language == "Cesky") {
lcd.print("Diagnostika");
} else if (language == "Bahasa Indonesia") {
lcd.print("Diagnostik");
}
} else if (menuPage == 6) {
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Settings");
} else if (language == "Cesky") {
lcd.print("Nastaveni");
} else if (language == "Bahasa Indonesia") {
lcd.print("Pengaturan");
}
}
}
} else if (win == "pi") {
if (PiStart == false) {
PiStart = true;
lcd.setCursor(0,0);
lcd.print(pi1);
lcd.setCursor(0,1);
lcd.print(pi2);
}
while (true) {
char key = keypad.getKey();
if (key == '/') {
win = "menu";
lcd.clear();
menuPage = 1;
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
}
}
} else if (win == "randomNumberGenerator") {
if (randomNumberGeneratorStart == false) {
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("FROM:");
lcd.setCursor(0,1);
lcd.print("TO:");
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("OD:");
lcd.setCursor(0,1);
lcd.print("DO:");
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("DARI:");
lcd.setCursor(0,1);
lcd.print("KE:");
}
randomNumberGeneratorStart = true;
}
while (true) {
char key = keypad.getKey();
if (key) {
//Serial.println(key);
if (key == '+') {
cursorY = 0;
//Serial.println(cursorY);
} else if (key == '-') {
cursorY = 1;
//Serial.println(cursorY);
} else if (key == '/') {
win = "menu";
menuPage = 1;
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
} else if (key == '=') {
int out = random(num1.toInt(), num2.toInt()+1);
num1 = out;
num2 = "";
countedNG = true;
} else if (key != '*' and key != 'D' and countedNG == false) {
if (cursorY == 0) {
num1 += key;
//Serial.println(num1);
} else if (cursorY == 1) {
num2 += key;
//Serial.println(num2);
}
} else if (key = 'D'){
if (cursorY == 0) {
num1 = "";
} else if (cursorY == 1) {
num2 = "";
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ERROR");
lcd.setCursor(0,1);
lcd.print("Restart device");
while (true) {
delay(1);
}
}
if (countedNG == true) {
num1 = "";
num2 = "";
countedNG = false;
cursorY = 0;
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("FROM:");
lcd.setCursor(0,1);
lcd.print("TO:");
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("OD:");
lcd.setCursor(0,1);
lcd.print("DO:");
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("DARI:");
lcd.setCursor(0,1);
lcd.print("KE:");
}
}
}
lcd.clear();
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("FROM:");
lcd.setCursor(5,0);
lcd.print(num1);
lcd.setCursor(0,1);
lcd.print("TO:");
lcd.setCursor(3,1);
lcd.print(num2);
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("OD:");
lcd.setCursor(3,0);
lcd.print(num1);
lcd.setCursor(0,1);
lcd.print("DO:");
lcd.setCursor(3,1);
lcd.print(num2);
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("DARI:");
lcd.setCursor(5,0);
lcd.print(num1);
lcd.setCursor(0,1);
lcd.print("KE:");
lcd.setCursor(3,1);
lcd.print(num1);
}
}
}
} else if (win == "eDice") {
if (eDiceStart == false) {
eDiceStart = true;
lcd.setCursor(5,0);
if (language == "English") {
lcd.print("Dice");
lcd.setCursor(6,1);
} else if (language == "Cesky") {
lcd.print("Kostka");
lcd.setCursor(6,1);
} else if (language == "Bahasa Indonesia") {
lcd.print("Dadu");
lcd.setCursor(6,1);
}
lcd.print("<0>");
}
while (true) {
char key = keypad.getKey();
if (key) {
if (key == '=') {
if (language == "English") {
diceNum = random(1,7);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Dice");
lcd.setCursor(6,1);
lcd.print("<");
lcd.setCursor(7,1);
lcd.print(diceNum);
lcd.setCursor(8,1);
lcd.print(">");
} else if (language == "Cesky") {
diceNum = random(1,7);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Kostka");
lcd.setCursor(6,1);
lcd.print("<");
lcd.setCursor(7,1);
lcd.print(diceNum);
lcd.setCursor(8,1);
lcd.print(">");
} else if (language == "Bahasa Indonesia") {
diceNum = random(1,7);
lcd.setCursor(5,0);
lcd.print("Dadu");
lcd.setCursor(6,1);
lcd.print("<"+String(diceNum)+">");
}
} else if (key == '/') {
win = "menu";
menuPage = 1;
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
}
}
}
} else if (win == "diagnostics") {
if (diagnosticsStart == false) {
diagnosticsStart = true;
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Does not work");
} else if (language = "Cesky") {
lcd.print("Nefunguje");
} else if (language == "Bahasa Indonesia") {
lcd.print("Ini tidak berhasil");
}
}
while (true) {
char key = keypad.getKey();
if (key) {
if (key == '/') {
lcd.clear();
win = "menu";
menuPage = 1;
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
}
}
}
} else if (win == "settings") {
if (settingsStart == false) {
settingsStart = true;
lcd.clear();
}
while (true) {
char key = keypad.getKey();
if (settingsPage == 1) {
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("Language:");
lcd.setCursor(0,1);
lcd.print(language);
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("Jazyk:");
lcd.setCursor(0,1);
lcd.print(language);
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("Bahasa:");
lcd.setCursor(0,1);
lcd.print(language);
}
} else if (settingsPage == 2) {
if (language == "English") {
lcd.setCursor(0,0);
lcd.print("Stand-by mode");
lcd.setCursor(0,1);
lcd.print("Enter ->");
} else if (language == "Cesky") {
lcd.setCursor(0,0);
lcd.print("Rezim spanku");
lcd.setCursor(0,1);
lcd.print("Zapnout ->");
} else if (language == "Bahasa Indonesia") {
lcd.setCursor(0,0);
lcd.print("Modus siaga");
lcd.setCursor(0,1);
lcd.print("menyalakan ->");
}
}
if (key) {
if (key == '=') {
lcd.clear();
if (settingsPage == 1) {
if (language == "English") {
language = "Cesky";
} else if (language == "Cesky") {
language = "Bahasa Indonesia";
} else if (language == "Bahasa Indonesia") {
language = "English";
}
} else if (settingsPage == 2) {
lcd.clear();
lcd.noBacklight();
key = '0';
while (key != '=') {
key = keypad.getKey();
}
if (key == '=') {
win = "menu";
menuPage = 1;
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
}
}
} else if (key == '/') {
lcd.clear();
win = "menu";
menuPage = 1;
lcd.setCursor(0,0);
if (language == "English") {
lcd.print("Calculator");
MenuStart = true;
} else if (language == "Cesky") {
lcd.print("Kalkulacka");
MenuStart = true;
} else if (language == "Bahasa Indonesia") {
lcd.print("Kalkulator");
MenuStart = true;
}
break;
} else if (key == '+') {
settingsPage += 1;
if (settingsPage == maxSettingsPage+1) {
settingsPage = 1;
}
lcd.clear();
} else if (key == '-') {
settingsPage -= 1;
if (settingsPage == 0) {
settingsPage = maxSettingsPage;
}
lcd.clear();
}
}
}
}
}
void BINtoDEC(String num) {
String bin = num; // Binární hodnota jako řetězec
int dec = strtol(num.c_str(), NULL, 2); // Převod na desítkovou hodnotu
return dec;
}
void DECtoBIN(int num) {
int dec = num; // Desítková hodnota
String bin = String(num, BIN); // Převod na binární hodnotu
return bin;
}
void blueScreen(String id) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(":-( E" + id);
lcd.setCursor(0,1);
lcd.print("Restart device");
while (true) {
delay(1);
}
}