#include <PID_v1.h>



const uint8_t ECODECAT [] PROGMEM = {
   0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xd8, 0x01, 0x00,
   0xb8, 0x03, 0x00, 0xb8, 0x07, 0x00, 0xbc, 0x0f, 0x00, 0xbc, 0x1f, 0x00,
   0xbc, 0x1f, 0x00, 0x7e, 0x3f, 0x00, 0x7e, 0x3f, 0x38, 0x7e, 0x3f, 0x5e,
   0x7e, 0x3f, 0x6f, 0x7e, 0xbf, 0x77, 0xfe, 0xde, 0x7b, 0xfc, 0xee, 0x7d,
   0xfc, 0xf6, 0x7d, 0xf8, 0xf6, 0x3e, 0xf0, 0x7a, 0x3f, 0xe0, 0xbd, 0x1f,
   0xc0, 0xdd, 0x1f, 0x80, 0xed, 0x0f, 0x00, 0xed, 0x07, 0x00, 0xf4, 0x01 };

const unsigned char TEMP1 [] PROGMEM = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0xe0, 0x7a, 0x00,
   
   0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 0xfc, 0x30,
   0xc0, 0x00, 0x00, 0xfc, 0x19, 0x80, 0x01, 0x00, 0x00, 0x18, 0x82, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00,
   0x18, 0x86, 0x01, 0x00, 0xf0, 0x19, 0x86, 0x01, 0x00, 0xf8, 0x19, 0x86,
   0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00,
   0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0xfc, 0x19,
   0x86, 0x01, 0x00, 0xfc, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00,
   0x18, 0x86, 0x01, 0x00, 0xf8, 0x19, 0x86, 0x01, 0x00, 0xf0, 0x19, 0x86,
   0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00,
   0x00, 0x18, 0x86, 0x01, 0x00, 0x20, 0x18, 0x86, 0x01, 0x00, 0xfe, 0x19,
   0x86, 0x01, 0x00, 0x6c, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x1c, 0x86, 0x03, 0x00, 0x00,
   0x0e, 0x06, 0x07, 0x00, 0x00, 0x07, 0x06, 0x06, 0x00, 0x00, 0x83, 0x1f,
   0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x0c, 0x00, 0x80, 0xc1, 0x3f, 0x1c, 0x00,
   0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1,
   0x7f, 0x18, 0x00, 0x80, 0xe1, 0x3f, 0x08, 0x00, 0x00, 0xc3, 0x3f, 0x0c,
   0x00, 0x00, 0x83, 0x1f, 0x0c, 0x00, 0x00, 0x07, 0x02, 0x06, 0x00, 0x00,
   0x06, 0x00, 0x07, 0x00, 0x00, 0x1c, 0x80, 0x03, 0x00, 0x00, 0x38, 0xc0,
   0x01, 0x00, 0x00, 0xf0, 0xfb, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

const unsigned char TEMP2 [] PROGMEM = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0xe0, 0x74, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 0xfc, 0x30,
   0xc0, 0x00, 0x01, 0xfc, 0x19, 0x80, 0x81, 0x03, 0x00, 0x18, 0x82, 0xc1,
   0x07, 0x00, 0x18, 0x86, 0xe1, 0x0f, 0x00, 0x18, 0x86, 0x71, 0x1b, 0x00,
   0x18, 0x86, 0x39, 0x3b, 0xf0, 0x19, 0x86, 0x8d, 0x31, 0xf8, 0x19, 0x86,
   0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01,
   0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01, 0xfc, 0x19,
   0x86, 0x81, 0x03, 0xfc, 0x19, 0x86, 0x01, 0x01, 0x00, 0x18, 0x86, 0x81,
   0x03, 0x00, 0x18, 0x86, 0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00,
   0x18, 0x86, 0x01, 0x01, 0xf8, 0x19, 0x86, 0x81, 0x03, 0xf0, 0x19, 0x86,
   0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01,
   0x00, 0x18, 0x86, 0x81, 0x03, 0x10, 0x18, 0x86, 0x01, 0x01, 0xfe, 0x19,
   0x86, 0x01, 0x03, 0x6c, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x1c, 0x86, 0x03, 0x00, 0x00,
   0x06, 0x06, 0x07, 0x00, 0x00, 0x06, 0x06, 0x06, 0x00, 0x00, 0x83, 0x0f,
   0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x0c, 0x00, 0x80, 0xc1, 0x3f, 0x0c, 0x00,
   0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1,
   0x7f, 0x18, 0x00, 0x80, 0xe1, 0x3f, 0x08, 0x00, 0x00, 0xc3, 0x3f, 0x0c,
   0x00, 0x00, 0x83, 0x1f, 0x0c, 0x00, 0x00, 0x07, 0x02, 0x0e, 0x00, 0x00,
   0x06, 0x00, 0x06, 0x00, 0x00, 0x1c, 0x80, 0x03, 0x00, 0x00, 0x38, 0xc0,
   0x01, 0x00, 0x00, 0xf0, 0xfb, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

