#include <TimerOne.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#include <PID_v1.h>

#include <wiring_private.h>
#include <pins_arduino.h>

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);

 

// Pass our oneWire reference to Dallas Temperature.

DallasTemperature sensors(&oneWire);


#define sensor1 2 
#define sensor2 A0
#define PWM 6

#define PIN_INPUT A0
#define PIN_OUTPUT 6
#define tiempociclo 100

int pwm = 6;
double analogo = 0.0;
double temperatura = 0.0;
int detecta = 0.0;
double originalSetpoint = 30;
double setpoint = originalSetpoint;
double input, input1, output;
double Kp = 10.0;
double Ki = 5.0;
double Kd = 20.0;

PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);


int digitalReadOutputPin(uint8_t pin)
{
  uint8_t bit = digitalPinToBitMask(pin);
  uint8_t port = digitalPinToPort(pin);
  if (port == NOT_A_PIN) 
    return LOW;

  return (*portOutputRegister(port) & bit) ? HIGH : LOW;
}


double requestTemperature(uint8_t adc) {
  const float BETA = 3950;
  int analogValue = analogRead(adc);
  //Serial.println(analogValue);
  double temperature = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  Serial.print("Temperature: ");
  Serial.print(temperature);
  
  return temperature;

}


void setup() {
  Serial.begin(9600);
  

  input = requestTemperature(A0);
  input1 = slidePot(A1);

  
  pid.SetSampleTime(tiempociclo);
  pid.SetMode(AUTOMATIC);
  pid.SetOutputLimits(0, 255);
  // put your setup code here, to run once:

}





double slidePot(uint8_t adc) {

  int analogValue = analogRead(adc);
  //Serial.println(analogValue);
  return analogValue;
}

void readKp() {
    double Pot = slidePot(A1);
  pid.SetTunings(Pot, Ki, Kd);
  
  Serial.println("//El Kp es: ");
  Serial.println(pid.GetKp());
  Serial.println("//");
  
}


/*void potenSampleTime() {
    int Pot = slidePot(A1);
  pid.SetSampleTime(Pot);
  

}*/



void loop() {
  //potenSampleTime();


  //////EL POTENCIOMETRO MODIFICA LA CONSTANTE DE PROPORCIONALIDAD, ES DECIR
  ///QUE TAN RAPIDO SE REGULA EL OUTPUT. SE PUEDE SACAR Y FUNCIONARIA IGUAL.
  // LA FUNCION readKp() modifica el valor de la constante Kp
  // Al deslizar el potenciometro e imprime el valor antes de ejecutar el PID//


  readKp();



  double temperature = requestTemperature(A0);
  input = temperature;
  
  int state = 0;

//////////////////////////
    
  pid.Compute();


//////////////////////////


  analogWrite(PWM, (int)output);
  Serial.println("\nOutput: ");
  Serial.println(output);

  state = digitalReadOutputPin(6);
  Serial.println(state);
  
  delay(1005);
  // put your main code here, to run repeatedly:

  /////LO QUE SIGUE DEL CODIGO ES VER QUE HACEMOS CON EL PULSO PWM Y EL CONTROL
  // DEL MOTOR EN PUENTE EN H. LO SIGUIENTE SERIA VER LA PARTE DE LA FOTOCELULA
  // Y EL CONTROL DE LAS VALVULAS////

}