Making a super simple calculator

So I'm insanely new to this stuff and I'm currently taking a course on arduino in order to somewhat understand programmering. One of the assignments that I recently got was to first program a 4x3 keypad from scratch. I finished that without having any issues although the next assignment was to build on that code and make a calculator which makes super simple calculations (only +,-,*,/ and no decimals needed). Anybody knows how to do it? Would love all kinds of help!

const int C1 = 2;
const int C2 = 3;
const int C3 = 4;
const int R1 = 5;
const int R2 = 6;
const int R3 = 7;
const int R4 = 8;

void setup() {

pinMode(C1, INPUT_PULLUP);
pinMode(C2, INPUT_PULLUP);
pinMode(C3, INPUT_PULLUP);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
Serial.begin(9600);

}
void loop() {{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, LOW);
if(digitalRead (C1) == LOW){
Serial.print(1);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, LOW);
if(digitalRead (C2) == LOW){
Serial.print(2);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, LOW);
if(digitalRead (C3) == LOW){
Serial.print(3);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, LOW);
digitalWrite(R1, HIGH);
if(digitalRead (C1) == LOW){
Serial.print(4);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, LOW);
digitalWrite(R1, HIGH);
if(digitalRead (C2) == LOW){
Serial.print(5);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, LOW);
digitalWrite(R1, HIGH);
if(digitalRead (C2) == LOW){
Serial.print(5);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R2, LOW);
digitalWrite(R1, HIGH);
if(digitalRead (C3) == LOW){
Serial.print(6);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, LOW);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C1) == LOW){
Serial.print(7);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, LOW);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C2) == LOW){
Serial.print(8);
delay(100);
}
}{
digitalWrite(R4, HIGH);
digitalWrite(R3, LOW);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C3) == LOW){
Serial.print(9);
delay(100);
}
}{
digitalWrite(R4, LOW);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C1) == LOW){
Serial.print('*');
delay(100);
}
}{
digitalWrite(R4, LOW);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C2) == LOW){
Serial.print(0);
delay(100);
}
}{
digitalWrite(R4, LOW);
digitalWrite(R3, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R1, HIGH);
if(digitalRead (C3) == LOW){
Serial.print('#');
delay(100);
}
}

}

I bet that your original code did not have smileys in it. Please autoformat your code by using CTRL-T in the Arduino IDE, and post the autoformatted code using code tags. That will make your code look much nicer and eliminate the smileys and make your code much easier for us to deal with.

use google translate from Norwegian..
This is an RPN calculator

