#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>
// Definieer pinnen
#define PTC1_PIN 3
#define PTC2_PIN 5
#define FAN_HEAT_PIN 6
#define FAN_CIRC_PIN 9
#define ONE_WIRE_BUS 2
// Variabelen voor PWM waarden
int ptc1PWM = 0;
int ptc2PWM = 0;
int fanHeatPWM = 0;
int fanCircPWM = 0;
// Temperatuur variabelen
float temp1 = 0;
float temp2 = 0;
float setpoint = 60.0; // Gewenste temperatuur
// PID parameters
double Setpoint, Input, Output;
double Kp = 2.0, Ki = 0.5, Kd = 1.0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
// Temperatuur sensors
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempSensor1, tempSensor2;
void setup() {
Serial.begin(9600);
// Stel PWM pinnen in als output
pinMode(PTC1_PIN, OUTPUT);
pinMode(PTC2_PIN, OUTPUT);
pinMode(FAN_HEAT_PIN, OUTPUT);
pinMode(FAN_CIRC_PIN, OUTPUT);
// Start temperatuur sensors
sensors.begin();
// Zoek en identificeer temperatuur sensors
if (!sensors.getAddress(tempSensor1, 0)) {
Serial.println("Sensor 1 niet gevonden!");
}
if (!sensors.getAddress(tempSensor2, 1)) {
Serial.println("Sensor 2 niet gevonden!");
}
// Stel PID in
Setpoint = setpoint;
myPID.SetMode(AUTOMATIC);
myPID.SetOutputLimits(0, 255);
myPID.SetSampleTime(1000);
// Stel resolutie in op 10-bit (0.25°C precisie)
sensors.setResolution(10);
Serial.println("Systeem gestart");
}
void loop() {
// Lees temperaturen
sensors.requestTemperatures();
temp1 = sensors.getTempC(tempSensor1);
temp2 = sensors.getTempC(tempSensor2);
// Gebruik de hoogste temperatuur voor PID controle
Input = max(temp1, temp2);
// Bereken PID output
myPID.Compute();
// Verdeel PID output over PTC elementen
int totalHeat = (int)Output;
ptc1PWM = constrain(totalHeat / 2, 0, 255);
ptc2PWM = constrain(totalHeat - ptc1PWM, 0, 255);
// Regel ventilatoren gebaseerd op temperatuur
controlFans();
// Pas PWM waarden toe
analogWrite(PTC1_PIN, ptc1PWM);
analogWrite(PTC2_PIN, ptc2PWM);
analogWrite(FAN_HEAT_PIN, fanHeatPWM);
analogWrite(FAN_CIRC_PIN, fanCircPWM);
// Toon status via serial
printStatus();
delay(1000); // Wacht 1 seconde
}
void controlFans() {
// Verwarmingsventilator - sneller bij hogere temperatuur
if (Input > 40) {
fanHeatPWM = map(constrain(Input, 40, 70), 40, 70, 100, 255);
} else {
fanHeatPWM = 0;
}
// Circulatieventilator - altijd aan maar variërend
if (Input > 30) {
fanCircPWM = map(constrain(Input, 30, 70), 30, 70, 50, 200);
} else {
fanCircPWM = 30; // Laag toerental voor basis circulatie
}
}
void printStatus() {
Serial.print("Setpoint: ");
Serial.print(Setpoint);
Serial.print("°C | Temp1: ");
Serial.print(temp1);
Serial.print("°C | Temp2: ");
Serial.print(temp2);
Serial.print("°C | PID Output: ");
Serial.print(Output);
Serial.print(" | PTC1: ");
Serial.print(ptc1PWM);
Serial.print(" | PTC2: ");
Serial.print(ptc2PWM);
Serial.print(" | Fan Heat: ");
Serial.print(fanHeatPWM);
Serial.print(" | Fan Circ: ");
Serial.println(fanCircPWM);
}
// Functie om PID parameters aan te passen via serial
void serialEvent() {
while (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim();
if (input.startsWith("SET ")) {
setpoint = input.substring(4).toFloat();
Setpoint = setpoint;
Serial.print("Setpoint veranderd naar: ");
Serial.println(setpoint);
}
else if (input.startsWith("KP ")) {
Kp = input.substring(3).toFloat();
myPID.SetTunings(Kp, Ki, Kd);
Serial.print("Kp veranderd naar: ");
Serial.println(Kp);
}
else if (input.startsWith("KI ")) {
Ki = input.substring(3).toFloat();
myPID.SetTunings(Kp, Ki, Kd);
Serial.print("Ki veranderd naar: ");
Serial.println(Ki);
}
else if (input.startsWith("KD ")) {
Kd = input.substring(3).toFloat();
myPID.SetTunings(Kp, Ki, Kd);
Serial.print("Kd veranderd naar: ");
Serial.println(Kd);
}
}
}