diff --git a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp index 7c450d6bef7b0072ab4e5de1593337f16bd86a4a..6a385fdd9c50d9c834544f4224f99fc3a16340b2 100644 --- a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp +++ b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.cpp @@ -16,6 +16,7 @@ // qthing stuff #include <qthing> +//#include <qthing/mqtt_common.hpp> #include "SiliconTorch/CyanBus.hpp" // misc @@ -25,6 +26,7 @@ using nlohmann::json; using SpiderLib::Time; + static const char* TAG = "SpiderFurnace"; @@ -97,61 +99,89 @@ namespace SiliconTorch { // Set-up PID controller - pidTask = new SpiderLib::Util::LambdaTask([&](){ + if (CFG_EN_PIDTask) { + + pidTask = new SpiderLib::Util::LambdaTask([&](){ + + TickType_t lastWakeTime = xTaskGetTickCount(); + tc0age = Time::ms(); + + f32 error = 0.0f; + f32 sum_error = 0.0f; + f32 diff_error = 0.0f; + f32 last_error = 0.0f; + + while (true) { + + faultReg.value = tc0->readU8(MAX31856::SR::addr); + + if (!hasFault()) { + f32 t = tc0->getTemperature(); - TickType_t lastWakeTime = xTaskGetTickCount(); - tc0age = Time::ms(); + f32 deltaT = abs(t - temperature()); + //if (deltaT < 0) deltaT *= -1.0f; - f32 error = 0.0f; - f32 sum_error = 0.0f; - f32 diff_error = 0.0f; - f32 last_error = 0.0f; + f32 tc0age_ = (Time::ms() - tc0age) / 1000.0f; // change to seconds + if (deltaT > tc0age_ * MaxTempChangePerSecond) { // temp changed too fast! + faultReg.OPEN = true; // mimic fault! + } else { + tc0dat->insert(t); + tc0age = Time::ms(); + } + } + + f32 t = temperature(); - while (true) { + if (!hasFault() && t <= MAX_TEMP) { - faultReg.value = tc0->readU8(MAX31856::SR::addr); + error = targetTemperature - t; + sum_error += error; // TODO: "I festhalten" + diff_error = last_error - error; + last_error = error; - if (!hasFault()) { - f32 t = tc0->getTemperature(); + f32 out = kP * error; + out += kI * sum_error; + out += kD * diff_error; - f32 deltaT = abs(t - temperature()); - //if (deltaT < 0) deltaT *= -1.0f; + // if (out > MAX_PWM) + // TODO: "I festhalten" ?? - f32 tc0age_ = (Time::ms() - tc0age) / 1000.0f; // change to seconds - if (deltaT > tc0age_ * MaxTempChangePerSecond) { // temp changed too fast! - faultReg.OPEN = true; // mimic fault! + setPWM(out); } else { - tc0dat->insert(t); - tc0age = Time::ms(); + setPWM(0.0f); } + + ESP_LOGI(TAG, "T: %.2f °C Fault: %s _i: %.2f PWM: %.2f", t, hasFault() ? "true" : "false", sum_error, pwmVal); + + vTaskDelayUntil(&lastWakeTime, 1000 / TICK_FREQ / portTICK_PERIOD_MS); } + }); - f32 t = temperature(); + } else { - if (!hasFault() && t <= MAX_TEMP) { + qthing::add_message_callback(deviceTopic(TAG, "setPWM"), [&](const str& message) { + setPWM(std::strtof(message.c_str(), NULL)); + }); - error = targetTemperature - t; - sum_error += error; // TODO: "I festhalten" - diff_error = last_error - error; - last_error = error; + } - f32 out = kP * error; - out += kI * sum_error; - out += kD * diff_error; - // if (out > MAX_PWM) - // TODO: "I festhalten" ?? + if (CFG_EN_MQTT_PIDvals) { - setPWM(out); - } else { - setPWM(0.0f); - } + qthing::add_message_callback(deviceTopic(TAG, "kP"), [&](const str& message) { + kP = std::strtof(message.c_str(), NULL); + }); + + qthing::add_message_callback(deviceTopic(TAG, "kI"), [&](const str& message) { + kI = std::strtof(message.c_str(), NULL); + }); + + qthing::add_message_callback(deviceTopic(TAG, "kD"), [&](const str& message) { + kD = std::strtof(message.c_str(), NULL); + }); - ESP_LOGI(TAG, "T: %.2f °C Fault: %s _i: %.2f PWM: %.2f", t, hasFault() ? "true" : "false", sum_error, pwmVal); + } - vTaskDelayUntil(&lastWakeTime, 1000 / TICK_FREQ / portTICK_PERIOD_MS); - } - }); } void SpiderFurnace::setTargetTemperature(f32 t) { diff --git a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp index 9a56695f13baf216f3b7f288a94790f246fa0bc5..13dd81a0b588e57ce20d1ef5a232bb08db114b65 100644 --- a/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp +++ b/CLC-qthing/SiliconTorch/Service/SpiderFurnace.hpp @@ -45,15 +45,23 @@ namespace SiliconTorch { constexpr u8 IO_HEATER = 25; - enum FurnaceState { - RUNNING, - PAUSED, - STOPPED - }; + // enum FurnaceState { + // RUNNING, + // PAUSED, + // STOPPED + // }; + + + + + // TODO: ??? + // Compile-time config + constexpr bool CFG_EN_PIDTask = false; // !! + constexpr bool CFG_EN_MQTT_PIDvals = true; - class SpiderFurnace : public ServiceManager::Service { + class SpiderFurnace : public ServiceManager::Service, public SpiderLib::HasMQTT { public: