//Library stuff
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include "MIDIUSB.h"
#include <EEPROM.h>

//Display definitions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN1_ADDRESS 0x3C
#define SCREEN2_ADDRESS 0x3D
#define SCREEN3_ADDRESS 0x3C
#define SCREEN4_ADDRESS 0x3D
#define SCREEN5_ADDRESS 0x3C
Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display3(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);
Adafruit_SSD1306 display4(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);
Adafruit_SSD1306 display5(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire2, OLED_RESET);

//Fader potentiometer inputs
int F1POT = 14;
int F2POT = 15;
int F3POT = 20;
int F4POT = 21;
int F5POT = 22;
//Mix select button inputs
int MIX1BTN = 31;
int MIX2BTN = 32;
int MIX3BTN = 33;
int MIX4BTN = 34;
int MIX5BTN = 35;
int MIX6BTN = 36;
int MIX7BTN = 37;
int MIX8BTN = 38;
//Mute button inputs and LED outputs
int MUTE1BTN = 26;
int MUTE2BTN = 27;
int MUTE3BTN = 28;
int MUTE4BTN = 29;
int MUTE5BTN = 30;
int MUTE1LED = 10;
int MUTE2LED = 11;
int MUTE3LED = 12;
int MUTE4LED = 13;
int MUTE5LED = 39;
//Motor outputs
int M1A = 0;
int M1B = 1;
int M2A = 2;
int M2B = 3;
int M3A = 4;
int M3B = 5;
int M4A = 6;
int M4B = 7;
int M5A = 8;
int M5B = 9;
//Other Inputs/Outputs
int AUXPOT = 23;

//GLOBAL VARIABLES
//DISPLAY LABELS - Replace the text inside the quotes with your custom fader labels. Keep them 7 characters or less otherwise they won't fit properly on the screens.
String Fader1Label = "CH1";
String Fader2Label = "CH2";
String Fader3Label = "CH3";
String Fader4Label = "CH4";
String Fader5Label = "CH5";
//Button press detection for mix select
bool mix1Pressed = false;
unsigned long mix1PressStart = 0;
bool mix2Pressed = false;
unsigned long mix2PressStart = 0;
bool mix3Pressed = false;
unsigned long mix3PressStart = 0;
bool mix4Pressed = false;
unsigned long mix4PressStart = 0;
bool mix5Pressed = false;
unsigned long mix5PressStart = 0;
bool mix6Pressed = false;
unsigned long mix6PressStart = 0;
bool mix7Pressed = false;
unsigned long mix7PressStart = 0;
bool mix8Pressed = false;
unsigned long mix8PressStart = 0;
//PID Status
bool isMoving = false;
//Fader Move Positions
int faderSetPositions[5] = { 0, 0, 0, 0, 0 };
//PID Timeout
bool pidActive = false;
unsigned long pidStartTime = 0;
const unsigned long PID_TIMEOUT = 425;
//Fader Positions (RAW)
int FDR1VAL = 0;
int FDR2VAL = 0;
int FDR3VAL = 0;
int FDR4VAL = 0;
int FDR5VAL = 0;
int AUXPOTVAL = 0;
//Fader Positions (MIDI)
int FDR1MVAL = 0;
int FDR2MVAL = 0;
int FDR3MVAL = 0;
int FDR4MVAL = 0;
int FDR5MVAL = 0;
int AUXPOTMVAL = 0;
int FDR1OVAL = 0;
int FDR2OVAL = 0;
int FDR3OVAL = 0;
int FDR4OVAL = 0;
int FDR5OVAL = 0;
int AUXPOTOVAL = 0;
//Buttons (MIDI)
bool MUTE1PState = false;
bool MUTE2PState = false;
bool MUTE3PState = false;
bool MUTE4PState = false;
bool MUTE5PState = false;
byte note = 36;
byte midiCH = 1;
byte cc = 1;
//Global channel data
bool c1Mute = false;
int c1Val = 0;
bool c2Mute = false;
int c2Val = 0;
bool c3Mute = false;
int c3Val = 0;
bool c4Mute = false;
int c4Val = 0;
bool c5Mute = false;
int c5Val = 0;
bool c1OMute = false;
int c1OVal = 0;
bool c2OMute = false;
int c2OVal = 0;
bool c3OMute = false;
int c3OVal = 0;
bool c4OMute = false;
int c4OVal = 0;
bool c5OMute = false;
int c5OVal = 0;
//PID Control
unsigned long lastPID = 0;
const int TOLERANCE = 1;
const int MIN_PWM = 75;
float integral1 = 0;
float lastError1 = 0;
float integral2 = 0;
float lastError2 = 0;
float integral3 = 0;
float lastError3 = 0;
float integral4 = 0;
float lastError4 = 0;
float integral5 = 0;
float lastError5 = 0;
// PID Gains
float Kp = 8.0;
float Ki = 0.02;
float Kd = 0.11;
//Other
bool allUpdate[5] = { true, true, true, true, true };


