This commit is contained in:
Vincent van der Wal
2025-12-18 20:15:12 +01:00
parent 4517100bf7
commit 45899e082c
4 changed files with 110 additions and 8 deletions
+30 -4
View File
@@ -36,13 +36,17 @@ float derivedOverShoot = targetTemp;
float derivedUnderShoot = targetTemp;
unsigned long lastSwitch = 0;
unsigned long autoSwitchDelay = 20000; // 20s
float pwmSwitchDelayOn = 4000; // 4s
float pwmSwitchDelayOff = 7000; // 7s
float pwmSwitchDelayOn = 2000; // 4s
float pwmSwitchDelayOff = 4000; // 7s
float power = 0;
float kp = 0.25;
float ki = 0.25;
float kd = 0.25;
String mode = "off";
PIDController pid(1.0, 0.5, 1.0, 100.0, 0.0, 50.0); // Kp, Ki, Kd, max, min, integ_max
PIDController pid(kp, ki, kd, 100.0, 0.0, 50.0); // Kp, Ki, Kd, max, min, integ_max
// Get Sensor Readings and return JSON object
String getSensorReadings()
@@ -68,6 +72,10 @@ String getSensorReadings()
readings["pwm_on"] = pwmSwitchDelayOn;
readings["pwm_off"] = pwmSwitchDelayOff;
readings["kp"] = kp;
readings["ki"] = ki;
readings["kd"] = kd;
serializeJson(readings, jsonString);
return jsonString;
}
@@ -168,6 +176,24 @@ void handleWebSocketMessage(void *arg, uint8_t *data, size_t len)
Serial.printf("\nMode set to ");
Serial.print(mode);
}
if (message.startsWith("setKp"))
{
String k = message.substring(6, 12);
kp = k.toFloat();
// pid.setSetKp(0.3);
}
if (message.startsWith("setKi"))
{
String k = message.substring(6, 12);
ki = k.toFloat();
// pid.setSetKp(0.3);
}
if (message.startsWith("setKd"))
{
String k = message.substring(6, 12);
kd = k.toFloat();
// pid.setSetKp(0.3);
}
if (message.startsWith("setPWMOn"))
{
String target = message.substring(10, 15);
@@ -327,7 +353,7 @@ void setup()
// Create PID controller instance
pid.setSetpoint(targetTemp);
pid.setDt(4);
pid.setDt(2);
ElegantOTA.begin(&server);
+15
View File
@@ -20,6 +20,21 @@ void PIDController::setSetpoint(double sp)
setpoint = sp;
}
void PIDController::setSetKp(double nkp)
{
kp = nkp;
}
void PIDController::setSetKi(double nki)
{
ki = nki;
}
void PIDController::setSetKd(double nkd)
{
kd = nkd;
}
void PIDController::setDt(double sample_time)
{
dt = sample_time;
+4
View File
@@ -17,6 +17,10 @@ public:
double integ_max = 50.0);
void setSetpoint(double sp);
void setSetKp(double nkp);
void setSetKi(double nki);
void setSetKd(double nkd);
void setDt(double sample_time);
double compute(double current_temp);
void reset();
+61 -4
View File
@@ -35,10 +35,14 @@
let spoofInterval = 250;
let speedFactor = 250 / spoofInterval;
const switchDelay = (30 / speedFactor) * 1000;
let pwmOn = $state(4);
let pwmOnDelay = (4 / speedFactor) * 1000;
let pwmOff = $state(7);
let pwmOffDelay = (7 / speedFactor) * 1000;
let pwmOn = $state(2);
let pwmOnDelay = (2 / speedFactor) * 1000;
let pwmOff = $state(4);
let pwmOffDelay = (4 / speedFactor) * 1000;
let kp = $state(0.25);
let ki = $state(0.25);
let kd = $state(0.25);
let maxValues = 4 * 2 * 60 * 60; // 120 minutes (4 values/sec)
@@ -361,6 +365,12 @@
pwmOn = Number(myObj[key]) / 1000;
} else if (key === 'pwm_off') {
pwmOff = Number(myObj[key]) / 1000;
} else if (key === 'kp') {
kp = Number(myObj[key]);
} else if (key === 'ki') {
ki = Number(myObj[key]);
} else if (key === 'kd') {
kd = Number(myObj[key]);
} else if (key === 'mode') {
mode = myObj[key];
modeSpan.innerText = mode;
@@ -443,6 +453,16 @@
}
};
const changeKValue = (e: Event, k: string) => {
const target = e.target as HTMLTextAreaElement;
let value = target?.value;
console.log('K' + k + ': ' + value);
if (!import.meta.env.DEV) {
ws.send(`setK${k}: ` + value);
} else {
}
};
const prepareDownloadCSV = () => {
let csvContent = 'Time,Temp,Relais\n';
@@ -568,6 +588,43 @@
PID: {calculatedPidOutput.toFixed(0)}% {(calculatedPidOutput * 12).toFixed(0)}W
</div>
<div>ON:{pwmOn.toFixed(2)}s OFF:{pwmOff.toFixed(2)}s</div>
<div class="mt-3 flex w-full justify-between px-9">
<div>Kp</div>
<div>Ki</div>
<div>Kd</div>
</div>
<div class="flex gap-1">
<input
class="min-w-[85px] rounded"
type="number"
min="0"
max="50"
step="0.1"
value={kp}
id="target_temperature"
onchange={(e) => changeKValue(e, 'p')}
/>
<input
class="min-w-[85px] rounded"
type="number"
min="0"
max="50"
step="0.1"
value={ki}
id="target_temperature"
onchange={(e) => changeKValue(e, 'i')}
/>
<input
class="min-w-[85px] rounded"
type="number"
min="0"
max="50"
step="0.1"
value={kd}
id="target_temperature"
onchange={(e) => changeKValue(e, 'd')}
/>
</div>
{/if}
</div>
<div class="card flex cursor-pointer gap-2">