const int thermistorPin = A0;
const int thermistorNominal = 10000;
const int temperatureNominal = 25;
const int betaValue = 3950;
int redPin = 10;
int greenPin = 11;
int bluePin = 12;
float setPoint = 27.0;
double Kp = 1.0;
double Ki = 0.0;
double Kd = 0.0;
double input = 0.0;
double output = 0.0;
double lastInput = 0.0;
double integral = 0.0;
double outputMin = 0.0;
double outputMax = 100.0;
unsigned long prevTime = 0;
unsigned long deltaTime = 10000;
void setup(){
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
float currentTemperature = temperature();
unsigned long currentTime = millis();
if(currentTime - prevTime >= deltaTime){
double dt = (double)(currentTime - prevTime) / 1000.0;
input = temperature();
double error = setPoint - input;
integral += error * dt;
double dInput = (input - lastInput) / dt;
output = Kp * error + Ki * integral + Kd * dInput;
output = constrain(output, outputMin, outputMax);
lastInput = input;
prevTime = currentTime;
Serial.print("Setpoint: ");
Serial.print(setPoint);
Serial.print(" | Input: ");
Serial.print(input);
Serial.print(" | Output: ");
Serial.println(output);
}
if (setPoint < currentTemperature){
redLED();
}
else{
greenLED();
}
}
float temperature(){
int rawADC = analogRead(thermistorPin);
double resistance = 1023.0 / rawADC - 1.0;
resistance = 10000.0 / resistance;
double steinhart;
steinhart = resistance / thermistorNominal;
steinhart = log(steinhart);
steinhart /= betaValue;
steinhart += 1.0 / (temperatureNominal + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
return steinhart;
}
int redLED(){
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, HIGH);
}
int greenLED(){
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, HIGH);
}