void setup() {
  //OLED Display Setup
  if (!display1.begin(SSD1306_SWITCHCAPVCC, SCREEN1_ADDRESS)) {
    for (;;)
      ;
  }
  if (!display2.begin(SSD1306_SWITCHCAPVCC, SCREEN2_ADDRESS)) {
    for (;;)
      ;
  }
  if (!display3.begin(SSD1306_SWITCHCAPVCC, SCREEN3_ADDRESS)) {
    for (;;)
      ;
  }
  if (!display4.begin(SSD1306_SWITCHCAPVCC, SCREEN4_ADDRESS)) {
    for (;;)
      ;
  }
  if (!display5.begin(SSD1306_SWITCHCAPVCC, SCREEN5_ADDRESS)) {
    for (;;)
      ;
  }
  display1.clearDisplay();
  display2.clearDisplay();
  display3.clearDisplay();
  display4.clearDisplay();
  display5.clearDisplay();
  display1.display();
  display2.display();
  display3.display();
  display4.display();
  display5.display();

  //PinMode Setup
  //Motor Outputs
  for (int i = 0; i < 10; i++) {
    pinMode(i, OUTPUT);
    analogWriteFrequency(i, 20000);
  }
  //Fader Inputs + AUXPOT
  pinMode(F1POT, INPUT);
  pinMode(F2POT, INPUT);
  pinMode(F3POT, INPUT);
  pinMode(F4POT, INPUT);
  pinMode(F5POT, INPUT);
  pinMode(AUXPOT, INPUT);
  //Mix Buttons
  pinMode(MIX1BTN, INPUT);
  pinMode(MIX2BTN, INPUT);
  pinMode(MIX3BTN, INPUT);
  pinMode(MIX4BTN, INPUT);
  pinMode(MIX5BTN, INPUT);
  pinMode(MIX6BTN, INPUT);
  pinMode(MIX7BTN, INPUT);
  pinMode(MIX8BTN, INPUT);
  //Mute Button Inputs
  pinMode(MUTE1BTN, INPUT);
  pinMode(MUTE2BTN, INPUT);
  pinMode(MUTE3BTN, INPUT);
  pinMode(MUTE4BTN, INPUT);
  pinMode(MUTE5BTN, INPUT);
  //Mute Button LEDs
  pinMode(MUTE1LED, OUTPUT);
  pinMode(MUTE2LED, OUTPUT);
  pinMode(MUTE3LED, OUTPUT);
  pinMode(MUTE4LED, OUTPUT);
  pinMode(MUTE5LED, OUTPUT);

  //System
  analogReadResolution(10);
  normalDisplay(allUpdate);

  //Debug
  Serial.begin(9600);
}

