diff --git a/src/main.cpp b/src/main.cpp index 28c3434..642ab80 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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); diff --git a/src/pid.cpp b/src/pid.cpp index f2eb8cd..40c7fb1 100644 --- a/src/pid.cpp +++ b/src/pid.cpp @@ -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; diff --git a/src/pid.h b/src/pid.h index 3dfb307..caa98ed 100644 --- a/src/pid.h +++ b/src/pid.h @@ -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(); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 70af113..c988ad2 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -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