#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////
}