firmware wip - swap PINfan and PINpump, according to PCB

set analogWriteFreq to 220Hz. This was so far the sweetspot for
Fan PWM control in combination with a 47µF electrolyt capacitor.

If I had a PWM pin free, i would use PWM functionality of pc fans
but all pins are in use. So I went with putting a capacitor to the
output and regulate the fan speed this way.
This commit is contained in:
Marcus 2024-04-29 01:32:17 +02:00
parent ace7c8b678
commit ae72fe6188

View file

@ -707,8 +707,10 @@ bool loadEEPROM() {
* *
* -- afterwards added, need to sort -- * -- afterwards added, need to sort --
* *
* 213 UseLEDrelais * 213 PINled_PWM
* 214 TemperatureSensor_Type * 214 TemperatureSensor_Type
* 215 UseFANrelais
* 216 PINfan_PWM
* *
*/ */
@ -768,7 +770,13 @@ bool loadEEPROM() {
// I forgot to add TemperatureSensor_Type to EEPROM and noticed it // I forgot to add TemperatureSensor_Type to EEPROM and noticed it
// quite late in the process of programming. So this value residents // quite late in the process of programming. So this value residents
// in 214 and not directly after UseLEDrelais // in 214 and not directly after UseLEDrelais
EEPROM.get(213, PINled_PWM);
// size is 1 byte
EEPROM.get(214, TemperatureSensor_Type); EEPROM.get(214, TemperatureSensor_Type);
// size is 1 byte
EEPROM.get(215, UseFANrelais);
// size is 1 byte
EEPROM.get(216, PINfan_PWM);
} }
// TODO auth does not work atm // TODO auth does not work atm
// EEPROM.get(160, WebUiUsername); // EEPROM.get(160, WebUiUsername);
@ -798,14 +806,6 @@ bool loadEEPROM() {
// size is 1 byte // size is 1 byte
EEPROM.get(212, DayOfGrow); EEPROM.get(212, DayOfGrow);
// to ensure PINled_PWM always set to 255 when UseLEDrelais is true
// we set it here again, does not matter whats stored.
// size is 1 byte
if(UseLEDrelais == true) {
PINled_PWM = 255;
} else {
EEPROM.get(213, PINled_PWM);
}
} }
@ -837,6 +837,8 @@ bool loadEEPROM() {
Serial.println(ntpOffset); Serial.println(ntpOffset);
Serial.print("UseLEDrelais: "); Serial.print("UseLEDrelais: ");
Serial.println(UseLEDrelais); Serial.println(UseLEDrelais);
Serial.print("UseFANrelais: ");
Serial.println(UseFANrelais);
Serial.println("---- Grow values ----"); Serial.println("---- Grow values ----");
Serial.print("GrowName: "); Serial.print("GrowName: ");
@ -859,6 +861,8 @@ bool loadEEPROM() {
Serial.println(DayOfGrow); Serial.println(DayOfGrow);
Serial.print("PINled_PWM: "); Serial.print("PINled_PWM: ");
Serial.println(PINled_PWM); Serial.println(PINled_PWM);
Serial.print("PINfan_PWM: ");
Serial.println(PINfan_PWM);
} else { } else {
@ -972,6 +976,9 @@ void setup() {
digitalWrite(PINled, LOW); digitalWrite(PINled, LOW);
digitalWrite(PINpump, LOW); digitalWrite(PINpump, LOW);
// set frequency lower to avoid annoying noises
analogWriteFreq(220);
// Start Serial // Start Serial
Serial.begin(115200); Serial.begin(115200);
@ -1438,8 +1445,14 @@ void WEBroot() {
body += "<option disabled value='' selected hidden>---</option>\n"; body += "<option disabled value='' selected hidden>---</option>\n";
body += "<option value='1'>On</option>\n"; body += "<option value='1'>On</option>\n";
body += "<option value='0'>Off</option>\n"; body += "<option value='0'>Off</option>\n";
body += "</select><br>\n"; body += "</select><br>\n";
if(UseFANrelais == false) {
body += "Speed FAN: <input type='range' id='PINfan_PWM' name='PINfan_PWM' min='1' max='255' value='";
body += PINfan_PWM;
body += "'/><br>\n";
}
body += "<input type='submit' value='Save'>\n"; body += "<input type='submit' value='Save'>\n";
body += "</form>"; body += "</form>";
@ -1569,6 +1582,13 @@ void WEBsystemSettings() {
body += "<option value='0'" + returnStrSelected(UseLEDrelais, 0) + ">No</option>\n"; body += "<option value='0'" + returnStrSelected(UseLEDrelais, 0) + ">No</option>\n";
body += "</select><br>\n"; body += "</select><br>\n";
// UseFANrelais bool
body += "Use relais for FAN: <select id='UseFANrelais' name='UseFANrelais' required>\n";
if(configured == false){body += "<option disabled value='' selected hidden>---</option>\n";}
body += "<option value='1'" + returnStrSelected(UseFANrelais, 1) + ">Yes</option>\n";
body += "<option value='0'" + returnStrSelected(UseFANrelais, 0) + ">No</option>\n";
body += "</select><br>\n";
// TODO ugly. can this done be better? // TODO ugly. can this done be better?
// PumpOnTime int // PumpOnTime int
body += "Pump on time: <input type='number' name='PumpOnTime' min='0' max='255' value='"; body += "Pump on time: <input type='number' name='PumpOnTime' min='0' max='255' value='";
@ -1687,6 +1707,12 @@ void WEBgrowSettings() {
body += "'/><br>\n"; body += "'/><br>\n";
} }
if(UseFANrelais == false) {
body += "Speed FAN: <input type='range' id='PINfan_PWM' name='PINfan_PWM' min='1' max='255' value='";
body += PINfan_PWM;
body += "'/><br>\n";
}
body += "<input type='submit' value='Save'>\n"; body += "<input type='submit' value='Save'>\n";
body += "</form>\n"; body += "</form>\n";
body += FPSTR(JSconvertDateToEpoch); body += FPSTR(JSconvertDateToEpoch);
@ -1713,6 +1739,14 @@ void POSTgrowSettings() {
PINled_PWM = webserver.arg("PINled_PWM").toInt(); PINled_PWM = webserver.arg("PINled_PWM").toInt();
} }
if(UseFANrelais == true) {
// if a relais is used to turn on grow light, we force PWM to max val
PINfan_PWM = 255;
} else {
// otherwise just do PWM
PINfan_PWM = webserver.arg("PINfan_PWM").toInt();
}
String GrowName_tmp = webserver.arg("GrowName"); String GrowName_tmp = webserver.arg("GrowName");
GrowName_tmp.toCharArray(GrowName, 32); GrowName_tmp.toCharArray(GrowName, 32);
@ -1743,6 +1777,9 @@ void POSTgrowSettings() {
EEPROM.put(211, SunriseMinute); EEPROM.put(211, SunriseMinute);
// size is 1 byte // size is 1 byte
EEPROM.put(213, PINled_PWM); EEPROM.put(213, PINled_PWM);
// size is 1 byte
EEPROM.put(216, PINfan_PWM);
EEPROM.commit(); EEPROM.commit();
@ -1771,6 +1808,8 @@ void POSTgrowSettings() {
Serial.println(SunriseMinute); Serial.println(SunriseMinute);
Serial.print("PINled_PWM: "); Serial.print("PINled_PWM: ");
Serial.println(PINled_PWM); Serial.println(PINled_PWM);
Serial.print("PINfan_PWM: ");
Serial.println(PINfan_PWM);
webserver.sendHeader("Location", String("/growSettings?success"), true); webserver.sendHeader("Location", String("/growSettings?success"), true);
webserver.send(302, "text/plain", "growSettings/save: success!\n"); webserver.send(302, "text/plain", "growSettings/save: success!\n");
@ -1785,6 +1824,7 @@ void POSTsystemSettings() {
PumpOnTime = webserver.arg("PumpOnTime").toInt(); PumpOnTime = webserver.arg("PumpOnTime").toInt();
UseFan = webserver.arg("UseFan").toInt(); UseFan = webserver.arg("UseFan").toInt();
UseLEDrelais = webserver.arg("UseLEDrelais").toInt(); UseLEDrelais = webserver.arg("UseLEDrelais").toInt();
UseFANrelais = webserver.arg("UseFANrelais").toInt();
TemperatureSensor_Type = webserver.arg("TemperatureSensor_Type").toInt(); TemperatureSensor_Type = webserver.arg("TemperatureSensor_Type").toInt();
configured = true; configured = true;
@ -1807,6 +1847,8 @@ void POSTsystemSettings() {
EEPROM.put(169, UseLEDrelais); EEPROM.put(169, UseLEDrelais);
// size is 1 byte // size is 1 byte
EEPROM.put(214, TemperatureSensor_Type); EEPROM.put(214, TemperatureSensor_Type);
// size is 1 byte
EEPROM.put(215, UseFANrelais);
// write data to EEPROM // write data to EEPROM
EEPROM.commit(); EEPROM.commit();
@ -1828,6 +1870,13 @@ void POSTsystemSettings() {
Serial.println("UseLEDrelais is 1, forcing PINled_PWM to max to prevent relais damage"); Serial.println("UseLEDrelais is 1, forcing PINled_PWM to max to prevent relais damage");
} }
if(UseFANrelais == true) {
PINfan_PWM = 255;
EEPROM.put(215, PINfan_PWM);
EEPROM.commit();
Serial.println("UseFANrelais is 1, forcing PINfan_PWM to max to prevent relais damage");
}
Serial.print("configured: "); Serial.print("configured: ");
Serial.println(configured); Serial.println(configured);
Serial.print("UseFan: "); Serial.print("UseFan: ");
@ -1844,6 +1893,8 @@ void POSTsystemSettings() {
Serial.println(ntpOffset); Serial.println(ntpOffset);
Serial.print("UseLEDrelais: "); Serial.print("UseLEDrelais: ");
Serial.println(UseLEDrelais); Serial.println(UseLEDrelais);
Serial.print("UseFANrelais: ");
Serial.println(UseFANrelais);
Serial.print("TemperatureSensor_Type: "); Serial.print("TemperatureSensor_Type: ");
Serial.println(TemperatureSensor_Type); Serial.println(TemperatureSensor_Type);
@ -1922,6 +1973,7 @@ void POSTwifiSettings() {
void POSTswitchMOSFET() { void POSTswitchMOSFET() {
byte MosfetState = webserver.arg("state").toInt(); byte MosfetState = webserver.arg("state").toInt();
byte MosfetNr = webserver.arg("output").toInt(); byte MosfetNr = webserver.arg("output").toInt();
byte PINfan_PWM = webserver.arg("PINfan_PWM").toInt();
Serial.println(":: GETswitchMOSFET ::"); Serial.println(":: GETswitchMOSFET ::");
Serial.print("MosfetState: "); Serial.print("MosfetState: ");
@ -1935,7 +1987,11 @@ void POSTswitchMOSFET() {
switch(MosfetNr) { switch(MosfetNr) {
case 1: case 1:
if(MosfetState == 1) { if(MosfetState == 1) {
if(UseLEDrelais == true) {
digitalWrite(PINled, MosfetState);
} else {
analogWrite(PINled, PINled_PWM); analogWrite(PINled, PINled_PWM);
}
} else { } else {
digitalWrite(PINled, MosfetState); digitalWrite(PINled, MosfetState);
} }
@ -1944,7 +2000,15 @@ void POSTswitchMOSFET() {
digitalWrite(PINpump, MosfetState); digitalWrite(PINpump, MosfetState);
break; break;
case 3: case 3:
if(MosfetState == 1) {
if(UseFANrelais == true) {
digitalWrite(PINfan, MosfetState); digitalWrite(PINfan, MosfetState);
} else {
analogWrite(PINfan, PINfan_PWM);
}
} else {
digitalWrite(PINfan, MosfetState);
}
break; break;
default: default:
webserver.send(400, "text/plain", "not valid\n"); webserver.send(400, "text/plain", "not valid\n");
@ -1996,7 +2060,7 @@ void APIgetSensors() {
* - PWM for fan control * - PWM for fan control
* - avoid using javascript to set the GrowName in the Menu and the time * - avoid using javascript to set the GrowName in the Menu and the time
* as well * as well
* - * - rework UseLEDrelais usage
* *
* *
*/ */