Input on keypad causes the loop to break

Hello everyone,

I am new to Arduino and I am creating a ‘credit card’ payment system using RFID tags and a keypad. My code is attached below and the problem is that whenever I press a button on the keypad, the void loop breaks and the program starts again. I have no idea what is causing this…

Thank you in advance…

#include <Wire.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
};
int nums[] ={};
byte rowPins[ROWS] = {8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 3, A0, A1}; //connect to the column pinouts of the keypad
int decimal =0;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13; 
#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above
char price = 0;
char MoneyLeft = 10;
MFRC522 mfrc522(SS_PIN, RST_PIN); 
String value = "A9 A4 DE 8B";// Create MFRC522 instance
float cost = 0;
int c = 0;
boolean add =false;
int rs = 7;//lcd screen
int en=8;
int d4 = 3;
int d5= 4;
int d6= 5;
int d7 = 6;//lcd screen
int buzzPin = 2;
int buzztime = 500;
int t= 0;
float addition = 0;
const int buzzer =2;
boolean entered[4] = {};
String thirdscan ="";
String lastscan = "";

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String serialnumbers[] = {"A9 A4 DE 8B", "0A FA 82 16"};
String names[] = {"Alex", "Marta"};
float account[] = {10, 20};

void setup() {
 Serial.begin(9600);   // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();      // Init SPI bus
  mfrc522.PCD_Init();   // Init MFRC522
  mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader details
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
 lcd.begin(16,2);
 pinMode(buzzer, OUTPUT);
}

void loop() {
  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
lcd.setCursor(0,0);


  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Show UID on serial monitor
  Serial.print("UID tag :");
  String content= "";
  byte letter;
  
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();


  content.toUpperCase();
  for (c = 0; c <= 1; c++){
       if (content.substring(1) == serialnumbers[c]) //change here the UID of the card/cards that you want to give access
  {

           
        tone(buzzer, 1600);
        delay(100);// ...for 1 sec
        noTone(buzzer);
        lcd.clear();
        if (lastscan != content.substring(1)){
          lcd.print(names[c]);
          lcd.print("'s account:");
          lcd.setCursor(0,1);
          lcd.print(account[c]);
          delay(1500);
          lcd.clear();
          lcd.print("Scan again to");
          lcd.setCursor(0,1);
          lcd.print("buy something...");
          
          }
        else{  
          lcd.clear();
          delay(50);
     Serial.print("How much does this cost");
       lcd.print("Item Cost: ");
       lcd.setCursor(0,1);
int c=0;
    int key=0;
   float price = 0;
   int decimal = 0;
   int z=1;
   boolean add=false;
   for (z=1;z<=4;z++){
    nums[z] = 0;
    entered[z] = false;
   }
  for (int x=1; x<=4; x++){
    int key = keypad.getKey();
    while(key == NO_KEY) {
      key = keypad.getKey();
    }
    if (key >= 48 and key<=57){
      key = key-48;
      nums[x] = key;
      entered[x] = true;
    }
    else{
      if (key==42){
        decimal =x;
      }
      if (key==65){
        add=true;
      }
     }
      
 if (x-decimal==1 and decimal > 0){
  nums[x] = nums[x]/10  ;
 }
 if (x-decimal==2 and decimal > 0){
  nums[x] = nums[x]/100  ;
 }
if (entered[x]){
  Serial.print(key);
}
else{
  if (decimal==x){
  Serial.print(".");
  }
}

  }
  if (decimal==3){
    nums[1] = nums[1]*10;
  }
 int x =1;
   for (x=1;x<=4;x++){
    addition += nums[x];
   }
  Serial.println();  
  Serial.println(price);
        if (add) {
          lcd.clear();
          lcd.print ("How much do");
          lcd.setCursor(0,1);
          lcd.print("you want to add?");
          while (Serial.available() == 0){}
          for (int x=1; x<=4; x++){
    int key = keypad.getKey();
    while(key == NO_KEY) {
      key = keypad.getKey();
    }
    if (key >= 48 and key<=57){
      key = key-48;
      nums[x] = key;
      entered[x] = true;
    }
    else{
      if (key==42){
        decimal =x;
      }
      if (key==65){
        add=true;
      }
     }
      
 if (x-decimal==1 and decimal > 0){
  nums[x] = nums[x]/10  ;
 }
 if (x-decimal==2 and decimal > 0){
  nums[x] = nums[x]/100  ;
 }
if (entered[x]){
  Serial.print(key);
}
else{
  if (decimal==x){
  Serial.print(".");
  }
}

  }
  if (decimal==3){
    nums[1] = nums[1]*10;
  }
 int x =1;
   for (x=1;x<=4;x++){
    addition += nums[x];
   }
          lcd.clear();
          lcd.print("Money added:");
          lcd.setCursor(0,1);
          lcd.print(addition);
          account[c] += addition;
          delay(1500);
          lcd.clear();
          lcd.print("Money in account:");
          lcd.setCursor(0,1);
          lcd.print(account[c]);
          delay(1500);
          lcd.clear();
        }
      else{
        lcd.print(price);
        delay(1500);
        lcd.clear();
      float money = account[c];
      if (money - price >= 0){
      float (money -= price);
      account[c] = (float)money;
    Serial.println();
    Serial.println(money);
    lcd.print("Money left: ");
    lcd.setCursor(0,1);
    lcd.print(money);
    delay(1500);
    lcd.clear();
    lcd.setCursor(4,0);
    lcd.print("Success!");
   }
    else{
      lcd.print("Not enough");
      lcd.setCursor(0,1);
      lcd.print("money in account");
    }
        }
        }
    
    
  }
  }
  thirdscan = lastscan;
  lastscan = content.substring(1);
  content.substring(1) ="";
}
int nums[] ={};  //an array with no space allocated to it
       for (int x = 1; x <= 4; x++)  //an attempt to use elements 1 to 4 of the array
'''
            nums[x] = key;

Even if the array had 4 elements they would be numbered 0 to 3 not 0 to 4

You are writing to memory used by something else in the program, hence the restart

alexoort:
… the void loop breaks and the program starts again…

if ( ! mfrc522.PICC_IsNewCardPresent())
{
return; //<---------------OR this is the cause
}

Hope that helps…