double Temperatura;
int Vo;
float R1 = 1000;              // resistencia fija del divisor de tension 
float logR2, R2;
double TEMPERATURA;
double TEMPERATURAPANTALLA;
float c1 = 0, c2 = 0, c3 = 0;
// coeficientes de S-H en pagina: 
// http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm

int c = 0;
int EN_ANT = LOW;
int ESTAT = 0;
float TEMPERATURAANT = 0;
unsigned long tiempoAnterior = 0;
int contador = 0;
int contador2 = 0;
int tempo = 0;
int conta1 = 0;
int conta2 = 0;

double Setpoint ; // will be the desired value
double Input; //
double Output ; //LED
//PID parameters
double agrKp=6,agrKi=0,agrKd=0;
double conKp=12,conKi=0.3,conKd=0;
double Max = 240;

PID myPID(&Input, &Output, &Setpoint, conKp, conKi, conKd, DIRECT);


void setup() {

  Serial.begin(9600);
  pinMode(D0, INPUT);
  
  Setpoint = 220;
  0;
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(D3,Max);
}

void loop(){
  DISPLAY_OLED();
  THERMISTOR();
  ENABLE();
  PIDCONTROL();
}

void ENABLE(){
  int EN = digitalRead(D0);
  if(EN ==HIGH && EN_ANT == LOW){
    c = c+1;   
  }
  EN_ANT = EN;
  if (c % 2 == 0){
    ESTAT = 0;
  }
  else {
    ESTAT = 1;
  }
}

void DISPLAY_OLED() {
  u8g2.firstPage();
  do {
    if (conta1 < 2){
    u8g2.setFont(u8g2_font_spleen16x32_mu);
    u8g2.setCursor(0,55);
    u8g2.println("ECODECAT");
    u8g2.drawXBMP(27, 5, 24, 24, ECODECAT);
    delay(2000);
    conta1 = conta1 + 1;
    }
    else{
      if (TEMPERATURAPANTALLA >= 100) {
        u8g2.setCursor(50,30);
      }
      else{
        if(TEMPERATURAPANTALLA < 10){
          u8g2.setCursor(86,30);
        }
        else{
          u8g2.setCursor(68,30);
        }
      }
      if (TEMPERATURA < 240){
        u8g2.setFont(u8g2_font_spleen16x32_mu);
        u8g2.println(int(TEMPERATURAPANTALLA));
      }
      else{
        u8g2.setCursor(50,30);
        u8g2.setFont(u8g2_font_spleen16x32_mu);
        u8g2.println("MAX!");
      }
      u8g2.setFont(u8g2_font_tinytim_tf);
      u8g2.setCursor(105,15);
      u8g2.println("O");
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.setCursor(112,30);
      u8g2.println("C");

      u8g2.setCursor(50,60);
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.println(int(Setpoint));
      u8g2.setFont(u8g2_font_tinytim_tf);
      u8g2.setCursor(105,45);
      u8g2.println("O");
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.setCursor(112,60);
      u8g2.println("C");

      
      if (ESTAT == 1){
        if (conta2 < 30){
          u8g2.drawXBMP(5, -5, 40, 64, TEMP1);
          conta2 = conta2 + 1;
        }
        else{
          u8g2.drawXBMP(5, -5, 40, 64, TEMP2);
          conta2 = conta2 + 1;
          if (conta2 == 70){
            conta2 = 0;
          }
        }
      }
    } 
  } while ( u8g2.nextPage() );
}


