Skip to content

Commit cc486cd

Browse files
author
James Foster
authored
Trigger a reset if the pH goes below 7.0 (#229)
* Trigger a reset if the pH goes below 7.0 (so bubbler isn't on continually). * format * Avoid tests with pH below 7.0 since that uses an infinite loop to trigger the watchdog timer.
1 parent f6d8059 commit cc486cd

2 files changed

Lines changed: 28 additions & 18 deletions

File tree

src/Devices/PHProbe.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "Devices/PHProbe.h"
22

3+
#include <avr/wdt.h>
4+
35
#include "Devices/Serial_TC.h"
46

57
// class instance variables
@@ -64,6 +66,14 @@ void PHProbe::serialEvent1() {
6466
if (isdigit(string[0])) { // if the first character in the string is a digit
6567
// convert the string to a floating point number so it can be evaluated by the Arduino
6668
value = string.toFloat();
69+
// we have seen situations where the CO2 bubbler stays on and drives the pH down
70+
if (value < 7.0) { // hang so as to trigger the watchdog timer reset
71+
wdt_disable();
72+
wdt_enable(WDTO_15MS);
73+
serial("pH value dropped to %5.3f so trigger a reset!", value);
74+
while (true) {
75+
}
76+
}
6777
} else if (string[0] == '?') { // answer to a previous query
6878
serial("PHProbe serialEvent1: \"%s\"", string.c_str());
6979
if (string.length() > 7 && string.substring(0, 7) == "?SLOPE,") {

test/PHControlTest.cpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ void reset() {
3333
DateTime_TC january(2021, 1, 15, 1, 48, 24);
3434
january.setAsCurrent();
3535
controlSolenoid->enablePID(false);
36-
controlSolenoid->setTargetPh(7.00);
37-
setPhMeasurementTo(7.00);
36+
controlSolenoid->setTargetPh(7.50);
37+
setPhMeasurementTo(7.50);
3838
state->serialPort[0].dataOut = ""; // the history of data written
3939
}
4040

@@ -82,31 +82,31 @@ unittest(bubblerTurnsOnAndOff) {
8282
unittest(afterTenSecondsButPhStillHigher) {
8383
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
8484
assertFalse(controlSolenoid->isOn());
85-
controlSolenoid->setTargetPh(7.00);
86-
setPhMeasurementTo(8.00);
85+
controlSolenoid->setTargetPh(7.50);
86+
setPhMeasurementTo(8.50);
8787
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
8888
assertTrue(controlSolenoid->isOn());
8989
delay(8000);
90-
setPhMeasurementTo(8.00);
90+
setPhMeasurementTo(8.50);
9191
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
9292
assertTrue(controlSolenoid->isOn());
9393
delay(2000);
94-
setPhMeasurementTo(7.25);
94+
setPhMeasurementTo(7.75);
9595
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
9696
assertTrue(controlSolenoid->isOn());
9797
}
9898

9999
unittest(afterTenSecondsAndPhIsLower) {
100100
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
101101
assertFalse(controlSolenoid->isOn());
102-
assertEqual("pH 7.000 7.000", lc->getLines().at(0));
103-
controlSolenoid->setTargetPh(7.00);
104-
setPhMeasurementTo(8.00);
102+
assertEqual("pH 7.500 7.500", lc->getLines().at(0));
103+
controlSolenoid->setTargetPh(7.50);
104+
setPhMeasurementTo(8.50);
105105
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
106106
assertTrue(controlSolenoid->isOn());
107107
assertEqual("CO2 bubbler turned on after 7 ms\r\n", state->serialPort[0].dataOut);
108108
tc->loop();
109-
assertEqual("pH 8.000 B 7.000", lc->getLines().at(0));
109+
assertEqual("pH 8.500 B 7.500", lc->getLines().at(0));
110110
delay(8000);
111111
tc->loop();
112112
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
@@ -118,7 +118,7 @@ unittest(afterTenSecondsAndPhIsLower) {
118118
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
119119
assertFalse(controlSolenoid->isOn());
120120
delay(1000);
121-
setPhMeasurementTo(6.75);
121+
setPhMeasurementTo(7.25);
122122
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
123123
assertFalse(controlSolenoid->isOn());
124124
}
@@ -132,21 +132,21 @@ unittest(beforeTenSecondsButPhIsLower) {
132132
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
133133
assertFalse(controlSolenoid->isOn());
134134
delay(1000);
135-
controlSolenoid->setTargetPh(7.00);
136-
setPhMeasurementTo(8.00);
135+
controlSolenoid->setTargetPh(7.50);
136+
setPhMeasurementTo(8.50);
137137
assertEqual(TURN_SOLENOID_ON, state->digitalPin[PH_CONTROL_PIN]);
138138
assertTrue(controlSolenoid->isOn());
139139
delay(7500);
140-
setPhMeasurementTo(6.75);
140+
setPhMeasurementTo(7.25);
141141
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
142142
assertFalse(controlSolenoid->isOn());
143143
}
144144

145145
unittest(PhEvenWithTarget) {
146146
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
147147
assertFalse(controlSolenoid->isOn());
148-
controlSolenoid->setTargetPh(7.00);
149-
setPhMeasurementTo(7.00);
148+
controlSolenoid->setTargetPh(7.50);
149+
setPhMeasurementTo(7.50);
150150
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
151151
assertFalse(controlSolenoid->isOn());
152152
}
@@ -163,8 +163,8 @@ unittest(disableDuringCalibration) {
163163
// device is initially off and stays off due to calibration
164164
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
165165
assertFalse(controlSolenoid->isOn());
166-
controlSolenoid->setTargetPh(7.00);
167-
setPhMeasurementTo(8.00);
166+
controlSolenoid->setTargetPh(7.50);
167+
setPhMeasurementTo(8.50);
168168
assertEqual(TURN_SOLENOID_OFF, state->digitalPin[PH_CONTROL_PIN]);
169169
assertFalse(controlSolenoid->isOn());
170170
}

0 commit comments

Comments
 (0)