#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
#include <PID_v1.h>
#include "max6675.h"

#define outputPin  5

#define pinSO 8
#define pinCS 9
#define pinCLK 10

MAX6675 sensorTemp(pinCLK, pinCS, pinSO);

double Setpoint, Input, Output;
double Kp = 5.0, Ki = 2, Kd = 0.0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);


// OLED SCL ou SCK --> A5    SDA --> A4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define button1 2
#define button2 3
#define button3 4

byte menu = 0;
byte sele0 = 1;
byte sele1 = 1;
byte sele2 = 1;
byte sele3 = 1;
byte sele4 = 1;

boolean button1Ant = false;
boolean button1Atu = false;
boolean button2Ant = false;
boolean button2Atu = false;
boolean button3Ant = false;
boolean button3Atu = false;

unsigned int Tinicial1;

unsigned int Talvo1;
unsigned int Talvo2;
unsigned int Talvo3;

unsigned long tempo1;
unsigned long tempo2;
unsigned long tempo3;
//-----------------------------------------------------------------
void setup() {
  Serial.begin(115200);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0X3C)) {
    Serial.println(F("Erro ao iniciar o display OLED"));
    for (;;);
  }

  display.clearDisplay();
  display.display();

  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(outputPin, OUTPUT);
  //myPID.SetMode(AUTOMATIC);

  Serial.println(String(Tinicial1));
}
//-----------------------------------------------------------------
void loop() {
  ///Serial.println(" ");
  //Serial.print("menu ");Serial.print(menu);
  switch (menu) {
    case 0:                               // menu 0
      button1Atu = digitalRead(button1);
      if (button1Atu && !button1Ant) {
        sele0++;

        if (sele0 > 5) {
          sele0 = 1;
        }
      }
      button1Ant = button1Atu;

      button2Atu = digitalRead(button2);
      if (button2Atu && !button2Ant) {
        sele0--;

        if (sele0 < 1) {
          sele0 = 5;
        }
      }
      button2Ant = button2Atu;
      sele1 = 1;
      sele2 = 1;
      sele3 = 1;
      sele4 = 1;
      //Serial.print("  sele0 ");Serial.println(sele0);
      switch (sele0) {
        case 1:                           // sele0 1
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0, 0);
          display.println("-> Correr");
          display.println("   Ramp 1");
          display.println("   Ramp 2");
          display.println("   Ramp 3");
          display.println("   Ramp 4");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 1;
          }
          break;
        case 2:                           // sele0 2
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0, 0);
          display.println("   Correr");
          display.println("-> Ramp 1");
          display.println("   Ramp 2");
          display.println("   Ramp 3");
          display.println("   Ramp 4");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 2;
          }
          break;
        case 3:                           // sele0 3
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0, 0);
          display.println("   Correr");
          display.println("   Ramp 1");
          display.println("-> Ramp 2");
          display.println("   Ramp 3");
          display.println("   Ramp 4");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 3;
          }
          break;
        case 4:                           // sele0 4
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0, 0);
          display.println("   Correr");
          display.println("   Ramp 1");
          display.println("   Ramp 2");
          display.println("-> Ramp 3");
          display.println("   Ramp 4");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 4;
          }
          break;
        case 5:                           // sele0 5
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0, 0);
          display.println("   Correr");
          display.println("   Ramp 1");
          display.println("   Ramp 2");
          display.println("   Ramp 3");
          display.println("-> Ramp 4");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 5;
          }
          break;
      }
      break;

    case 1:                               // menu 1
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(0, 0);
      display.println("T atual: ");
      display.println("-> Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        menu = 0;
      }
      break;

    case 2:                               // menu 2
      button1Atu = digitalRead(button1);
      if (button1Atu && !button1Ant) {
        sele2++;

        if (sele2 > 4) {
          sele2 = 1;
        }
      }
      button1Ant = button1Atu;

      button2Atu = digitalRead(button2);
      if (button2Atu && !button2Ant) {
        sele2--;

        if (sele2 < 1) {
          sele2 = 4;
        }
      }
      button2Ant = button2Atu;
      sele0 = 1;
      sele1 = 1;
      sele3 = 1;
      sele4 = 1;
      //Serial.print("  sele2 ");Serial.println(sele2);
      switch (sele2) {
        case 1:                               // sele2 1
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);

          display.println("Ramp 1");
          display.println("-> Tinicial: ");
          display.println("   T alvo: " );
          display.println("   tempo: " );
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 6;
          }
          break;
        case 2:                               // sele2 2
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 1");
          display.println("   Tinicial: " + String(Tinicial1));
          display.println("-> T alvo: " + String(Talvo1));
          display.println("   tempo: " + String(tempo1));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 7;
          }
          break;
        case 3:                               // sele2 3
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 1");
          display.println("   Tinicial: " + String(Tinicial1));
          display.println("   T alvo: " + String(Talvo1));
          display.println("-> tempo: " + String(tempo1));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 8;
          }
          break;
        case 4:                               // sele2 4
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 1");
          display.println("   Tinicial: " + String(Tinicial1));
          display.println("   T alvo: " + String(Talvo1));
          display.println("   tempo: " + String(tempo1));
          display.println("-> Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 0;
          }
          break;
      }
      break;

    case 3:                               // menu 3
      button1Atu = digitalRead(button1);
      if (button1Atu && !button1Ant) {
        sele3++;

        if (sele3 > 3) {
          sele3 = 1;
        }
      }
      button1Ant = button1Atu;

      button2Atu = digitalRead(button2);
      if (button2Atu && !button2Ant) {
        sele3--;

        if (sele3 < 1) {
          sele3 = 3;
        }
      }
      button2Ant = button2Atu;
      sele0 = 1;
      sele1 = 1;
      sele2 = 1;
      sele4 = 1;
      switch (sele3) {
        case 1:                               // sele3 1
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 2");
          display.println("-> T alvo: " + String(Talvo2));
          display.println("   tempo: " + String(tempo2));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 10;
          }
          break;
        case 2:                               // sele3 2
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 2");
          display.println("   T alvo: " + String(Talvo2));
          display.println("-> tempo: " + String(tempo2));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 11;
          }
          break;
        case 3:                               // sele3 3
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 2");
          display.println("   T alvo: " + String(Talvo2));
          display.println("   tempo: " + String(tempo2));
          display.println("-> Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 0;
          }
          break;
      }
      break;

    case 4:                               // menu 4
      button1Atu = digitalRead(button1);
      if (button1Atu && !button1Ant) {
        sele4++;

        if (sele4 > 3) {
          sele4 = 1;
        }
      }
      button1Ant = button1Atu;

      button2Atu = digitalRead(button2);
      if (button2Atu && !button2Ant) {
        sele4--;

        if (sele4 < 1) {
          sele4 = 3;
        }
      }
      button2Ant = button2Atu;
      sele0 = 1;
      sele1 = 1;
      sele2 = 1;
      sele3 = 1;
      switch (sele4) {
        case 1:                               // sele4 1
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 3");
          display.println("-> T alvo: " + String(Talvo3));
          display.println("   tempo: " + String(tempo3));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 12;
          }
          break;
        case 2:                               // sele4 2
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 3");
          display.println("   T alvo: " + String(Talvo3));
          display.println("-> tempo: " + String(tempo3));
          display.println("   Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 13;
          }
          break;
        case 3:                               // sele4 3
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(45, 0);
          display.println("Ramp 3");
          display.println("   T alvo: " + String(Talvo3));
          display.println("   tempo: " + String(tempo3));
          display.println("-> Voltar");
          display.display();
          if (digitalRead(button3) == LOW) {
            delay(100);
            menu = 0;
          }
          break;
      }
      break;

    case 5:                               // menu 5
      break;

    case 6:                               // menu 6
      if (digitalRead(button1) == LOW) {
        delay(10);
        Tinicial1++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        Tinicial1--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 1");
      display.println("-> Tinicial: " + String(Tinicial1));
      display.println("   T alvo: " + String(Talvo1));
      display.println("   tempo: " + String(tempo1));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele2 = 1;
        menu = 2;
      }
      break;

    case 7:                               // menu 7
      if (digitalRead(button1) == LOW) {
        delay(10);
        Talvo1++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        Talvo1--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 1");
      display.println("   Tinicial: " + String(Tinicial1));
      display.println("-> T alvo: " + String(Talvo1));
      display.println("   tempo: " + String(tempo1));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele2 = 2;
        menu = 2;
      }
      break;

    case 8:                               // menu 8
      if (digitalRead(button1) == LOW) {
        delay(10);
        tempo1++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        tempo1--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 1");
      display.println("   Tinicial: " + String(Tinicial1));
      display.println("   T alvo: " + String(Talvo1));
      display.println("-> tempo: " + String(tempo1));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele2 = 3;
        menu = 2;
      }
      break;

    case 10:                               // menu 10
      if (digitalRead(button1) == LOW) {
        delay(10);
        Talvo2++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        Talvo2--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 2");
      display.println("-> T alvo: " + String(Talvo2));
      display.println("   tempo: " + String(tempo2));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele3 = 1;
        menu = 3;
      }
      break;

    case 11:                               // menu 11
      if (digitalRead(button1) == LOW) {
        delay(10);
        tempo2++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        tempo2--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 2");
      display.println("   T alvo: " + String(Talvo2));
      display.println("-> tempo: " + String(tempo2));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele3 = 2;
        menu = 3;
      }
      break;

    case 12:                               // menu 12
      if (digitalRead(button1) == LOW) {
        delay(10);
        Talvo3++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        Talvo3--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 3");
      display.println("-> T alvo: " + String(Talvo3));
      display.println("   tempo: " + String(tempo3));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele4 = 1;
        menu = 4;
      }
      break;

    case 13:                               // menu 13
      if (digitalRead(button1) == LOW) {
        delay(10);
        tempo3++;
      }
      if (digitalRead(button2) == LOW) {
        delay(10);
        tempo3--;
      }
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(45, 0);
      display.println("Ramp 3");
      display.println("   T alvo: " + String(Talvo3));
      display.println("-> tempo: " + String(tempo3));
      display.println("   Voltar");
      display.display();
      if (digitalRead(button3) == LOW) {
        delay(100);
        sele4 = 2;
        menu = 4;
      }
      break;
  }
}