void THERMISTOR() {
  Vo = analogRead(A0);      // lectura de A0
  R2 = R1 * ((1023.0) / (float)Vo - 1.0); // conversion de tension a resistencia
  logR2 = log(R2);
  Serial.println(R2);
  if (R2 < 10500) {c1 = 1.369358582e-03, c2 = 1.026280639e-04, c3 = 5.585196447e-07;}
  else{c1 = -3.532779690e-03, c2 = 8.606773781e-04, c3 = -19.80406727e-07;}
  
  TEMPERATURA = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); // temperature in Kelvin
  TEMPERATURA = TEMPERATURA - 273.15; //convert Kelvin to Celcius
  //Serial.println(TEMPERATURA);
  if (TEMPERATURA < 0) {TEMPERATURA = 0;}
    if (-2<= (TEMPERATURA - TEMPERATURAANT) <= 2){
  }
  else{
    TEMPERATURA = TEMPERATURAANT;
  }
TEMPERATURAANT = TEMPERATURA;
  
  contador = contador + 1;
  if (contador == 5){
    TEMPERATURAPANTALLA = TEMPERATURA;
    contador = 0;
  }
}



void PIDCONTROL() {
Input = TEMPERATURA;
  if (ESTAT==1){
    contador2 = contador2 + 1;
    if (contador2 == 2){
      double gap = abs(Setpoint-TEMPERATURA);
      if (gap < 20){
        myPID.SetTunings(conKp, conKi, conKd);
      }
      else {
        myPID.SetTunings(agrKp, agrKi, agrKd); 
      }
        myPID.Compute();
        contador2 = 0;
    }
  analogWrite(D3,Output);
  }
  if (ESTAT==0){
  analogWrite(D3, 0);
  }
}#include <U8g2lib.h>
#include <PID_v1.h>


U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

const uint8_t ECODECAT [] PROGMEM = {
   0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xd0, 0x00, 0x00, 0xd8, 0x01, 0x00,
   0xb8, 0x03, 0x00, 0xb8, 0x07, 0x00, 0xbc, 0x0f, 0x00, 0xbc, 0x1f, 0x00,
   0xbc, 0x1f, 0x00, 0x7e, 0x3f, 0x00, 0x7e, 0x3f, 0x38, 0x7e, 0x3f, 0x5e,
   0x7e, 0x3f, 0x6f, 0x7e, 0xbf, 0x77, 0xfe, 0xde, 0x7b, 0xfc, 0xee, 0x7d,
   0xfc, 0xf6, 0x7d, 0xf8, 0xf6, 0x3e, 0xf0, 0x7a, 0x3f, 0xe0, 0xbd, 0x1f,
   0xc0, 0xdd, 0x1f, 0x80, 0xed, 0x0f, 0x00, 0xed, 0x07, 0x00, 0xf4, 0x01 };

const unsigned char TEMP1 [] PROGMEM = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0xe0, 0x7a, 0x00,
   
   0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 0xfc, 0x30,
   0xc0, 0x00, 0x00, 0xfc, 0x19, 0x80, 0x01, 0x00, 0x00, 0x18, 0x82, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00,
   0x18, 0x86, 0x01, 0x00, 0xf0, 0x19, 0x86, 0x01, 0x00, 0xf8, 0x19, 0x86,
   0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00,
   0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0xfc, 0x19,
   0x86, 0x01, 0x00, 0xfc, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00,
   0x18, 0x86, 0x01, 0x00, 0xf8, 0x19, 0x86, 0x01, 0x00, 0xf0, 0x19, 0x86,
   0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00,
   0x00, 0x18, 0x86, 0x01, 0x00, 0x20, 0x18, 0x86, 0x01, 0x00, 0xfe, 0x19,
   0x86, 0x01, 0x00, 0x6c, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x1c, 0x86, 0x03, 0x00, 0x00,
   0x0e, 0x06, 0x07, 0x00, 0x00, 0x07, 0x06, 0x06, 0x00, 0x00, 0x83, 0x1f,
   0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x0c, 0x00, 0x80, 0xc1, 0x3f, 0x1c, 0x00,
   0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1,
   0x7f, 0x18, 0x00, 0x80, 0xe1, 0x3f, 0x08, 0x00, 0x00, 0xc3, 0x3f, 0x0c,
   0x00, 0x00, 0x83, 0x1f, 0x0c, 0x00, 0x00, 0x07, 0x02, 0x06, 0x00, 0x00,
   0x06, 0x00, 0x07, 0x00, 0x00, 0x1c, 0x80, 0x03, 0x00, 0x00, 0x38, 0xc0,
   0x01, 0x00, 0x00, 0xf0, 0xfb, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

