/*
  Arduino | hardware-help
  Keypad calculator
  Zeruxe — 6/16/24 at 7:25 PM

  From this not-so-good example:
  https://www.hackster.io/nolimitcircuit/arduinolator-an-arduino-calculator-b544ff
*/

#include <Keypad.h>
#include <LiquidCrystal.h>

const byte ROWS = 4;
const byte COLS = 4;
const char keys [ROWS] [COLS] = {
  {'1', '2', '3', '+'},
  {'4', '5', '6', '-'},
  {'7', '8', '9', '*'},
  {'C', '0', '=', '/'}
};
const byte rowPins[ROWS] = {23, 25, 27, 29};
const byte colPins[COLS] = {31, 33, 35, 37};

Keypad myKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

boolean presentValue = false;
boolean next = false;
boolean final = false;
String num1, num2;
int answer;
char op;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2); //LCD starts
  lcd.setCursor(0, 0);
  lcd.print("An Arduino"); //All this is text. You can edit it
  lcd.setCursor(0, 1);
  lcd.print("Calculator");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("The");
  lcd.setCursor(0, 1);
  lcd.print("Arduinolator!");
  delay(3000);
  lcd.clear(); //LCD clears, and you can begin using it.
}

void loop() {

  char key = myKeypad.getKey();

  if (key != NO_KEY && (key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9' || key == '0'))
  {
    if (presentValue != true)
    {
      num1 = num1 + key;
      int numLength = num1.length();
      lcd.setCursor(15 - numLength, 0); //to adjust one whitespace for operator
      lcd.print(num1);
    }
    else
    {
      num2 = num2 + key;
      int numLength = num2.length();
      lcd.setCursor(15 - numLength, 1);
      lcd.print(num2);
      final = true;
    }
  }

  else if (presentValue == false && key != NO_KEY && (key == '/' || key == '*' || key == '-' || key == '+'))
  {
    if (presentValue == false)
    {
      presentValue = true;
      op = key;
      lcd.setCursor(15, 0);
      lcd.print(op);
    }
  }

  else if (final == true && key != NO_KEY && key == '=') {
    Serial.println("Equal pressed");
    if (op == '+') {
      answer = num1.toInt() + num2.toInt();
    }
    else if (op == '-') {
      answer = num1.toInt() - num2.toInt();
    }
    else if (op == '*') {
      answer = num1.toInt() * num2.toInt();
    }
    else if (op == '/') {
      answer = num1.toInt() / num2.toInt();
    }
    lcd.clear();
    //lcd.setCursor(0, 0);
    lcd.setCursor(15, 0);
    //lcd.autoscroll();
    lcd.print(answer);
    //lcd.noAutoscroll();
  }
  else if (key != NO_KEY && key == 'C') {
    lcd.clear();
    presentValue = false;
    final = false;
    num1 = "";
    num2 = "";
    answer = 0;
    op = ' ';
  }
}
$abcdeabcde151015202530354045505560fghijfghij