Store GPS data in variable calculation error

First, you have to call "begin" on the GPS serial port.

Then your sketch must wait long enough for the GPS to send characters over that port. The parser will gradually "consume" those characters until the GPS fields are assembled in the Arduino. Each character takes 1ms, and the GPS device typically sends about 150 characters per update (once per second).

This means that you cannot try to get the lat/lon in setup. It isn't inside the Arduino yet.

And that loop structure will not do what you expect. The main loop has a 5-second update rate, and the servo/stepper code will add an additional 1 second of delay.

These delays cause the Arduino input buffer for the GPS port to overflow. (Let's call it "gpsPort" instead of "mySerial", shall we?). Unless your sketch constantly reads the gpsPort, the characters coming from the GPS device will start getting dropped. This prevents the parser from ever getting a complete "sentence" from the GPS device, and it will not be able to provide a lat/lon for you. Not consistently, anyway.

Instead, use the GPS device to "time" your updates to the stepper/servo. A batch of sentences comes from the GPS device at exactly 1 second intervals. When your sketch receives a new batch of sentences, with a new location, that's when you should update the servo/stepper.

You should also consider using something besides SoftwareSerial, because it is very inefficient. It disables interrupts for the entire time that a character is being sent OR received, and it cannot do both at the same time (unlike all the other serial choices). This can interfere with other parts of your sketch, other device communications, or with libraries. This means that receiving one GPS character will prevent the servo/stepper library from handling interrupts. This could cause stuttering or inaccurate positioning.

Read this, then try one of these alternatives:

1) Put the GPS TX on pin 0. You do not have to connect the GPS RX pin, because you never send any configuration commands to it. You will have to disconnect pin 0 every time you want to upload a new sketch over USB. You can still do debug prints to the Serial Monitor window.

2) Put the GPS TX on pin 8 and use AltSoftSerial. This is the best software serial library, but it must be used on that pin. It also disables PWM on pin 10, and it transmits on pin 9. This is a good choice, but you may have to move the servo/stepper to other PWM pins (any pins except 8,9 & 10).

3) Leave the GPS TX on pin 12 and use GitHub - SlashDevin/NeoSWSerial: Efficient alternative to SoftwareSerial with attachInterrupt for RX chars, simultaneous RX & TX. This is almost as good as AltSoftSerial, but it can be used on any two pins. It only supports baud rates 9600, 19200 or 38400.

Here is your sketch, modified to have the suggested loop structure, and to use NeoSWSerial on pin 12/13:

#include <NeoSWSerial.h>
#include <NMEAGPS.h>
#include <Servo.h>
#include <Stepper.h>

const int stepsPerRevolution = 200;  // number of steps per revolution - stepper motor


// initialize the stepper library on pins 2 through 5:
Stepper myStepper(stepsPerRevolution, 2, 3, 4, 5);

int stepCount = 0;         // number of steps the stepper motor has taken

Servo myservo;  // servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;  // variable to store the servo position


NeoSWSerial gpsPort(12, 13);

NMEAGPS gps; // the parser
gps_fix fix; // a structure that holds all the parsed GPS fields


const float pi     = 3.141592654;
const float Re     = 6378.137;
const float h      = 35786;
const float r      = 42164.137;
const float Satlon = 91.5;


void setup() 
{
  Serial.begin(9600);
  gpsPort.begin(9600);

  myservo.attach(30);  // attaches the servo on pin 9 to the servo object
  myStepper.setSpeed(60);
}  


void loop() 
{
  // Check for GPS characters and parse them
  if (gps.available( gpsPort )) {

    // Exactly once per second, a complete GPS fix is ready.
    fix = gps.read();
    gpsdump();
    updateServo();
  }
}


void gpsdump()
{
  if (fix.valid.location) {
    Serial.print( fix.latitude(), 6 );
    Serial.print( ',' );
    Serial.print( fix.longitude(), 6 );
  } else  {
    Serial.print( '?' );
  }
  Serial.println();
}


void updateServo()
{
  if (fix.valid.location) {
    float flat = fix.latitude();
    float flon = fix.longitude();

    float Adeg = (flon - Satlon);
    float Arad = (Adeg*(pi/180));

    float Bdeg = flat;
    float Brad = (Bdeg*(pi/180));


    float y = (acos((cos(Arad))*(cos(Brad))));
    float d = (sqrt(((Re*Re)+(r*r)) - ((2*Re*r)*(cos(y)))));

    float el = (acos ((r/d)*(sin(y))));
    float eldeg = (el*(180/pi));

    float az = (asin (sin(Arad)/sin(y)));
    float azdeg = (az*(180/pi));
    float azStep = (azdeg/1.8);


    if (pos < eldeg){
      myservo.write(eldeg);// servo go for elevation angle
    }
    else if (pos > 90)
    {
      myservo.write(pos);
    }
      

    if  (stepCount < azStep)
    {
      myStepper.step(azStep);
    }
    else if (stepCount > azStep)
    {
      myStepper.step(stepCount);
    }

  }
  
} // servoCalc

This use my NeoGPS library. It is smaller, faster, more accurate and more reliable than all other GPS libraries. There are many examples to show the correct program structure, and it supports many data fields. Even if you don't use it, be sure the read the tips on the Installation and Troubleshooting pages.

Also notice that it does not try to use an invalid location. The GPS device may not know the location, so your sketch should not try to set the servo/stepper positions when you don't have good satellite reception.

AltSoftSerial, NeoSWSerial and NeoGPS are available from the Arduino Library Manager, under the IDE menu Sketch -> Include Library -> Manage Libraries.