void loop() {
  //Updates fader position data constantly
  getFaderRAWData();
  //Handles saving and recalling of mixes
  bool pressed = digitalRead(MIX1BTN);
  if (pressed && !mix1Pressed) {
    // Button just pressed
    mix1Pressed = true;
    mix1PressStart = millis();
  }
  if (!pressed && mix1Pressed) {
    // Button just released
    unsigned long duration = millis() - mix1PressStart;
    if (duration > 1200) {
      storePreset(1);
      displayStoreScreen(1);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(1);
    }
    mix1Pressed = false;
  }
  bool pressed2 = digitalRead(MIX2BTN);
  if (pressed2 && !mix2Pressed) {
    // Button just pressed
    mix2Pressed = true;
    mix2PressStart = millis();
  }
  if (!pressed2 && mix2Pressed) {
    // Button just released
    unsigned long duration = millis() - mix2PressStart;
    if (duration > 1200) {
      storePreset(2);
      displayStoreScreen(2);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(2);
    }
    mix2Pressed = false;
  }
  bool pressed3 = digitalRead(MIX3BTN);
  if (pressed3 && !mix3Pressed) {
    // Button just pressed
    mix3Pressed = true;
    mix3PressStart = millis();
  }
  if (!pressed3 && mix3Pressed) {
    // Button just released
    unsigned long duration = millis() - mix3PressStart;
    if (duration > 1200) {
      storePreset(3);
      displayStoreScreen(3);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(3);
    }
    mix3Pressed = false;
  }
  bool pressed4 = digitalRead(MIX4BTN);
  if (pressed4 && !mix4Pressed) {
    // Button just pressed
    mix4Pressed = true;
    mix4PressStart = millis();
  }
  if (!pressed4 && mix4Pressed) {
    // Button just released
    unsigned long duration = millis() - mix4PressStart;
    if (duration > 1200) {
      storePreset(4);
      displayStoreScreen(4);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(4);
    }
    mix4Pressed = false;
  }
  bool pressed5 = digitalRead(MIX5BTN);
  if (pressed5 && !mix5Pressed) {
    // Button just pressed
    mix5Pressed = true;
    mix5PressStart = millis();
  }
  if (!pressed5 && mix5Pressed) {
    // Button just released
    unsigned long duration = millis() - mix5PressStart;
    if (duration > 1200) {
      storePreset(5);
      displayStoreScreen(5);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(5);
    }
    mix5Pressed = false;
  }
  bool pressed6 = digitalRead(MIX6BTN);
  if (pressed6 && !mix6Pressed) {
    // Button just pressed
    mix6Pressed = true;
    mix6PressStart = millis();
  }
  if (!pressed6 && mix6Pressed) {
    // Button just released
    unsigned long duration = millis() - mix6PressStart;
    if (duration > 1200) {
      storePreset(6);
      displayStoreScreen(6);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(6);
    }
    mix6Pressed = false;
  }
  bool pressed7 = digitalRead(MIX7BTN);
  if (pressed7 && !mix7Pressed) {
    // Button just pressed
    mix7Pressed = true;
    mix7PressStart = millis();
  }
  if (!pressed7 && mix7Pressed) {
    // Button just released
    unsigned long duration = millis() - mix7PressStart;
    if (duration > 1200) {
      storePreset(7);
      displayStoreScreen(7);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(7);
    }
    mix7Pressed = false;
  }
  bool pressed8 = digitalRead(MIX8BTN);
  if (pressed8 && !mix8Pressed) {
    // Button just pressed
    mix8Pressed = true;
    mix8PressStart = millis();
  }
  if (!pressed8 && mix8Pressed) {
    // Button just released
    unsigned long duration = millis() - mix8PressStart;
    if (duration > 1200) {
      storePreset(8);
      displayStoreScreen(8);
      delay(1000);
      normalDisplay(allUpdate);
    } else if (duration > 20) {
      recallPreset(8);
    }
    mix8Pressed = false;
  }

  //Mute buttons
  if ((digitalRead(MUTE1BTN) == HIGH) && (MUTE1PState == false)) {
    noteOn(midiCH, note + 1, 127);
    MidiUSB.flush();
    digitalWrite(MUTE1LED, HIGH);
    c1Mute = true;
    MUTE1PState = true;
  } else if (digitalRead(MUTE1BTN) == LOW && (MUTE1PState == true)) {
    noteOn(midiCH, note + 1, 127);
    MidiUSB.flush();
    digitalWrite(MUTE1LED, LOW);
    c1Mute = false;
    MUTE1PState = false;
  }
  if ((digitalRead(MUTE2BTN) == HIGH) && (MUTE2PState == false)) {
    noteOn(midiCH, note + 2, 127);
    MidiUSB.flush();
    digitalWrite(MUTE2LED, HIGH);
    c2Mute = true;
    MUTE2PState = true;
  } else if (digitalRead(MUTE2BTN) == LOW && (MUTE2PState == true)) {
    noteOn(midiCH, note + 2, 127);
    MidiUSB.flush();
    digitalWrite(MUTE2LED, LOW);
    c2Mute = false;
    MUTE2PState = false;
  }
  if ((digitalRead(MUTE3BTN) == HIGH) && (MUTE3PState == false)) {
    noteOn(midiCH, note + 3, 127);
    MidiUSB.flush();
    digitalWrite(MUTE3LED, HIGH);
    c3Mute = true;
    MUTE3PState = true;
  } else if (digitalRead(MUTE3BTN) == LOW && (MUTE3PState == true)) {
    noteOn(midiCH, note + 3, 127);
    MidiUSB.flush();
    digitalWrite(MUTE3LED, LOW);
    c3Mute = false;
    MUTE3PState = false;
  }
  if ((digitalRead(MUTE4BTN) == HIGH) && (MUTE4PState == false)) {
    noteOn(midiCH, note + 4, 127);
    MidiUSB.flush();
    digitalWrite(MUTE4LED, HIGH);
    c4Mute = true;
    MUTE4PState = true;
  } else if (digitalRead(MUTE4BTN) == LOW && (MUTE4PState == true)) {
    noteOn(midiCH, note + 4, 127);
    MidiUSB.flush();
    digitalWrite(MUTE4LED, LOW);
    c4Mute = false;
    MUTE4PState = false;
  }
  if ((digitalRead(MUTE5BTN) == HIGH) && (MUTE5PState == false)) {
    noteOn(midiCH, note + 5, 127);
    MidiUSB.flush();
    digitalWrite(MUTE5LED, HIGH);
    c5Mute = true;
    MUTE5PState = true;
  } else if (digitalRead(MUTE5BTN) == LOW && (MUTE5PState == true)) {
    noteOn(midiCH, note + 5, 127);
    MidiUSB.flush();
    digitalWrite(MUTE5LED, LOW);
    c5Mute = false;
    MUTE5PState = false;
  }

  //Gets MIDI data from faders constantly WHEN PID isn't active
  if (isMoving == false) {
    getFaderMIDIData();
  }

  //Sends MIDI data if change is detected and PID isn't active
  if (isMoving == false) {
    if (FDR1MVAL != FDR1OVAL) {
      sendFaderData(1);
    }
    if (FDR2MVAL != FDR2OVAL) {
      sendFaderData(2);
    }
    if (FDR3MVAL != FDR3OVAL) {
      sendFaderData(3);
    }
    if (FDR4MVAL != FDR4OVAL) {
      sendFaderData(4);
    }
    if (FDR5MVAL != FDR5OVAL) {
      sendFaderData(5);
    }
    if (AUXPOTMVAL != AUXPOTOVAL) {
      sendFaderData(6);
    }
  }

  //Calculates channel values for displays
  c1Val = constrain(map(FDR1MVAL, 0, 127, -1, 101), 0, 100);
  c2Val = constrain(map(FDR2MVAL, 0, 127, -1, 101), 0, 100);
  c3Val = constrain(map(FDR3MVAL, 0, 127, -1, 101), 0, 100);
  c4Val = constrain(map(FDR4MVAL, 0, 127, -1, 101), 0, 100);
  c5Val = constrain(map(FDR5MVAL, 0, 127, -1, 101), 0, 100);

  //Displays if the menus have changed
  if ((c1Val != c1OVal) or (c2Val != c2OVal) or (c3Val != c3OVal) or (c4Val != c4OVal) or (c5Val != c5OVal) or (c1OMute != c1Mute) or (c2OMute != c2Mute) or (c3OMute != c3Mute) or (c4OMute != c4Mute) or (c5OMute != c5Mute)) {
    if (isMoving == false) {
      bool toUpdate[5] = { false, false, false, false, false };
      if ((c1Val != c1OVal) or (c1OMute != c1Mute)) {
        toUpdate[0] = true;
      }
      if ((c2Val != c2OVal) or (c2OMute != c2Mute)) {
        toUpdate[1] = true;
      }
      if ((c3Val != c3OVal) or (c3OMute != c3Mute)) {
        toUpdate[2] = true;
      }
      if ((c4Val != c4OVal) or (c4OMute != c4Mute)) {
        toUpdate[3] = true;
      }
      if ((c5Val != c5OVal) or (c5OMute != c5Mute)) {
        toUpdate[4] = true;
      }
      normalDisplay(toUpdate);
      c1OVal = c1Val;
      c2OVal = c2Val;
      c3OVal = c3Val;
      c4OVal = c4Val;
      c5OVal = c5Val;
      c1OMute = c1Mute;
      c2OMute = c2Mute;
      c3OMute = c3Mute;
      c4OMute = c4Mute;
      c5OMute = c5Mute;
    }
  }

  //Moves the faders if movement is needed
  if (isMoving == true) {
    bool done = moveFaders(faderSetPositions);
    if (done == true) {
      isMoving = false;
    }
  }
}

