#include <SPI.h>
#include <Wire.h>

#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

#include <RotaryEncoder.h>
#include <EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

RotaryEncoder encoder(26, 27);

uint8_t j = 0;
uint8_t midi_on_off[24] = {0};
uint8_t modo = 0;
uint8_t pressionado = 0;
const uint8_t BT[] = {4, 0, 2, 15, 16, 23};
const uint8_t LED[] = {32, 33, 25, 12, 5, 18};
int8_t configline[4][3] = {0};
int8_t CC_lim [2] = {-1, 77};
uint8_t position[2] = {0};
uint8_t modPosition = 0;
uint8_t page = 0;
uint8_t banco_atual = 1;
uint8_t fx = 0;
uint8_t index_ = 0;
uint8_t selecionado[2] = {0};
uint8_t Name[3] = {32, 32, 32};
uint8_t disp = 0;
uint8_t limiteFx[2] = {11, 3};
long inicioTempo;

MIDI_CREATE_DEFAULT_INSTANCE();


void setup() //*************************************************************************************************************
{
  //Serial.begin(31250);
  Serial.begin(115200);

  //MIDI.setHandleError(handleError);
  MIDI.begin(MIDI_CHANNEL_OMNI);

  Wire.begin();

  EEPROM.begin(1024);

  /*
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
    }
  */
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  for (uint8_t i = 0; i < 6; i++)
  {
    pinMode(BT[i], INPUT_PULLUP);
    pinMode(LED[i], OUTPUT);
  }

  pinMode(14, INPUT_PULLUP);

  firstAcess();

  //delay(100);
  display.clearDisplay();
  display.setFont(&FreeSansBold9pt7b);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(23, 47);
  display.print(F("MVS"));
  display.display();
  delay(3000);

  showdisplay();
}
// BT ENVIA SINAL PARA PEDALEIRA
void Envia_Sinal() //*************************************************************************************************************
{
  if (midi_on_off[index_ + j] == 0)
  {
    for (uint8_t i = 0; i < (EEPROM.read(700 + index_ + j)); i++)
    {
      MIDI.sendControlChange(EEPROM.read((i * 20) + index_ + j),
                             EEPROM.read((i * 20) + 200 + index_ + j), 1);
      delay(30);
    }
    digitalWrite(LED[j], HIGH);
    midi_on_off[index_ + j] = 1;
  }
  else
  {
    for (uint8_t i = 0; i < (EEPROM.read(700 + index_ + j)); i++)
    {
      MIDI.sendControlChange(EEPROM.read((i * 20) + index_ + j),
                             EEPROM.read((i * 20) + 100 + index_ + j), 1);
      delay(30);
    }
    digitalWrite(LED[j], LOW);
    midi_on_off[index_ + j] = 0;
  }

  display.clearDisplay();
  display.setFont(&FreeSansBold9pt7b);
  display.setTextSize(2);

  uint8_t i = 0;
  uint8_t cursorX = 0;
  display.setCursor(i, 47);
  display.write(EEPROM.read(400 + index_ + j));
  display.write(EEPROM.read(500 + index_ + j));
  display.write(EEPROM.read(600 + index_ + j));
  cursorX = (128 - display.getCursorX()) / 2;
  display.clearDisplay();
  display.setCursor(cursorX, 47);
  display.write(EEPROM.read(400 + index_ + j));
  display.write(EEPROM.read(500 + index_ + j));
  display.write(EEPROM.read(600 + index_ + j));

  display.display();
  ledControl();

  pressionado = 1;

  inicioTempo = millis();
  //delay(1000);
  //showdisplay();

}