/*
    Dette eksempelet er til 4x4 keypad
    dette knappeoppsettet:
    ---------------
     1   2   3  +
     4   5   6  -
     7   8   9  *
    Clr  0  Ent /
    ---------------
   Utilitie "I2C-scanner" brukt for å finne adressen til LCD-panete
   Funnet 0x20, som er satt for å matche LCD-modulen
   Biblioteket som brukes her finnes i "library manager" og heter
   "LiquidCrystal I2C by Frank de Brabander v.1.1.2"
   kommandoer for panelet finnes i fil 'keywords' som ligger sammen med biblioteket
   Disse finnes:
   init,begin,clear,home,noDisplay,display,noBlink,blink,noCursor,cursor
   scrollDisplayLeft,scrollDisplayRight,leftToRight,rightToLeft
   shiftIncrement,shiftDecrement,noBacklight,backlight,autoscroll,noAutoscroll
   createChar,setCursor,print,blink_on,blink_off,cursor_on,cursor_off
   setBacklight,load_custom_character,printstr
   ****************
   rpn kalkulator EKSEMPEL
   regnestykket (4+3) / (7-2)
   tastes inn på denne måten
   4 Enter 3 + Enter 7 Enter 2 - /

   kjent svakhet nå:
   Tar kun hele tall som input. 
   Du må altså skrive kommatall som helall delt på en 10'er-potens
   f.eks 3.7  kan skrives som 37/10; Trykkene:  "3 7 E 1 0 / "
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// definer et display som skal hete 'lcd'.
LiquidCrystal_I2C lcd (0x20, 16, 2); // adresse,bredde/høyde !! check your display
#define c1  4 // pinner for kolonnene 0..3 (pins 4..7)
#define c4  7 // DISSE ER INPUT (PD4..PD7)
#define r1  8 // pinner for radene 0..3 (pins 8..11
#define r4 11 // definert til input/output
// Krav dersom du skal bruke andre pinner:
// c1-c4 MÅ ligge på rekke og c4 er størst
// r1-r4 ..på rekke med r4 størst
// kun én av out-pinnene kan være aktive om gangen
// fordi: hvis én er 0V og en annen 5V.. og vi trykker
// på flere knapper samtidig: Da kan vi kople sammen de to
// ..som fører til kortslutning og ødelagte I/O-pinner
char Keytop[] = {"/*-+E9630852C741"}; // symbolene vi ønsker
// *********boolean knapp_nede; // skal huske at en knapp er trykket ned
// Oppkopling i dette eksempelet
// Fra venstre (når pinner peker mot deg) -> arduino pins 11..4
// use pins 11..4
float st[5]; // stack med plass til 5 tall (fra st[0] til st[4])
boolean startnytt = true; // brukes slik at vi kan vite når et nytt tall tastes inn
// denne settes true HVER GANG det trykkes noe annet enn siffer 0..9 of settes til false når du trykker et siffer
// vi bruker den for å vite at du starter med å taste inn en ny verdi til regnestykket
char knapp = -1; // skal huske hvilken knapp som er trykket (kan være en byte ?)
// en spesiell kode må avsattes slik at vi kan registrer 'ingen knapp er trykket'
// I eksempelet her brukes vedien -1 (alle tegn er positive verdier)
//**************************

void setup()
{
  // definer ALLE ut-pinner som INN !!
  for (byte rad = r1; rad <= r4; rad++) pinMode(rad, INPUT);
  // definer 4 innpinner  med pullup
  for (byte kol = c1; kol <= c4; kol++) pinMode(kol, INPUT_PULLUP);
  lcd.init(); // initialize the lcd
  lcd.backlight(); // slå på baklyset
  lcd.setCursor(1, 0);
  lcd.print("RPN kalkulator");
  delay(3000);
  clearall(); // nullstill alle tall i stakken
  // Serial.begin(9600); // brukt til testing
}
//***************************
void clearall() // sletter alt  (bør dette ha en egen knapp på tastaturet??)
{
  for (byte i = 0; i < 5; i++) st[i] = 0; // "byte i" blir definert her.. det betyr at denne i'en 'lever' KUN i denne funksjonen, ellers ikke
  startnytt = true;
  vis();
}
//**************************
void flytt_stack_opp() // tallene 'skubbes' opp når vi trykker 'enter'
{
  for (char i = 4; i > 0; i--)  st[i] = st[i - 1];
}
//**************************
void flytt_stack_ned()  // tellene på stacken flyttes ned fullført regneoperasjon
{
  for (char i = 1; i < 4; i++)  st[i] = st[i + 1];
  startnytt = true; // stakk ned skjer alltid etter en regneoperasjon
  vis(); // vis resultat etter regneoperasjon
}
//**************************
char readKey() // returnerer knappekode (-1 hvis ingen knapp)
{
  // scann gjennom radene etter tur
  for (byte rad = r1; rad <= r4; rad++)
  {
    pinMode(rad, OUTPUT); // denne ene raden til ouput og low
    digitalWrite(rad, LOW); // sett lav
    // så sjekker vi alle innlinjene etter tur
    for (byte kol = c1; kol <= c4; kol++)
    {
      if (digitalRead(kol) == LOW) // FUNN !! denne knappen er trykket
      {
        delay(20); // for å hindre 'prell'
        // vent til knappen er oppe igjen..
        while (digitalRead(kol) == LOW) {};
        pinMode(rad, INPUT); // skal unngå å kortslutte utganger
        // plukk ut et tegn fra keytop-strengen
        return (Keytop[(rad - r1) * 4 + kol - c1]);
      }
    }
    pinMode(rad, INPUT); // ferdig med denne rada. 'slå av'
  }
  return -1; // ingen knapp er nede
}
//**************************
void vis() // Viser to tall fra stacken på LCD-panelet
{
  lcd.clear();
  if (st[1] != 0)
  {
    String str = String(st[1],5);
    lcd.setCursor(16 - str.length(),0);
    lcd.print(str);
  }
  String str = String(st[0],5);
  lcd.setCursor(16 - str.length(), 1);
  lcd.print(str);

}
//**********************************

void loop()
{
  knapp = readKey(); // hent et knappetrykk
  if (knapp > 0) // sjekk etter gyldig knapp
  {
   // Serial.write(knapp); // kun ved testing
    if (knapp >= '0' && knapp <= '9') // siffer er trykket ************************
    {
      if (startnytt) // sjekk om vi starter på et nytt tall
      {
        st[0] = 0;
        startnytt = false;
      }
      st[0] = 10.0 * st[0] + knapp - 48; // sjekk ASCII-tabellen for forklaringen på '-48'
      vis();
    }
    else if (knapp == 'E') // Enter-knappen ******************************
    {
      startnytt = true; // fordi vi IKKE skrev et tall
      flytt_stack_opp();
      vis();
    }
    else if (knapp == 'C') // Clear-knappen   ************************
    {
      clearall(); // ..start et nytt regnestykke
    }
    else if (knapp == '+') //  addisjon   ************************
    {
      st[0] = st[1] + st[0];
      flytt_stack_ned();
      startnytt = true;
    }
    else if (knapp == '-') //  substraksjon  ************************
    {
      st[0] = st[1] - st[0];
      flytt_stack_ned();
      startnytt = true;
    }
    else if (knapp == '*') //  multiplikasjon  ************************
    {
      st[0] = st[1] * st[0];
      flytt_stack_ned();
      startnytt = true;
    }
    else if (knapp == '/') //  divisjon  ************************
    {
      st[0] = st[1] / st[0];
      flytt_stack_ned();
      startnytt = true;
    }
  }
}

The first thing that I would do would be to investigate the use of arrays to hold a series of pin numbers and for loops to iterate through them. This will vastly simplify the program and you will learn a lot.

If you do not want to do this, then make your code that reads the keypad into a function that, when called returns the character representing the key pressed, if any. You can then concentrate on reading a series of digits and turning them into a multi digit number (if that is what you want. You don't say) which you can apply mathematical operators to and print the result.

As a matter of interest, does your current assignment preclude you from using a library to read they keypad ?

As a matter of interest, does your current assignment preclude you from using a library to read they keypad ?

Even if it does, there is NO reason to put the keypad reading code in a function.

{There} {is} {also} {NO} {reason} {to} {litter} {your} {code} {with} {useless} {curly} {braces}.

knut_ny:
use google translate from Norwegian..

I don't think we need Google Translate for words like "multiplikasjon".

Even if it does, there is NO reason to put the keypad reading code in a function.

Sorry, but I don't agree. Creating a function to read the keypad and return the value of a key if one is pressed (or special value if none is pressed) would allow the OP to concentrate on on the other aspects of the program and provide an easily tested section of code that could be used in other projects.

UKHeliBob:
Sorry, but I don't agree.

Somehow, the NOT disappeared from my post...

PaulS:
Somehow, the NOT disappeared from my post...

I thought that your reply was odd when I read it ! Now I know why :slight_smile:

phillyB:
So I'm insanely new to this stuff and I'm currently taking a course on arduino in order to somewhat understand programmering. One of the assignments that I recently got was to first program a 4x3 keypad from scratch. I finished that without having any issues although the next assignment was to build on that code and make a calculator which makes super simple calculations (only +,-,*,/ and no decimals needed). Anybody knows how to do it? Would love all kinds of help!

No need to set the four row pins for each column:

const int C1 = 2;
const int C2 = 3;
const int C3 = 4;
const int R1 = 5;
const int R2 = 6;
const int R3 = 7;
const int R4 = 8;
void setup() {
  pinMode(C1, INPUT_PULLUP);
  pinMode(C2, INPUT_PULLUP);
  pinMode(C3, INPUT_PULLUP);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(R3, OUTPUT);
  pinMode(R4, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(R4, HIGH);
  digitalWrite(R3, HIGH);
  digitalWrite(R2, HIGH);
  digitalWrite(R1, LOW);
  if (digitalRead (C1) == LOW) {
    Serial.print(1);
    delay(100);
  }
  if (digitalRead (C2) == LOW) {
    Serial.print(2);
    delay(100);
  }
  if (digitalRead (C3) == LOW) {
    Serial.print(3);
    delay(100);
  }
  digitalWrite(R4, HIGH);
  digitalWrite(R3, HIGH);
  digitalWrite(R2, LOW);
  digitalWrite(R1, HIGH);
  if (digitalRead (C1) == LOW) {
    Serial.print(4);
    delay(100);
  }
  if (digitalRead (C2) == LOW) {
    Serial.print(5);
    delay(100);
  }
  if (digitalRead (C3) == LOW) {
    Serial.print(6);
    delay(100);
  }
  digitalWrite(R4, HIGH);
  digitalWrite(R3, LOW);
  digitalWrite(R2, HIGH);
  digitalWrite(R1, HIGH);
  if (digitalRead (C1) == LOW) {
    Serial.print(7);
    delay(100);
  }
  if (digitalRead (C2) == LOW) {
    Serial.print(8);
    delay(100);
  }
  if (digitalRead (C3) == LOW) {
    Serial.print(9);
    delay(100);
  }
  digitalWrite(R4, LOW);
  digitalWrite(R3, HIGH);
  digitalWrite(R2, HIGH);
  digitalWrite(R1, HIGH);
  if (digitalRead (C1) == LOW) {
    Serial.print('*');
    delay(100);
  }
  if (digitalRead (C2) == LOW) {
    Serial.print(0);
    delay(100);
  }
  if (digitalRead (C3) == LOW) {
    Serial.print('#');
    delay(100);
  }
}

You should take all of that keypad scanning and put it in a function that returns the character value. If no button is pressed, return 0. Get rid of the delays. In loop(), call the function and act on the character if the result is no 0.

I'd not choose to risk short circuit when many keys are held down.