const unsigned char TEMP2 [] PROGMEM = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0xe0, 0x74, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00, 0xfc, 0x30,
   0xc0, 0x00, 0x01, 0xfc, 0x19, 0x80, 0x81, 0x03, 0x00, 0x18, 0x82, 0xc1,
   0x07, 0x00, 0x18, 0x86, 0xe1, 0x0f, 0x00, 0x18, 0x86, 0x71, 0x1b, 0x00,
   0x18, 0x86, 0x39, 0x3b, 0xf0, 0x19, 0x86, 0x8d, 0x31, 0xf8, 0x19, 0x86,
   0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01,
   0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01, 0xfc, 0x19,
   0x86, 0x81, 0x03, 0xfc, 0x19, 0x86, 0x01, 0x01, 0x00, 0x18, 0x86, 0x81,
   0x03, 0x00, 0x18, 0x86, 0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00,
   0x18, 0x86, 0x01, 0x01, 0xf8, 0x19, 0x86, 0x81, 0x03, 0xf0, 0x19, 0x86,
   0x01, 0x01, 0x00, 0x18, 0x86, 0x81, 0x03, 0x00, 0x18, 0x86, 0x01, 0x01,
   0x00, 0x18, 0x86, 0x81, 0x03, 0x10, 0x18, 0x86, 0x01, 0x01, 0xfe, 0x19,
   0x86, 0x01, 0x03, 0x6c, 0x19, 0x86, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01,
   0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x1c, 0x86, 0x03, 0x00, 0x00,
   0x06, 0x06, 0x07, 0x00, 0x00, 0x06, 0x06, 0x06, 0x00, 0x00, 0x83, 0x0f,
   0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x0c, 0x00, 0x80, 0xc1, 0x3f, 0x0c, 0x00,
   0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1, 0x7f, 0x18, 0x00, 0x80, 0xe1,
   0x7f, 0x18, 0x00, 0x80, 0xe1, 0x3f, 0x08, 0x00, 0x00, 0xc3, 0x3f, 0x0c,
   0x00, 0x00, 0x83, 0x1f, 0x0c, 0x00, 0x00, 0x07, 0x02, 0x0e, 0x00, 0x00,
   0x06, 0x00, 0x06, 0x00, 0x00, 0x1c, 0x80, 0x03, 0x00, 0x00, 0x38, 0xc0,
   0x01, 0x00, 0x00, 0xf0, 0xfb, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

double Temperatura;
int Vo;
float R1 = 1000;              // resistencia fija del divisor de tension 
float logR2, R2;
double TEMPERATURA;
double TEMPERATURAPANTALLA;
float c1 = 0, c2 = 0, c3 = 0;
// coeficientes de S-H en pagina: 
// http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm

int c = 0;
int EN_ANT = LOW;
int ESTAT = 0;
float TEMPERATURAANT = 0;
unsigned long tiempoAnterior = 0;
int contador = 0;
int contador2 = 0;
int tempo = 0;
int conta1 = 0;
int conta2 = 0;

double Setpoint ; // will be the desired value
double Input; //
double Output ; //LED
//PID parameters
double agrKp=6,agrKi=0,agrKd=0;
double conKp=12,conKi=0.3,conKd=0;
double Max = 240;

PID myPID(&Input, &Output, &Setpoint, conKp, conKi, conKd, DIRECT);


void setup() {
  u8g2.begin();
  u8g2.setDisplayRotation (U8G2_R2);
  Serial.begin(9600);
  pinMode(D0, INPUT);
  
  Setpoint = 220;
  0;
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(D3,Max);
}