void ledControl()
{
  //led control
  for (uint8_t k = (banco_atual - 1) * 6; k < (banco_atual) * 6; k++)
  {
    digitalWrite(LED[(k) % 6], LOW);

    if (midi_on_off[k] == 1)
    {
      digitalWrite(LED[(k) % 6], HIGH);
    }
  }
}
void showdisplay() //*************************************************************************************************************
{
  display.setFont(&FreeSans9pt7b);
  display.setTextSize(1);
  uint8_t cursorX[4] = {0};
  display.setCursor(0, 62);
  display.write(EEPROM.read(400 + index_ + 1));
  display.write(EEPROM.read(500 + index_ + 1));
  display.write(EEPROM.read(600 + index_ + 1));
  cursorX[0] = (128 - display.getCursorX())/2;

  display.setCursor(0, 37);
  display.write(EEPROM.read(400 + index_ + 2));
  display.write(EEPROM.read(500 + index_ + 2));
  display.write(EEPROM.read(600 + index_ + 2));
  cursorX[1] = 128 - display.getCursorX();

  display.setCursor(0, 37);
  display.write(EEPROM.read(400 + index_ + 4));
  display.write(EEPROM.read(500 + index_ + 4));
  display.write(EEPROM.read(600 + index_ + 4));
  cursorX[2] = (128 - display.getCursorX())/2;

  display.setCursor(0, 37);
  display.write(EEPROM.read(400 + index_ + 5));
  display.write(EEPROM.read(500 + index_ + 5));
  display.write(EEPROM.read(600 + index_ + 5));
  cursorX[3] = 128 - display.getCursorX();

  display.clearDisplay();

  display.setFont(&FreeSans9pt7b);
  display.setTextSize(1);
  display.setCursor(0, 37);

  display.write(EEPROM.read(400 + index_ + 3));
  display.write(EEPROM.read(500 + index_ + 3));
  display.write(EEPROM.read(600 + index_ + 3));

  display.setCursor(0, 62);
  display.write(EEPROM.read(400 + index_ + 0));
  display.write(EEPROM.read(500 + index_ + 0));
  display.write(EEPROM.read(600 + index_ + 0));

  display.setCursor(cursorX[0], 62);
  display.write(EEPROM.read(400 + index_ + 1));
  display.write(EEPROM.read(500 + index_ + 1));
  display.write(EEPROM.read(600 + index_ + 1));

  display.setCursor(cursorX[1], 62);
  display.write(EEPROM.read(400 + index_ + 2));
  display.write(EEPROM.read(500 + index_ + 2));
  display.write(EEPROM.read(600 + index_ + 2));

  display.setCursor(cursorX[2], 37);
  display.write(EEPROM.read(400 + index_ + 4));
  display.write(EEPROM.read(500 + index_ + 4));
  display.write(EEPROM.read(600 + index_ + 4));

  display.setCursor(cursorX[3], 37);
  display.write(EEPROM.read(400 + index_ + 5));
  display.write(EEPROM.read(500 + index_ + 5));
  display.write(EEPROM.read(600 + index_ + 5));


  display.setFont(&FreeSansBold9pt7b);
  display.setCursor(30, 14);
  display.print(F("LIVE - "));

  if (banco_atual == 1) display.print(F("A"));
  if (banco_atual == 2) display.print(F("B"));
  if (banco_atual == 3) display.print(F("C"));
  if (banco_atual == 4) display.print(F("D"));
  if (banco_atual == 5) display.print(F("E"));
  if (banco_atual == 6) display.print(F("F"));

  display.display();

  disp = 1;
}