//Stores a preset for fader positions to EEPROM so that the saved preset persists after a power cycle.
void storePreset(int presetNumb) {
  getFaderRAWData();
  //Stores to correct space in EEPROM. Addresses iterate by 4 because each address space represents 8 bits and these integer values require 32 bits.
  switch (presetNumb) {
    case 1:
      {
        EEPROM.put(0, (1023 - FDR1VAL));
        EEPROM.put(4, (1023 - FDR2VAL));
        EEPROM.put(8, (1023 - FDR3VAL));
        EEPROM.put(12, (1023 - FDR4VAL));
        EEPROM.put(16, (1023 - FDR5VAL));
        break;
      }
    case 2:
      {
        EEPROM.put(20, (1023 - FDR1VAL));
        EEPROM.put(24, (1023 - FDR2VAL));
        EEPROM.put(28, (1023 - FDR3VAL));
        EEPROM.put(32, (1023 - FDR4VAL));
        EEPROM.put(36, (1023 - FDR5VAL));
        break;
      }
    case 3:
      {
        EEPROM.put(40, (1023 - FDR1VAL));
        EEPROM.put(44, (1023 - FDR2VAL));
        EEPROM.put(48, (1023 - FDR3VAL));
        EEPROM.put(52, (1023 - FDR4VAL));
        EEPROM.put(56, (1023 - FDR5VAL));
        break;
      }
    case 4:
      {
        EEPROM.put(60, (1023 - FDR1VAL));
        EEPROM.put(64, (1023 - FDR2VAL));
        EEPROM.put(68, (1023 - FDR3VAL));
        EEPROM.put(72, (1023 - FDR4VAL));
        EEPROM.put(76, (1023 - FDR5VAL));
        break;
      }
    case 5:
      {
        EEPROM.put(80, (1023 - FDR1VAL));
        EEPROM.put(84, (1023 - FDR2VAL));
        EEPROM.put(88, (1023 - FDR3VAL));
        EEPROM.put(92, (1023 - FDR4VAL));
        EEPROM.put(96, (1023 - FDR5VAL));
        break;
      }
    case 6:
      {
        EEPROM.put(100, (1023 - FDR1VAL));
        EEPROM.put(104, (1023 - FDR2VAL));
        EEPROM.put(108, (1023 - FDR3VAL));
        EEPROM.put(112, (1023 - FDR4VAL));
        EEPROM.put(116, (1023 - FDR5VAL));
        break;
      }
    case 7:
      {
        EEPROM.put(120, (1023 - FDR1VAL));
        EEPROM.put(124, (1023 - FDR2VAL));
        EEPROM.put(128, (1023 - FDR3VAL));
        EEPROM.put(132, (1023 - FDR4VAL));
        EEPROM.put(136, (1023 - FDR5VAL));
        break;
      }
    case 8:
      {
        EEPROM.put(140, (1023 - FDR1VAL));
        EEPROM.put(144, (1023 - FDR2VAL));
        EEPROM.put(148, (1023 - FDR3VAL));
        EEPROM.put(152, (1023 - FDR4VAL));
        EEPROM.put(156, (1023 - FDR5VAL));
        break;
      }
  }
}