void loop(){
  DISPLAY_OLED();
  THERMISTOR();
  ENABLE();
  PIDCONTROL();
}

void ENABLE(){
  int EN = digitalRead(D0);
  if(EN ==HIGH && EN_ANT == LOW){
    c = c+1;   
  }
  EN_ANT = EN;
  if (c % 2 == 0){
    ESTAT = 0;
  }
  else {
    ESTAT = 1;
  }
}

void DISPLAY_OLED() {
  u8g2.firstPage();
  do {
    if (conta1 < 2){
    u8g2.setFont(u8g2_font_spleen16x32_mu);
    u8g2.setCursor(0,55);
    u8g2.println("ECODECAT");
    u8g2.drawXBMP(27, 5, 24, 24, ECODECAT);
    delay(2000);
    conta1 = conta1 + 1;
    }
    else{
      if (TEMPERATURAPANTALLA >= 100) {
        u8g2.setCursor(50,30);
      }
      else{
        if(TEMPERATURAPANTALLA < 10){
          u8g2.setCursor(86,30);
        }
        else{
          u8g2.setCursor(68,30);
        }
      }
      if (TEMPERATURA < 240){
        u8g2.setFont(u8g2_font_spleen16x32_mu);
        u8g2.println(int(TEMPERATURAPANTALLA));
      }
      else{
        u8g2.setCursor(50,30);
        u8g2.setFont(u8g2_font_spleen16x32_mu);
        u8g2.println("MAX!");
      }
      u8g2.setFont(u8g2_font_tinytim_tf);
      u8g2.setCursor(105,15);
      u8g2.println("O");
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.setCursor(112,30);
      u8g2.println("C");

      u8g2.setCursor(50,60);
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.println(int(Setpoint));
      u8g2.setFont(u8g2_font_tinytim_tf);
      u8g2.setCursor(105,45);
      u8g2.println("O");
      u8g2.setFont(u8g2_font_spleen16x32_mu);
      u8g2.setCursor(112,60);
      u8g2.println("C");

      
      if (ESTAT == 1){
        if (conta2 < 30){
          u8g2.drawXBMP(5, -5, 40, 64, TEMP1);
          conta2 = conta2 + 1;
        }
        else{
          u8g2.drawXBMP(5, -5, 40, 64, TEMP2);
          conta2 = conta2 + 1;
          if (conta2 == 70){
            conta2 = 0;
          }
        }
      }
    } 
  } while ( u8g2.nextPage() );
}


void THERMISTOR() {
  Vo = analogRead(A0);      // lectura de A0
  R2 = R1 * ((1023.0) / (float)Vo - 1.0); // conversion de tension a resistencia
  logR2 = log(R2);
  Serial.println(R2);
  if (R2 < 10500) {c1 = 1.369358582e-03, c2 = 1.026280639e-04, c3 = 5.585196447e-07;}
  else{c1 = -3.532779690e-03, c2 = 8.606773781e-04, c3 = -19.80406727e-07;}
  
  TEMPERATURA = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); // temperature in Kelvin
  TEMPERATURA = TEMPERATURA - 273.15; //convert Kelvin to Celcius
  //Serial.println(TEMPERATURA);
  if (TEMPERATURA < 0) {TEMPERATURA = 0;}
    if (-2<= (TEMPERATURA - TEMPERATURAANT) <= 2){
  }
  else{
    TEMPERATURA = TEMPERATURAANT;
  }
TEMPERATURAANT = TEMPERATURA;
  
  contador = contador + 1;
  if (contador == 5){
    TEMPERATURAPANTALLA = TEMPERATURA;
    contador = 0;
  }
}



void PIDCONTROL() {
Input = TEMPERATURA;
  if (ESTAT==1){
    contador2 = contador2 + 1;
    if (contador2 == 2){
      double gap = abs(Setpoint-TEMPERATURA);
      if (gap < 20){
        myPID.SetTunings(conKp, conKi, conKd);
      }
      else {
        myPID.SetTunings(agrKp, agrKi, agrKd); 
      }
        myPID.Compute();
        contador2 = 0;
    }
  analogWrite(D3,Output);
  }
  if (ESTAT==0){
  analogWrite(D3, 0);
  }
}