PWM fan manual speed override.

This commit is contained in:
Blaz Kristan 2022-08-16 20:57:24 +02:00
parent 90b567c721
commit 0f78bd3785

View File

@ -51,6 +51,7 @@ class PWMFanUsermod : public Usermod {
float targetTemperature = 25.0; float targetTemperature = 25.0;
uint8_t minPWMValuePct = 50; uint8_t minPWMValuePct = 50;
uint8_t numberOfInterrupsInOneSingleRotation = 2; // Number of interrupts ESP32 sees on tacho signal on a single fan rotation. All the fans I've seen trigger two interrups. uint8_t numberOfInterrupsInOneSingleRotation = 2; // Number of interrupts ESP32 sees on tacho signal on a single fan rotation. All the fans I've seen trigger two interrups.
uint8_t pwmValuePct = 0;
// strings to reduce flash memory usage (used more than twice) // strings to reduce flash memory usage (used more than twice)
static const char _name[]; static const char _name[];
@ -83,6 +84,8 @@ class PWMFanUsermod : public Usermod {
} }
void updateTacho(void) { void updateTacho(void) {
// store milliseconds when tacho was measured the last time
msLastTachoMeasurement = millis();
if (tachoPin < 0) return; if (tachoPin < 0) return;
// start of tacho measurement // start of tacho measurement
@ -93,8 +96,6 @@ class PWMFanUsermod : public Usermod {
last_rpm /= tachoUpdateSec; last_rpm /= tachoUpdateSec;
// reset counter // reset counter
counter_rpm = 0; counter_rpm = 0;
// store milliseconds when tacho was measured the last time
msLastTachoMeasurement = millis();
// attach interrupt again // attach interrupt again
attachInterrupt(digitalPinToInterrupt(tachoPin), rpm_fan, FALLING); attachInterrupt(digitalPinToInterrupt(tachoPin), rpm_fan, FALLING);
} }
@ -217,12 +218,30 @@ class PWMFanUsermod : public Usermod {
* Below it is shown how this could be used for e.g. a light sensor * Below it is shown how this could be used for e.g. a light sensor
*/ */
void addToJsonInfo(JsonObject& root) { void addToJsonInfo(JsonObject& root) {
if (tachoPin < 0) return; if (enabled) {
JsonObject user = root["u"]; JsonObject user = root["u"];
if (user.isNull()) user = root.createNestedObject("u"); if (user.isNull()) user = root.createNestedObject("u");
// if (!tempUM) {
JsonArray infoArr = user.createNestedArray(F("Fan speed [%]"));
String uiDomString = F("<div class=\"slider\"><div class=\"sliderwrap il\"><input class=\"noslide\" onchange=\"requestJson({'");
uiDomString += FPSTR(_name);
uiDomString += F("':{'");
uiDomString += FPSTR(_speed);
uiDomString += F("':parseInt(this.value)}});\" oninput=\"updateTrail(this);\" max=100 min=0 type=\"range\" value=");
uiDomString += pwmValuePct;
uiDomString += F(" /><div class=\"sliderdisplay\"></div></div></div>"); //<output class=\"sliderbubble\"></output>
infoArr.add(uiDomString);
// }
if (tachoPin >= 0) {
JsonArray data = user.createNestedArray(FPSTR(_name)); JsonArray data = user.createNestedArray(FPSTR(_name));
data.add(last_rpm); data.add(last_rpm);
data.add(F("rpm")); data.add(F("rpm"));
} else {
JsonArray data = user.createNestedArray(FPSTR(_name));
if (lockFan) data.add(F("locked"));
else data.add(F("auto"));
}
}
} }
/* /*