//Recalls selected preset from EEPROM
void recallPreset(int presetNumb) {
  switch (presetNumb) {
    case 1:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get((i * 4), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 2:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 20), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 3:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 40), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 4:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 60), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 5:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 80), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 6:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 100), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 7:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 120), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
    case 8:
      {
        for (int i = 0; i < 5; i++) {
          EEPROM.get(((i * 4) + 140), faderSetPositions[i]);
        }
        isMoving = true;
        pidActive = true;
        lastPID = micros();
        FDR1MVAL = constrain(map((faderSetPositions[0] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR2MVAL = constrain(map((faderSetPositions[1] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR3MVAL = constrain(map((faderSetPositions[2] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR4MVAL = constrain(map((faderSetPositions[3] + 1023), 1023, 0, -2, 129), 0, 127);
        FDR5MVAL = constrain(map((faderSetPositions[4] + 1023), 1023, 0, -2, 129), 0, 127);
        forceSendFaderData();
        pidStartTime = millis();
        break;
      }
  }
}

bool moveFaders(int faderPositions[]) {
  unsigned long now = micros();
  if (now - lastPID < 500) return false;
  float dt = (now - lastPID) / 1e6;
  lastPID = now;
  int pos1 = 1023 - analogRead(F1POT);
  int pos2 = 1023 - analogRead(F2POT);
  int pos3 = 1023 - analogRead(F3POT);
  int pos4 = 1023 - analogRead(F4POT);
  int pos5 = 1023 - analogRead(F5POT);
  static int filteredPos1 = pos1;
  static int filteredPos2 = pos2;
  static int filteredPos3 = pos3;
  static int filteredPos4 = pos4;
  static int filteredPos5 = pos5;
  filteredPos1 = (filteredPos1 * 3 + pos1) / 4;
  filteredPos2 = (filteredPos2 * 3 + pos2) / 4;
  filteredPos3 = (filteredPos3 * 3 + pos3) / 4;
  filteredPos4 = (filteredPos4 * 3 + pos4) / 4;
  filteredPos5 = (filteredPos5 * 3 + pos5) / 4;
  int error1 = faderPositions[0] - filteredPos1;
  int error2 = faderPositions[1] - filteredPos2;
  int error3 = faderPositions[2] - filteredPos3;
  int error4 = faderPositions[3] - filteredPos4;
  int error5 = faderPositions[4] - filteredPos5;

  if (abs(error1) <= TOLERANCE) {
    stopMotor(1);
    integral1 = 0;
    lastError1 = error1;
  }
  if (abs(error2) <= TOLERANCE) {
    stopMotor(2);
    integral2 = 0;
    lastError2 = error2;
  }
  if (abs(error3) <= TOLERANCE) {
    stopMotor(3);
    integral3 = 0;
    lastError3 = error3;
  }
  if (abs(error4) <= TOLERANCE) {
    stopMotor(4);
    integral4 = 0;
    lastError4 = error4;
  }
  if (abs(error5) <= TOLERANCE) {
    stopMotor(5);
    integral5 = 0;
    lastError5 = error5;
  }

  integral1 += error1 * dt;
  float derivative1 = (error1 - lastError1) / dt;
  lastError1 = error1;
  integral2 += error2 * dt;
  float derivative2 = (error2 - lastError2) / dt;
  lastError2 = error2;
  integral3 += error3 * dt;
  float derivative3 = (error3 - lastError3) / dt;
  lastError3 = error3;
  integral4 += error4 * dt;
  float derivative4 = (error4 - lastError4) / dt;
  lastError4 = error4;
  integral5 += error5 * dt;
  float derivative5 = (error5 - lastError5) / dt;
  lastError5 = error5;

  float output1 = Kp * error1 + Ki * integral1 + Kd * derivative1;
  float output2 = Kp * error2 + Ki * integral2 + Kd * derivative2;
  float output3 = Kp * error3 + Ki * integral3 + Kd * derivative3;
  float output4 = Kp * error4 + Ki * integral4 + Kd * derivative4;
  float output5 = Kp * error5 + Ki * integral5 + Kd * derivative5;

  int pwm1 = constrain(abs(output1), 0, 255);
  int pwm2 = constrain(abs(output2), 0, 255);
  int pwm3 = constrain(abs(output3), 0, 255);
  int pwm4 = constrain(abs(output4), 0, 255);
  int pwm5 = constrain(abs(output5), 0, 255);

  if (pwm1 < MIN_PWM) pwm1 = MIN_PWM;
  if (pwm2 < MIN_PWM) pwm2 = MIN_PWM;
  if (pwm3 < MIN_PWM) pwm3 = MIN_PWM;
  if (pwm4 < MIN_PWM) pwm4 = MIN_PWM;
  if (pwm5 < MIN_PWM) pwm5 = MIN_PWM;

  if (output1 > 0) {
    analogWrite(M1A, pwm1);
    analogWrite(M1B, 0);
  } else {
    analogWrite(M1A, 0);
    analogWrite(M1B, pwm1);
  }
  if (output2 > 0) {
    analogWrite(M2A, pwm2);
    analogWrite(M2B, 0);
  } else {
    analogWrite(M2A, 0);
    analogWrite(M2B, pwm2);
  }
  if (output3 > 0) {
    analogWrite(M3A, pwm3);
    analogWrite(M3B, 0);
  } else {
    analogWrite(M3A, 0);
    analogWrite(M3B, pwm3);
  }
  if (output4 > 0) {
    analogWrite(M4A, pwm4);
    analogWrite(M4B, 0);
  } else {
    analogWrite(M4A, 0);
    analogWrite(M4B, pwm4);
  }
  if (output5 > 0) {
    analogWrite(M5A, pwm5);
    analogWrite(M5B, 0);
  } else {
    analogWrite(M5A, 0);
    analogWrite(M5B, pwm5);
  }

  bool allDone = abs(error1) <= TOLERANCE && abs(error2) <= TOLERANCE && abs(error3) <= TOLERANCE && abs(error4) <= TOLERANCE && abs(error5) <= TOLERANCE;

  if (allDone || (millis() - pidStartTime > PID_TIMEOUT)) {
    stopMotor(1);
    stopMotor(2);
    stopMotor(3);
    stopMotor(4);
    stopMotor(5);
    pidActive = false;
    return true;
  }
  return false;
}


void getFaderRAWData() {
  //Gets fader values and keeps them raw
  FDR1VAL = analogRead(F1POT);
  FDR2VAL = analogRead(F2POT);
  FDR3VAL = analogRead(F3POT);
  FDR4VAL = analogRead(F4POT);
  FDR5VAL = analogRead(F5POT);
  AUXPOTVAL = analogRead(AUXPOT);
}

void stopMotor(int motorNumb) {
  switch (motorNumb) {
    case 1:
      {
        analogWrite(M1A, 0);
        analogWrite(M1B, 0);
        break;
      }
    case 2:
      {
        analogWrite(M2A, 0);
        analogWrite(M2B, 0);
        break;
      }
    case 3:
      {
        analogWrite(M3A, 0);
        analogWrite(M3B, 0);
        break;
      }
    case 4:
      {
        analogWrite(M4A, 0);
        analogWrite(M4B, 0);
        break;
      }
    case 5:
      {
        analogWrite(M5A, 0);
        analogWrite(M5B, 0);
        break;
      }
  }
}

void sendFaderData(int FaderNumber) {
  getFaderMIDIData();
  switch (FaderNumber) {
    case 1:
      {
        midiEventPacket_t event = { 0x0B, 0xB0 | midiCH, 1, FDR1MVAL };
        MidiUSB.sendMIDI(event);
        MidiUSB.flush();
        FDR1OVAL = FDR1MVAL;
        break;
      }
    case 2:
      {
        midiEventPacket_t event1 = { 0x0B, 0xB0 | midiCH, 2, FDR2MVAL };
        MidiUSB.sendMIDI(event1);
        MidiUSB.flush();
        FDR2OVAL = FDR2MVAL;
        break;
      }
    case 3:
      {
        midiEventPacket_t event2 = { 0x0B, 0xB0 | midiCH, 3, FDR3MVAL };
        MidiUSB.sendMIDI(event2);
        MidiUSB.flush();
        FDR3OVAL = FDR3MVAL;
        break;
      }
    case 4:
      {
        midiEventPacket_t event3 = { 0x0B, 0xB0 | midiCH, 4, FDR4MVAL };
        MidiUSB.sendMIDI(event3);
        MidiUSB.flush();
        FDR4OVAL = FDR4MVAL;
        break;
      }
    case 5:
      {
        midiEventPacket_t event4 = { 0x0B, 0xB0 | midiCH, 5, FDR5MVAL };
        MidiUSB.sendMIDI(event4);
        MidiUSB.flush();
        FDR5OVAL = FDR5MVAL;
        break;
      }
    case 6:
      {
        midiEventPacket_t event5 = { 0x0B, 0xB0 | midiCH, 6, AUXPOTMVAL };
        MidiUSB.sendMIDI(event5);
        MidiUSB.flush();
        AUXPOTOVAL = AUXPOTMVAL;
        break;
      }
  }
}

void forceSendFaderData() {
  midiEventPacket_t event = { 0x0B, 0xB0 | midiCH, 1, FDR1MVAL };
  MidiUSB.sendMIDI(event);
  MidiUSB.flush();
  FDR1OVAL = FDR1MVAL;
  delay(2);
  midiEventPacket_t event1 = { 0x0B, 0xB0 | midiCH, 2, FDR2MVAL };
  MidiUSB.sendMIDI(event1);
  MidiUSB.flush();
  FDR2OVAL = FDR2MVAL;
  delay(2);
  midiEventPacket_t event2 = { 0x0B, 0xB0 | midiCH, 3, FDR3MVAL };
  MidiUSB.sendMIDI(event2);
  MidiUSB.flush();
  FDR3OVAL = FDR3MVAL;
  delay(2);
  midiEventPacket_t event3 = { 0x0B, 0xB0 | midiCH, 4, FDR4MVAL };
  MidiUSB.sendMIDI(event3);
  MidiUSB.flush();
  FDR4OVAL = FDR4MVAL;
  delay(2);
  midiEventPacket_t event4 = { 0x0B, 0xB0 | midiCH, 5, FDR5MVAL };
  MidiUSB.sendMIDI(event4);
  MidiUSB.flush();
  FDR5OVAL = FDR5MVAL;
  delay(2);
}

void getFaderMIDIData() {
  //Gets fader values and maps them to a value that MIDI can use
  if ((abs((constrain(map(analogRead(F1POT), 1023, 0, -2, 129), 0, 127) - FDR1OVAL))) != 1) {
    FDR1MVAL = constrain(map(analogRead(F1POT), 1023, 0, -2, 129), 0, 127);
  } else {
    FDR1MVAL = FDR1MVAL;
  }
  if ((abs((constrain(map(analogRead(F2POT), 1023, 0, -2, 129), 0, 127) - FDR1OVAL))) != 1) {
    FDR2MVAL = constrain(map(analogRead(F2POT), 1023, 0, -2, 129), 0, 127);
  } else {
    FDR2MVAL = FDR2MVAL;
  }
  if ((abs((constrain(map(analogRead(F3POT), 1023, 0, -2, 129), 0, 127) - FDR1OVAL))) != 1) {
    FDR3MVAL = constrain(map(analogRead(F3POT), 1023, 0, -2, 129), 0, 127);
  } else {
    FDR3MVAL = FDR3MVAL;
  }
  if ((abs((constrain(map(analogRead(F4POT), 1023, 0, -2, 129), 0, 127) - FDR1OVAL))) != 1) {
    FDR4MVAL = constrain(map(analogRead(F4POT), 1023, 0, -2, 129), 0, 127);
  } else {
    FDR4MVAL = FDR4MVAL;
  }
  if ((abs((constrain(map(analogRead(F5POT), 1023, 0, -2, 129), 0, 127) - FDR1OVAL))) != 1) {
    FDR5MVAL = constrain(map(analogRead(F5POT), 1023, 0, -2, 129), 0, 127);
  } else {
    FDR5MVAL = FDR5MVAL;
  }
  AUXPOTMVAL = constrain(map(analogRead(AUXPOT), 1023, 0, -2, 129), 0, 127);
}

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = { 0x09, 0x90 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = { 0x08, 0x80 | channel, pitch, velocity };
  MidiUSB.sendMIDI(noteOff);
}

void normalDisplay(bool updates[]) {
  if (updates[0] == true) {
    display1.clearDisplay();
    display1.setTextColor(SSD1306_WHITE);
    display1.setTextSize(3);
    display1.setCursor(0, 0);
    display1.println(Fader1Label);
    display1.setTextSize(2);
    if (c1Mute == false) {
      display1.println("Unmuted");
    } else if (c1Mute == true) {
      display1.println("Muted");
    }
    display1.print(c1Val);
    display1.println("%");
    display1.display();
  }
  if (updates[1] == true) {
    display2.clearDisplay();
    display2.setTextColor(SSD1306_WHITE);
    display2.setTextSize(3);
    display2.setCursor(0, 0);
    display2.println(Fader2Label);
    display2.setTextSize(2);
    if (c2Mute == false) {
      display2.println("Unmuted");
    } else if (c2Mute == true) {
      display2.println("Muted");
    }
    display2.print(c2Val);
    display2.println("%");
    display2.display();
  }
  if (updates[2] == true) {
    display3.clearDisplay();
    display3.setTextColor(SSD1306_WHITE);
    display3.setTextSize(3);
    display3.setCursor(0, 0);
    display3.println(Fader3Label);
    display3.setTextSize(2);
    if (c3Mute == false) {
      display3.println("Unmuted");
    } else if (c3Mute == true) {
      display3.println("Muted");
    }
    display3.print(c3Val);
    display3.println("%");
    display3.display();
  }
  if (updates[3] == true) {
    display4.clearDisplay();
    display4.setTextColor(SSD1306_WHITE);
    display4.setTextSize(3);
    display4.setCursor(0, 0);
    display4.println(Fader4Label);
    display4.setTextSize(2);
    if (c4Mute == false) {
      display4.println("Unmuted");
    } else if (c4Mute == true) {
      display4.println("Muted");
    }
    display4.print(c4Val);
    display4.println("%");
    display4.display();
  }
  if (updates[4] == true) {
    display5.clearDisplay();
    display5.setTextColor(SSD1306_WHITE);
    display5.setTextSize(3);
    display5.setCursor(0, 0);
    display5.println(Fader5Label);
    display5.setTextSize(2);
    if (c5Mute == false) {
      display5.println("Unmuted");
    } else if (c5Mute == true) {
      display5.println("Muted");
    }
    display5.print(c5Val);
    display5.println("%");
    display5.display();
  }
}

void displayStoreScreen(int screen) {
  switch (screen) {
    case 1:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("1 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("1 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("1 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("1 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("1 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 2:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("2 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("2 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("2 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("2 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("2 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 3:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("3 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("3 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("3 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("3 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("3 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 4:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("4 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("4 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("4 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("4 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("4 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 5:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("5 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("5 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("5 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("5 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("5 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 6:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("6 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("6 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("6 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("6 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("6 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 7:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("7 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("7 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("7 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("7 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("7 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
    case 8:
      {
        display1.clearDisplay();
        display2.clearDisplay();
        display3.clearDisplay();
        display4.clearDisplay();
        display5.clearDisplay();
        display1.setTextColor(SSD1306_WHITE);
        display1.setCursor(0, 0);
        display1.setTextSize(3);
        display1.println("Preset");
        display1.println("8 Store");
        display2.setTextColor(SSD1306_WHITE);
        display2.setCursor(0, 0);
        display2.setTextSize(3);
        display2.println("Preset");
        display2.println("8 Store");
        display3.setTextColor(SSD1306_WHITE);
        display3.setCursor(0, 0);
        display3.setTextSize(3);
        display3.println("Preset");
        display3.println("8 Store");
        display4.setTextColor(SSD1306_WHITE);
        display4.setCursor(0, 0);
        display4.setTextSize(3);
        display4.println("Preset");
        display4.println("8 Store");
        display5.setTextColor(SSD1306_WHITE);
        display5.setCursor(0, 0);
        display5.setTextSize(3);
        display5.println("Preset");
        display5.println("8 Store");
        display1.display();
        display2.display();
        display3.display();
        display4.display();
        display5.display();
        break;
      }
  }
}