#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int upButton = 10;
int downButton = 11;
int selectButton = 12;
int backButton = 13;
int menu = 1;
////////////////////////////////////////////////////////////////////
const byte rows=4;
const byte cols=4;
char hexaButtons[rows][cols]={
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'C', '0', '=', '/'},
};
byte rowPins[rows]={6, 7, 8, 9};
byte colPins[cols]={5, 4, 3, 2};
Keypad myKeypad = Keypad( makeKeymap(hexaButtons), rowPins, colPins, rows, cols );
boolean firstNumState = true;
String firstNum="";
String secondNum="";
char op=' ';
char num = myKeypad.getKey();
float result=0.0;
///////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(backButton, INPUT_PULLUP);
updateMenu();
}
void loop()
{
if ( !digitalRead(downButton) ){
menu++;
updateMenu();
delay(200);
while(!digitalRead(downButton));
}
if (!digitalRead(upButton))
{
menu--;
updateMenu();
delay(200);
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton))
{
executeAction();
updateMenu();
delay(200);
while (!digitalRead(selectButton));
}
if (!digitalRead(backButton))
{
lcd.clear();
menu = 1;
delay(200);
while(!digitalRead(backButton));
}
//////////////////////////////CALCULATOR///////////////////////////////
if(num != NO_KEY && (num == '1' || num == '2' || num == '3' || num == '4' || num == '5' || num == '6' || num == '7' || num == '8' || num == '9' || num == '0')){
if(firstNumState = true){
firstNum = firstNum + num;
}
else{
secondNum = secondNum + num;
}
}
if(num != NO_KEY && (num == '+' || num == '-' || num == '*' || num == '/')){
if(firstNumState = true){
op = num;
firstNumState = false;
}
}
if(num != NO_KEY && num == '='){
if (op == '+') {
result = firstNum.toFloat()+ secondNum.toFloat();
}
if(op == '-'){
result = firstNum.toFloat()- secondNum.toFloat();
}
if(op == '*'){
result = firstNum.toFloat()* secondNum.toFloat();
}
if(op == '/'){
result = firstNum.toFloat()/ secondNum.toFloat();
}
}
}
void updateMenu()
{
switch (menu)
{
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">Jam");
lcd.setCursor(0, 1);
lcd.print(" Alarm");
break;
case 2:
lcd.clear();
lcd.print(" Jam");
lcd.setCursor(0, 1);
lcd.print(">Alarm");
break;
case 3:
lcd.clear();
lcd.print(">Temperatur");
lcd.setCursor(0, 1);
lcd.print(" Kalkulator");
break;
case 4:
lcd.clear();
lcd.print(" Temperatur");
lcd.setCursor(0, 1);
lcd.print(">Kalkulator");
break;
case 5:
menu = 4;
break;
}
}
void executeAction()
{
switch (menu)
{
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}
void action1()
{
lcd.clear();
lcd.print(">Executing #1");
delay(1500);
}
void action2()
{
lcd.clear();
lcd.print(">Executing #2");
delay(1500);
}
void action3()
{
lcd.clear();
lcd.print(">Executing #3");
delay(1500);
}
void action4()
{
lcd.clear();
lcd.print(num);
lcd.print(op);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(firstNum);
lcd.print(op);
lcd.print(secondNum);
lcd.setCursor(0,1);
lcd.print("=");
lcd.print(result);
firstNumState = true;
if (num != NO_KEY && num == 'C') {
delay(100);
lcd.clear();
lcd.setCursor(0,0);
firstNum = "";
num = "";
op = ' ';
}
delay(1000*1000);
}