void showmenu() //*************************************************************************************************************
{
  uint8_t cursor[4] = {0};

  //display.setFont(&FreeSans9pt7b);
  display.setFont(&FreeSans9pt7b);
  display.setTextSize(2);
  display.setCursor(0, 33);
  display.print(page + 1);
  cursor[0] = (25 - display.getCursorX()) / 2;
  display.setTextSize(1);

  for (uint8_t i = 1; i < 4; i++)
  {
    display.setCursor(0, 33);
    display.print(configline[page][i - 1]);
    cursor[i] = 120 - display.getCursorX();
  }

  display.setTextColor(WHITE);
  display.setFont(&FreeSansBold9pt7b);
  display.clearDisplay();

  display.setTextSize(1);
  display.setCursor(0, 14);
  display.print(F("BACK"));
  display.setCursor(76, 14);
  display.print(F("NEXT"));

  display.display();

  display.drawRect(124, 20, 4, 44, WHITE);
  display.fillRect(124, 20 + ceil(2.8333 * position[0]), 4, 8, WHITE);

  display.setFont(&FreeSans9pt7b);
  display.setTextSize(2);

  display.setCursor(cursor[0], 52);
  display.print(page + 1);
  display.drawRoundRect(0, 22, 25, 38, 0, WHITE);


  display.setTextSize(1);
  if (selecionado[0] == 0)
  {
    display.drawRoundRect(28, 16  + modPosition * 15, 95, 17, 3, WHITE);
    display.setTextColor(WHITE);
    display.setCursor(30, 30);
    display.print(F("CC#"));
    display.setCursor(70, 30);
    display.print(F(":"));
    display.setCursor(cursor[1], 30);
    display.print(configline[page][0]);
    display.display();

    display.setTextColor(WHITE);
    display.setCursor(30, 45);
    display.print(F("Start"));
    display.setCursor(70, 45);
    display.print(F(":"));
    display.setCursor(cursor[2], 45);
    display.print(configline[page][1]);
    display.display();

    display.setTextColor(WHITE);
    display.setCursor(30, 60);
    display.print(F("End"));
    display.setCursor(70, 60);
    display.print(F(":"));
    display.setCursor(cursor[3], 60);
    display.print(configline[page][2]);
    display.display();
  }

  if (selecionado[0] == 1)
  {

    if (modPosition == 0)
    {
      display.fillRoundRect(28, 16, 98, 17, 3, WHITE);
      display.setTextColor(BLACK);
      display.setCursor(30, 30);
      display.print(F("CC#"));
      display.setCursor(70, 30);
      display.print(F(":"));
      display.setCursor(cursor[1], 30);
      display.print(configline[page][0]);
      display.display();

      display.setTextColor(WHITE);
      display.setCursor(30, 45);
      display.print(F("Start"));
      display.setCursor(70, 45);
      display.print(F(":"));
      display.setCursor(cursor[2], 45);
      display.print(configline[page][1]);
      display.display();

      display.setTextColor(WHITE);
      display.setCursor(30, 60);
      display.print(F("End"));
      display.setCursor(70, 60);
      display.print(F(":"));
      display.setCursor(cursor[3], 60);
      display.print(configline[page][2]);
      display.display();
    }

    if (modPosition == 1)
    {
      display.setTextColor(WHITE);
      display.setCursor(30, 30);
      display.print(F("CC#"));
      display.setCursor(70, 30);
      display.print(F(":"));
      display.setCursor(cursor[1], 30);
      display.print(configline[page][0]);
      display.display();

      display.fillRoundRect(28, 31, 98, 17, 3, WHITE);

      display.setTextColor(BLACK);
      display.setCursor(30, 45);
      display.print(F("Start"));
      display.setCursor(70, 45);
      display.print(F(":"));
      display.setCursor(cursor[2], 45);
      display.print(configline[page][1]);
      display.display();

      display.setTextColor(WHITE);
      display.setCursor(30, 60);
      display.print(F("End"));
      display.setCursor(70, 60);
      display.print(F(":"));
      display.setCursor(cursor[3], 60);
      display.print(configline[page][2]);
      display.display();
    }

    if (modPosition == 2)
    {

      display.setTextColor(WHITE);
      display.setCursor(30, 30);
      display.print(F("CC#"));
      display.setCursor(70, 30);
      display.print(F(":"));
      display.setCursor(cursor[1], 30);
      display.print(configline[page][0]);
      display.display();

      display.setTextColor(WHITE);
      display.setCursor(30, 45);
      display.print(F("Start"));
      display.setCursor(70, 45);
      display.print(F(":"));
      display.setCursor(cursor[2], 45);
      display.print(configline[page][1]);
      display.display();

      display.fillRoundRect(28, 46, 98, 17, 3, WHITE);
      display.setTextColor(BLACK);
      display.setCursor(30, 60);
      display.print(F("End"));
      display.setCursor(70, 60);
      display.print(F(":"));
      display.setCursor(cursor[3], 60);
      display.print(configline[page][2]);
      display.display();
    }
  }
}

void showSave()//*************************************************************************************************************
{
  display.setTextColor(WHITE);
  display.setFont(&FreeSansBold9pt7b);
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 14);
  display.print(F("BACK"));
  display.setCursor(76, 14);
  display.print(F("SAVE"));
  display.display();

  display.setFont(&FreeSans9pt7b);

  display.setCursor(5, 45);
  display.print(F("Name:"));

  uint8_t posChar[4];

  display.setCursor(65, 45);
  posChar[0] = 67;
  display.write(Name[0]);
  posChar[1] = display.getCursorX();
  display.write(Name[1]);
  posChar[2] = display.getCursorX();
  display.write(Name[2]);
  posChar[3] = display.getCursorX();

  if (selecionado[1] == 0)
  {
    display.setCursor(posChar[position[1]], 48);
    display.print(F("_"));
    display.display();
  }

  display.setCursor(65, 45);
  display.write(Name[0]);
  display.write(Name[1]);
  display.write(Name[2]);

  if (selecionado[1] == 1)
  {
    display.setTextColor(BLACK);
    display.setCursor(posChar[position[1]], 48);
    display.print(F("_"));
    display.display();
    display.fillRect(posChar[position[1]] - 1, 31, posChar[position[1] + 1] - posChar[position[1]] + 4, 21, WHITE);
    display.setCursor(posChar[position[1]], 48);
    display.write(Name[position[1]]);
    //display.setTextColor(WHITE);

  }
  display.display();
}

