New to FSM, can someone explain how the flow works? If I use a case scenario in a loop, how is an external change detected and brought back to the loop?
Is all of the code/inputs, etc to be included within the case statements?

Still having a few problems. I have modified my code to include some of the suggestions. You can see that I added some print statements to allow me to monitor execution, but I can't get it to obey, such as print "trigger" when the PIR sensor is HIGH. Anyone available to explain my error(s)? I added a void check() just to bypass the keypad (not connected).

    //////////////////////////// Initialize & Includes //////////////////////////
    #include "SIM900.h"
    #include "sms.h"
    #include "Keypad.h"
    #include <GSM.h>
    SMSGSM sms;
    //To change pins for Software Serial, use the two lines in GSM.cpp.
    int PIR_SensorPin = 2;
    int LED_OutPin = 11; //green
    int Alarm_OutPin = 12; //red
    int alarm_count = 0;
    int switchPIN = 3; // alarm on test
    char keypadPIN;
    int z = 0;
    int i = 0;
    int waitTime = 5000;

    //////////////////////////// Setup Keypad //////////////////////////
    const byte ROWS = 4; //four rows
    const byte COLS = 4; //four columns
    char keys[ROWS][COLS] =
    {
      {
        '1', '2', '3', 'A'
      }
      ,
      {
        '4', '5', '6', 'B'
      }
      ,
      {
        '7', '8', '9', 'C'
      }
      ,
      {
        '*', '0', '#', 'D'
      }
    };
    byte rowPins[ROWS] = {
      6, 7, A2, A3 // row pin# on keypad to Arduino pin#, ie Row Pin #1 goes to Arduino Pin #6, etc.
    }; // connect to the row pinouts of the keypad
    byte colPins[COLS] = {
      3, A0, A1, A4
    }; // connect to the column pinouts of the keypad
    Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    const char PIN[5] = {
      '9', '6', '7', '9', '#'
    }; // PIN number
    char key_input[5] = {
      0, 0, 0, 0, 0
    }; // used for comparison

    //////////////////////////////// Setup ///////////////////////////////////
    void setup() {
      Serial.begin (9600);  // Establish Serial connection;
      pinMode (LED_OutPin, OUTPUT);     // Set pinMode.
      pinMode (Alarm_OutPin, OUTPUT);   // Set pinMode.
      pinMode (PIR_SensorPin, INPUT);   // Set pinMode.
      digitalWrite (LED_OutPin, LOW);   // Set output pins to LOW for start.
      digitalWrite (Alarm_OutPin, LOW); // Set output pins to LOW for start.
      digitalWrite (PIR_SensorPin, LOW);
      Serial.println ("Studio Alarm starting up."); // Serial message that GSM shield is starting up
      if (gsm.begin(4800)) {    // Set GSM shield to recommended 4800 baud rate.
        Serial.println ("Status = Network READY");
        digitalWrite (LED_OutPin, HIGH);
      }
      attachInterrupt (digitalPinToInterrupt (2), trigger, CHANGE); // PIR as interrupt
      // Could make use of the interrupts by checking in the interrupt if the state is "Ready" and
      // then setting the state to "Alarm".
      Serial.println ("System Ready");

      keypadPIN = HIGH;
    }

    //////////////////////////// State Setup //////////////////////////
    enum STATE {
      Ready, //system acknowledges trigger
      Unarmed, //system unarmed via keypad entry setting keypadPIN = LOW
      JustActivated, //PIR-triggered interrupt
      Alarm // confirm system unarmed then goto unarmed state else start alarm
    };
    STATE systemState = Unarmed;
    long timeGettingArmed;

    /////////////////////////// Trigger ///////////////////////////////
    void trigger() {
      systemState = JustActivated;
    }

    //////////////////////////// State Machine //////////////////////////
    void loop() {
      check ();
      switch (systemState) {Serial.println("switch");
        case Ready:
          if (PIR_SensorPin == HIGH) {Serial.println("PIR_Sensor");
            Serial.println("triggered");
            systemState = Alarm;
          } else if (keypadPIN == LOW) {
            systemState = Unarmed;
          }
          break;
        case Unarmed:
          if (keypadPIN == HIGH) {Serial.println("keypadPIN=HIGH");
            // Serial.println("Unarmed");
            timeGettingArmed = millis();Serial.println(timeGettingArmed);
             systemState = JustActivated;
          }
          break;
        case JustActivated:Serial.println("JustActivated");
          if (timeGettingArmed + waitTime < millis()) {
            Serial.println("Ready");
            systemState = Ready;
          }
          break;
        case Alarm:
          if (keypadPIN == LOW) {Serial.println("keypadPIN=LOW");
            systemState = Unarmed;
          } else {
            beep();
          }
          break;
      }
    }

    //////////////////////////// Alarm //////////////////////////
    void beep() {
      Serial.println("at beep");
      // (sms.SendSMS("8656171435", "*** Motion Detected in Studio! ***"));
      Serial.println ("MOTION detected: SMS Sent");
      for (alarm_count = 0; alarm_count <= 5; alarm_count++) { // Cycle outputs if triggered
        digitalWrite (Alarm_OutPin, HIGH); delay (1000); // On/Off/On/Off/Off
        digitalWrite (Alarm_OutPin, LOW); delay (500);
        digitalWrite (LED_OutPin, HIGH); // delay (1000);
        Serial.println (alarm_count);
      }
      systemState = Ready;
    }

    void check() {
      if (switchPIN == HIGH) { 
        keypadPIN = LOW; // Unarmed
      }
      else {
        keypadPIN = HIGH; // Ready/Armed
      }
    }