Alter.... was ist denn das für ein Code. 
Da sitz ich noch ne Nacht dran...
Was ich mittlerweile verstanden habe sind 5 Push- und 2 Toggle-button.
Dann zwei analoge Eingänge für die Joystickbewegung up/Down Left/right
Interessant ist dann die Verarbeitung.
softApp
ist eine Merkervariable, aber Du machst einen typischen Anfängerfehler. Grundsätzlich: Wenn gezählt wird, wird mit 0 angefangen!
Damit ist dann natürlich alles andere was danach kommt auch zu bearbeiten.
Um Dir mal einen Eindruck zu geben... So sieht derzeit der bearbeitete erste Teil aus.
Vergleich das mal mit Deinem 
#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#ifdef SOFTWARE_SERIAL_AVAILABLE
#include <SoftwareSerial.h>
#endif
// #if USB_HID_KEYS
// #include <usb_hid_keys.h>
// #endif
/**
Modifier masks - used for the first byte in the HID report.
NOTE: The second byte in the report is reserved, 0x00
*/
#define KEY_MOD_LCTRL 0x01
#define KEY_MOD_LSHIFT 0x02
#define KEY_MOD_LALT 0x04
#define KEY_MOD_LMETA 0x08
#define KEY_MOD_RCTRL 0x10
#define KEY_MOD_RSHIFT 0x20
#define KEY_MOD_RALT 0x40
#define KEY_MOD_RMETA 0x80
Adafruit_BluefruitLE_SPI ble(8, 7, 4);
//Factory reset to 0 for no reset, or 1 to factory reset when scketch starts
constexpr byte FACTORYRESET_ENABLE {0};
constexpr int BUFSIZE {128}; // Size of the read buffer for incoming data
/////////////////////////////////////////////////////////
//Choose some setting that may be different on your unit
/////////////////////////////////////////////////////////
//APP LED SEQUENCE OF COLOUR. SWOP THE VALUE OF YOUR COLCOURS ARE WRONG WAY AROUND
constexpr byte ledGREEN {A1};
constexpr byte ledRED {A0};
//PUSH BUTTONS STATE FOR NORMALLY OPEN AND NORMALLY CLOSED
//FOR Normally open buttons keen the state LOW.
//FOR Normally closed buttons change the state to HIGH
constexpr byte pushBtn[] {12, 11, 10, 9, 5};
constexpr byte pushBtnSize {sizeof(pushBtn) / sizeof(pushBtn[0])};
constexpr byte toggleBtn[] {A2, A3};
constexpr byte toggleBtnSize {sizeof(toggleBtn) / sizeof(toggleBtn[0])};
constexpr byte joy[] {A4, A5};
constexpr byte joySize {sizeof(joy) / sizeof(joy[0]};
//TOGGLE SWITCH BUTTONS
const int button6 = A2; // Not used currently, so deactivating it! => Trying to use it now (28.12.) as Time-based App ModeSelect-Button
const int button7 = A3; // <= Joystick Button
const int button8 = A4;
const int button9 = A5;
//APP SWITCH BUTTON
constexpr byte modeSelectPin {6}; // Mode-Switch-Button on PIN-6
byte modeSelectState = 0; // Testing to set Mode-Select via "Taster-Knopf"
//int softApp; //Keep softapp default 0 when starting up
byte softApp = 1; //preset softapp to app 3 when starting up
// For Button-6
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change:
const long interval = 250; // interval at which an App can be selected (milliseconds)
// Joystick: analog readings for positions (l,r,u,d)
int LR;
int UD;
// Joystick: variables for calibration
int LR_neutral;
int UD_neutral;
int mouseClickFlag = 0;
//BleMouse bleMouse;
const int Deadzone = 100;
//BUTTON & TOGGLE FIXED SCROLL SPEED
const int buttonWait = 250;
const int toggleWait = 150;
const int arrowButtonWait = 250;
// COUNTER FOR LOCUS BUTTON ITERATO7
int locusIter;
#define SHORT_PRESS_TIME 1000 // 500 milliseconds
// Variables will change:
bool mb_lastState = LOW; // the previous state from the input pin
bool mb_currentState; // the current reading from the input pin
unsigned long mb_pressedTime = 0;
unsigned long mb_releasedTime = 0;
////////////////////////////////////////////////////////////////////////////////////////////////
void serPrint(const __FlashStringHelper *err)
{
Serial.println(err);
//while (1);
}
////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
//Serial.begin(115200);
Serial.begin(9600);
Serial.println(F("Starting up ..."));
bleINIT();
//Push buttons
for (byte b = 0; b < pushBtnSize; b++)
{ pinMode(pushBtn[b], INPUT_PULLUP); }
//Toggle switch buttons
pinMode(button7, INPUT_PULLUP); // For MouseClick
//pinMode(button8, INPUT);
//pinMode(button9, INPUT);
//Mode LEDs
pinMode(ledGREEN, OUTPUT);
pinMode(ledRED, OUTPUT);
//App rocker switch
pinMode(modeSelect, INPUT_PULLUP);
// Joystick: set neutral positions
LR_neutral = analogRead(button8);
UD_neutral = analogRead(button9);
//ble Mouse Starter
//bleMouse.begin();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
// Serial.print("SoftApp # at startup is: ");
// Serial.println(softApp);
//////////////////////////////////////////////////////////////
// START SOFT APP SELECT LOOP
//////////////////////////////////////////////////////////////
//Start of select softapp 1
if (!digitalRead(modeSelectPin)) // Taste geddrückt?
{
digitalWrite(ledRED, HIGH); //
digitalWrite(ledGREEN, LOW);
//Serial.print(" modeSelect = LOW :: "); Serial.println(modeSelect);
for (byte b = 0; b < pushBtnSize; b++) // frage die tasten ab
{
if (!digitalRead(pushBtn[b])) // Taste gedrückt?
{
softApp = b + 1; // Tastendruck merken
setApp(softApp); // Voreinstellung setzen
}
} // END SOFT APP SELECT LOOP
}
else // Taste nicht gedrückt
{
digitalWrite(ledRED, LOW);
digitalWrite(ledGREEN, HIGH);
//Serial.print(" modeSelect = HIGH :: "); Serial.println(modeSelect);
switch (softApp)
{
case 0:
//Serial.println("You are in softApp: ZERO");
digitalWrite(ledGREEN, HIGH);
delay(300);
digitalWrite(ledGREEN, LOW);
delay(300);
break; //End softapp 0
case 1:
digitalWrite(ledGREEN, HIGH);
if (locusIter >= 10)
{
locusIter = 0;
}
//PUSH BUTTONS
for (byte b = 0; b < pushBtnSize; b++)
{
if (!digitalRead(pushBtn[b]))
{ sendFuncOne(b); }
}
break; //End softapp 1
case 2:
digitalWrite(ledGREEN, HIGH);
digitalWrite(ledRED, LOW);
//PUSH BUTTONS
for (byte b = 0; b < pushBtnSize; b++)
{
if (!digitalRead(pushBtn[b]))
{ sendFuncTwo(b); }
}
break; //End softapp 2
case 3:
digitalWrite(ledGREEN, HIGH);
digitalWrite(ledRED, LOW);
//PUSH BUTTONS
for (byte b = 0; b < pushBtnSize; b++)
{
if (!digitalRead(pushBtn[b]))
{ sendFuncThree(b); }
}
break; //End softapp 3
case 4:
digitalWrite(ledGREEN, HIGH);
digitalWrite(ledRED, LOW);
//PUSH BUTTONS
for (byte b = 0; b < pushBtnSize; b++)
{
if (!digitalRead(pushBtn[b]))
{ sendFuncFour(b); }
}
break; //End softapp 4
case 5:
// 0x7F Keyboard Mute
// 0x80 Keyboard Volume Up
// 0x81 Keyboard Volume Down
digitalWrite(ledGREEN, HIGH);
digitalWrite(ledRED, LOW);
//Serial.println("You are in softApp");
//PUSH BUTTONS
for (byte b = 0; b < pushBtnSize; b++)
{
if (!digitalRead(pushBtn[b]))
{ sendFuncFive(b); }
}
break; //End softapp 5
}
// ******************************************************** START of GLOBAL PART *****************************************************
Alles, was Du jetzt nicht siehst, ist bereits umgeschrieben und ausgelagert.
Deine Push-Button-Auswahl Ausführung ist jeweils runtergekürzt -> Für Ebene 1 hier die komplette Funktion.
void sendFuncOne(const byte btn)
{
digitalWrite(ledGREEN, LOW);
delay(buttonWait);
digitalWrite(ledGREEN, HIGH);
switch (btn)
{
case 0:
Serial.println("Button 1-1");
ble.sendCommandCheckOK("AT+BleHidControlKey=VOLUME+");
break;
case 1:
Serial.println("Button 1-2");
ble.sendCommandCheckOK("AT+BleHidControlKey=VOLUME-");
break;
case 2:
Serial.println("Button 1-3");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00-15-00-00-00-00");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00");
break;
case 3:
Serial.println("Button 1-4");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00-06-00-00-00-00");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00");
break;
case 4:
Serial.println("Button 1-5");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00-07-00-00-00-00");
ble.sendCommandCheckOK("AT+BLEKEYBOARDCODE=00-00");
break;
}
}
Davon hast Du 5 - Wenn ich mit der Auflösung fertig bin, dann werden die 5 Funktionen wieder zusammengefasst und die Auswahl genau anders rum gelöst, damit die Codeduplikate entfallen.
Also alles machbar.
Ich bau weiter kleine Blöcke um zu verstehen, was Du da hast... Und dann wird Dir der Speicher auch reichen.