void showoptions() //*************************************************************************************************************
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  
  display.setFont(&FreeSans9pt7b);
  display.setTextSize(1);

  display.setCursor(0, 62);
  display.print(F("1"));
  display.setCursor(60, 62);
  display.print(F("2"));
  display.setCursor(115, 62);
  display.print(F("3"));
  display.setCursor(0, 37);
  display.print(F("4"));
  display.setCursor(60, 37);
  display.print(F("5"));
  display.setCursor(115, 37);
  display.print(F("6"));



  //display.setFont(&FreeSans9pt7b);
  display.setFont(&FreeSansBold9pt7b);
  display.setCursor(14, 14);
  display.print(F("CONFIG - "));

  if (banco_atual == 1) display.print(F("A"));
  if (banco_atual == 2) display.print(F("B"));
  if (banco_atual == 3) display.print(F("C"));
  if (banco_atual == 4) display.print(F("D"));
  if (banco_atual == 5) display.print(F("E"));
  if (banco_atual == 6) display.print(F("F"));

  //display.setCursor(62, 62);
  //display.print(F("."));
  display.display();
}

void loop() //*************************************************************************************************************
{
  static uint8_t pos = 0;
  encoder.tick();
  uint8_t newPos = encoder.getPosition();
  unsigned long buttonPressTime;

  if (digitalRead(BT[0]) == HIGH && digitalRead(BT[1]) == HIGH && digitalRead(BT[2]) == HIGH && digitalRead(BT[3]) == HIGH && digitalRead(BT[4]) == HIGH && digitalRead(BT[5]) == HIGH && digitalRead(14) == HIGH)
  {
    pressionado = 0;
    buttonPressTime = millis();
  }

  for (uint8_t l = 0; l < 6; l++)
  {
    if (digitalRead(BT[l]) == LOW && pressionado == 0) // PINO 2
    {
      j = l;
    }
  }

  //********************************* MODO 0 *********************************
  if (pressionado == 0)
  {
    if (modo == 0)
    {
      for (uint8_t l = 0; l < 6; l++)
      {
        if (digitalRead(BT[l]) == LOW) // PINO 2
        {
          Envia_Sinal();
          pressionado = 1;
          disp = 0;
          delay(200);
        }
      }
      if (digitalRead(14) == LOW)
      {
        buttonPressTime = millis();
      }

      while (digitalRead(14) == LOW)
      {

        if (digitalRead(14) == LOW && millis() - buttonPressTime >= 3000)
        {
          modo = 1;
          pressionado = 1;
          showoptions();
        }
      }

      if (millis() - inicioTempo >= 1000 && disp == 0)
      {
        showdisplay();
      }

      // BANCO DOWN - MODO DE OPERAÇÃO
      if (newPos > pos && banco_atual > 1)
      {
        banco_atual--;
        index_ = ((banco_atual - 1) * 6);
        showdisplay();
        ledControl();
      }

      // BANCO UP - MODO DE OPERAÇÃO
      if (newPos < pos && banco_atual < 4)
      {
        banco_atual++;
        index_ = ((banco_atual - 1) * 6);
        showdisplay();
        ledControl();
      }
    }

    //********************************* MODO 1 *********************************

    if (modo == 1)
    {
      //TELA DE ESCOLHA DO BOTÃO A CONFIGURAR
      if (digitalRead(BT[j]) == LOW)
      {
        fx = index_ + j;

        uint8_t u = 0;
        for (uint8_t i = 0; i < 4; i++)
        {
          configline[i][0] = EEPROM.read(u + 0 + fx);
          configline[i][1] = EEPROM.read(u + 100 + fx);
          configline[i][2] = EEPROM.read(u + 200 + fx);
          u = u + 20;
        }

        selecionado[0] = 0;
        position[0] = 0;
        modPosition = position[0] % 3;
        page = floor(position[0] / 3);
        limiteFx[1] = EEPROM.read(700 + fx);
        modo = 2;
        pressionado = 1;
        showmenu();
        delay(200);
      }

      // BANCO DOWN - MODO DE CONFIGURAÇÃO
      if (newPos > pos && banco_atual > 1)
      {
        banco_atual--;
        index_ = ((banco_atual - 1) * 6);
        pressionado = 1;
        showoptions();

      }

      // BANCO UP - MODO DE CONFIGURAÇÃO
      if (newPos < pos && banco_atual < 4)
      {
        banco_atual++;
        index_ = ((banco_atual - 1) * 6);
        pressionado = 1;
        showoptions();
      }

      //BT VOLTAR
      if (digitalRead(14) == LOW)
      {
        modo = 0;
        pressionado = 1;
        showdisplay();
        delay(200);
      }
    }

    //********************************* MODO 2 *********************************

    //BT scroll para baixo
    if (modo == 2)
    {
      if (selecionado[0] == 0)
      {
        if (newPos > pos && position[0] > 0)
        {
          position[0] = position[0] - 1;
          modPosition = position[0] % 3;
          page = floor(position[0] / 3);
          if (configline[page][0] == -1 && page > 0)
          {
            limiteFx[1] = page;
            limiteFx[0] = position[0];
          }
          else {
            limiteFx[1] = 4;
            limiteFx[0] = 11;
          }
          display.clearDisplay();
          showmenu();
        }

        //BT scroll para cima
        else if (newPos < pos && position[0] < limiteFx[0])
        {
          position[0] = position[0] + 1;
          modPosition = position[0] % 3;
          page = floor(position[0] / 3);
          if (configline[page][0] == -1 && page > 0)
          {
            limiteFx[1] = page;
            limiteFx[0] = position[0];
          }
          else {
            limiteFx[1] = 4;
            limiteFx[0] = 11;
          }
          display.clearDisplay();
          showmenu();
        }

        else if (digitalRead(14) == LOW)
        {
          selecionado[0] = 1;
          pressionado = 1;
          showmenu();
          delay(200);
        }
      }
      else
      {
        if (newPos > pos && configline[page][modPosition] > CC_lim[0])
        {
          configline[page][modPosition] = configline[page][modPosition] - 1;
          if (configline[page][0] == -1 && page > 0)
          {
            limiteFx[1] = page;
            limiteFx[0] = position[0];
          }
          else {
            limiteFx[1] = 4;
            limiteFx[0] = 11;
          }
          display.clearDisplay();
          showmenu();
        }

        else if (newPos < pos && configline[page][modPosition] < CC_lim[1])
        {
          configline[page][modPosition] = configline[page][modPosition] + 1;
          if (configline[page][0] == -1 && page > 0)
          {
            limiteFx[1] = page;
            limiteFx[0] = position[0];
          }
          else {
            limiteFx[1] = 4;
            limiteFx[0] = 11;
          }
          display.clearDisplay();
          showmenu();
        }
        else if (digitalRead(14) == LOW)
        {
          selecionado[0] = 0;
          pressionado = 1;
          showmenu();
          delay(200);
        }
      }

      if (modPosition == 0)
      {
        CC_lim[1] = 77;
        CC_lim[0] = -1;
      }
      else
      {
        CC_lim[1] = 127;
        CC_lim[0] = 0;
      }

      //BT NEXT
      if (digitalRead(BT[5]) == LOW)
      {
        uint8_t u = 0;
        for (uint8_t i = 0; i < 4; i++)
        {
          EEPROM.write(u + 0 + fx, configline[i][0]);
          EEPROM.write(u + 100 + fx, configline[i][1]);
          EEPROM.write(u + 200 + fx, configline[i][2]);
          u = u + 20;
        }
        EEPROM.commit();

        Name[0] = EEPROM.read(400 + fx);
        Name[1] = EEPROM.read(500 + fx);
        Name[2] = EEPROM.read(600 + fx);
        selecionado[1] = 0;
        position[1] = 0;
        modPosition = position[0] % 3;
        modo = 3;
        pressionado = 1;
        showSave();
        delay(200);
      }

      // BT VOLTAR
      if (digitalRead(BT[3]) == LOW)
      {
        modo = 1;
        pressionado = 1;
        showoptions();
        delay(200);
      }
    }

    //********************************* MODO 3 *********************************

    if (modo == 3) //32 a 122
    {
      if (newPos > pos && position[1] > 0 && selecionado[1] == 0)
      {
        position[1] = position[1] - 1;
        display.clearDisplay();
        showSave();
      }

      //BT scroll para baixo
      if (newPos < pos && position[1] < 2 && selecionado[1] == 0)
      {
        position[1] = position[1] + 1;
        display.clearDisplay();
        showSave();
      }

      if (newPos > pos && selecionado[1] == 1)
      {
        Name[position[1]] = Name[position[1]] - 1;
        if (Name[position[1]] < 32) {
          Name[position[1]] = 122;
        }
        display.clearDisplay();
        showSave();
      }

      if (newPos < pos && selecionado[1] == 1)
      {
        Name[position[1]] = Name[position[1]] + 1 ;
        if (Name[position[1]] > 122) {
          Name[position[1]] = 32;
        }
        display.clearDisplay();
        showSave();
      }

      //BT Seleciona
      if (digitalRead(14) == LOW)
      {
        if (selecionado[1] == 0)
        {
          selecionado[1] = 1;
        }
        else
        {
          selecionado[1] = 0;
        }
        pressionado = 1;
        showSave();
        delay(200);
      }

      //BT SAVE
      if (digitalRead(BT[5]) == LOW)
      {
        for (uint8_t i = 0; i < 3; i++)
        {
          EEPROM.write(400 + i * 100 + fx, Name[i]);
        }
        selecionado[1] = 0;
        showSave();
        limiteFx[0] = 11;
        EEPROM.write(700 + fx, limiteFx[1]);
        //EEPROM.commit();
        modo = 0;
        pressionado = 1;
        delay(200);
        showdisplay();

      }

      // BT VOLTAR
      if (digitalRead(BT[3]) == LOW)
      {
        selecionado[1] = 0;
        showSave();
        modo = 2;
        pressionado = 1;
        showmenu();
        delay(200);
      }

    }
  }
  pos = newPos;
  delay(10);
}

