statusUpdate;
205 | String statusThingspeak, statusHtml;
206 |
207 | for (uint8_t i = 0; i < server.args(); i++) {
208 |
209 | if (String(server.argName(i)) == "mode") {
210 | uint8_t reqMode = server.arg(i).toInt();
211 |
212 | if (reqMode < Modes.size() && reqMode != config.mode) {
213 | config.mode = server.arg(i).toInt();
214 | statusUpdate.push_back("Mode: " + String(config.mode));
215 | configUpdate = true;
216 | }
217 | }
218 |
219 | if (String(server.argName(i)) == "temp") {
220 | float_t reqTemp = server.arg(i).toFloat();
221 |
222 | if (reqTemp >= RANGE_TEMP_MIN && reqTemp <= RANGE_TEMP_MAX && reqTemp != config.temperature) {
223 | config.temperature = reqTemp;
224 | statusUpdate.push_back("Temp: " + String(config.temperature));
225 | configUpdate = true;
226 | }
227 | }
228 |
229 | if (String(server.argName(i)) == "hyst") {
230 | float_t reqHysteresis = server.arg(i).toFloat();
231 |
232 | if (reqHysteresis >= RANGE_HYST_MIN && reqHysteresis <= RANGE_HYST_MAX && reqHysteresis != config.hysteresis) {
233 | config.hysteresis = reqHysteresis;
234 | statusUpdate.push_back("Hysteresis: " + String(config.hysteresis));
235 | configUpdate = true;
236 | }
237 | }
238 |
239 | if (String(server.argName(i)) == "interval") {
240 | uint8_t reqInterval = server.arg(i).toInt();
241 |
242 | if (reqInterval >= RANGE_INTERVAL_MIN && reqInterval <= RANGE_INTERVAL_MAX && reqInterval != config.interval) {
243 | config.interval = reqInterval;
244 | statusUpdate.push_back("Interval: " + String(config.interval));
245 | configUpdate = true;
246 | }
247 | }
248 |
249 | if (String(server.argName(i)) == "tsChannelId") {
250 | uint32_t reqTsChannelId = server.arg(i).toInt();
251 |
252 | if (reqTsChannelId > 0 && reqTsChannelId != config.tsChannelId) {
253 | config.tsChannelId = reqTsChannelId;
254 | statusUpdate.push_back("ThingSpeak Channel ID: " + String(config.tsChannelId));
255 | configUpdate = true;
256 | }
257 | }
258 |
259 | if (String(server.argName(i)) == "tsWriteApiKey") {
260 | String reqTsWriteApiKey = server.arg(i);
261 |
262 | if (reqTsWriteApiKey.length() > 0 && reqTsWriteApiKey != config.tsWriteApiKey) {
263 | config.tsWriteApiKey = reqTsWriteApiKey;
264 | statusUpdate.push_back("ThingSpeak Write API Key: ***");
265 | configUpdate = true;
266 | }
267 | }
268 | }
269 |
270 | if (configUpdate) {
271 | saveConfiguration(CONFIG_FILE, config);
272 |
273 | for (size_t i = 0; i < statusUpdate.size(); i++) {
274 | statusThingspeak += statusUpdate.at(i) + " ";
275 | statusHtml += "" + statusUpdate.at(i) + "
\n";
276 | }
277 |
278 | ThingSpeak.setStatus(statusThingspeak);
279 | printFile(CONFIG_FILE);
280 | toggle();
281 | }
282 |
283 | sensors.requestTemperatures(); // Send the command to get temperatures
284 | html += statusHtml;
285 | html += "\n";
294 | html += "Current temp: " + String(sensors.getTempCByIndex(0)) + "°C
\n";
295 | String pinState = digitalRead(PIN_RELAY) > 0 ? "ON" : "OFF";
296 | html += "Cooler/heater state: " + pinState + "
\n";
297 | html += "config »
\n";
298 | html += "\n";
299 | html += htmlFooter;
300 |
301 | server.send(200, "text/html", html);
302 | }
303 |
304 | void handleConfig() {
305 | String html;
306 | html = htmlHeader;
307 | html += "\n";
308 | html += "\n";
313 | html += "\n";
314 | html += "« back
\n";
315 | html += "\n";
316 | html += htmlFooter;
317 |
318 | server.send(200, "text/html", html);
319 | }
320 |
321 | void toggle() {
322 | sensors.requestTemperatures();
323 | float_t currentTemp = sensors.getTempCByIndex(0);
324 |
325 | Serial.println(currentTemp);
326 |
327 | switch (config.mode)
328 | {
329 | case 0: // permanent off
330 | digitalWrite(PIN_RELAY, LOW);
331 | break;
332 |
333 | case 1: // permanent on
334 | digitalWrite(PIN_RELAY, HIGH);
335 | break;
336 |
337 | case 2: // cooling
338 | if (currentTemp - config.hysteresis / 2 >= config.temperature) {
339 | digitalWrite(PIN_RELAY, HIGH);
340 | }
341 | else if (currentTemp + config.hysteresis / 2 <= config.temperature) {
342 | digitalWrite(PIN_RELAY, LOW);
343 | }
344 | break;
345 |
346 | case 3: // heating
347 | if (currentTemp - config.hysteresis / 2 >= config.temperature) {
348 | digitalWrite(PIN_RELAY, LOW);
349 | }
350 | else if (currentTemp + config.hysteresis / 2 <= config.temperature) {
351 | digitalWrite(PIN_RELAY, HIGH);
352 | }
353 | break;
354 | }
355 |
356 | if (WiFi.status() == WL_CONNECTED) {
357 | ThingSpeak.setField(1, currentTemp);
358 | ThingSpeak.setField(2, digitalRead(PIN_RELAY));
359 | uint16_t tsRes = ThingSpeak.writeFields(config.tsChannelId, config.tsWriteApiKey.c_str());
360 |
361 | if (tsRes == 200) {
362 | Serial.println(F("Channel update successful"));
363 | }
364 | else {
365 | Serial.println("Problem updating channel. HTTP error code " + String(tsRes));
366 | }
367 | }
368 | }
--------------------------------------------------------------------------------