void firstAcess()
{
  
  for (uint8_t i = 0; i < 80; i++) EEPROM.write(i, 10);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 80; i++) EEPROM.write(100 + i, 0);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 80; i++) EEPROM.write(200 + i, 127);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 24; i++) EEPROM.write(400 + i, i + 49);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 24; i++) EEPROM.write(500 + i, 105);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 24; i++) EEPROM.write(600 + i, 110);// ***** SOMENTE NO PRIMEIRO UPLOAD *****
  for (uint8_t i = 0; i < 24; i++) EEPROM.write(700 + i, 1);// ***** SOMENTE NO PRIMEIRO UPLOAD *****


  //FOOT 1: SN1
  EEPROM.write(0, 25);
  EEPROM.write(100, 1);
  EEPROM.write(200, 1);
  EEPROM.write(400, 83);
  EEPROM.write(500, 78);
  EEPROM.write(600, 49);
  //FOOT 2: SN2
  EEPROM.write(1, 25);
  EEPROM.write(101, 2);
  EEPROM.write(201, 2);
  EEPROM.write(401, 83);
  EEPROM.write(501, 78);
  EEPROM.write(601, 50);
  //FOOT 3: SN3
  EEPROM.write(2, 25);
  EEPROM.write(102, 3);
  EEPROM.write(202, 3);
  EEPROM.write(402, 83);
  EEPROM.write(502, 78);
  EEPROM.write(602, 51);
  //FOOT 4: P -
  EEPROM.write(3, 26);
  EEPROM.write(103, 1);
  EEPROM.write(203, 1);
  EEPROM.write(403, 80);
  EEPROM.write(503, 32);
  EEPROM.write(603, 45);
  //FOOT 5: P +
  EEPROM.write(4, 27);
  EEPROM.write(104, 1);
  EEPROM.write(204, 1);
  EEPROM.write(404, 80);
  EEPROM.write(504, 32);
  EEPROM.write(604, 43);
  //FOOT 6: MOD
  EEPROM.write(5, 29);
  EEPROM.write(105, 0);
  EEPROM.write(205, 127);
  EEPROM.write(405, 77);
  EEPROM.write(505, 79);
  EEPROM.write(605, 68);

  EEPROM.commit();
}