From b514cedf4c005828fa72270e4235184dad88a638 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 7 Oct 2022 09:28:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TempRelay.ino | 75 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/TempRelay.ino b/TempRelay.ino index 3ed3cfe..1bbd57e 100644 --- a/TempRelay.ino +++ b/TempRelay.ino @@ -1,9 +1,9 @@ -#include +#include // Датчик температуры // Отладка вывода #define DEBUG 1 -// Отладка ввода -#define DEBUG_INPUT 1 +// Отладка ввода температуры +#define DEBUG_INPUT 0 // Пин датчика температуры #define PIN_SENSOR 2 @@ -19,8 +19,8 @@ MicroDS18B20 sensor; // датчик на пине D2 struct { float temp; - int openTime; - int closeTime; + uint32_t openTime; + uint32_t closeTime; } timeouts[MAX_TIMEOUTS]; int timeouts_count = 0; // Общее количество зарегистрированных данных о тем-ре и таймаутах @@ -29,7 +29,7 @@ int timeouts_count = 0; // Общее количество зарегистри #define REGISTER_TIMEOUT(temp_C, openTime_ms, closeTime_ms) timeouts[timeouts_count++] = {temp_C, openTime_ms, closeTime_ms}; // Макрос для удобства записи таймаута в секундах (переводит в мс) -#define SEC_TO_MSEC(time) time*1000 +#define SEC_TO_MSEC(time) (long)time*1000 void setup() { @@ -72,35 +72,44 @@ void setup() // Настройка реле pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0 + + // запрашиваем новое измерение с датчика + sensor.requestTemp(); + } +uint32_t tmr; // Для таймера опроса датчика +uint32_t lastRelayTime = 0; // Для управления реле +float currentTemp; // Текущая температура + void loop() { - static uint32_t tmr; // Для таймера опроса датчика - static uint32_t lastRelayTime = 0; // Для управления реле - static float currentTemp = 0; // Текущая температура int relayState; // Значение реле на текущий момент int i; // Счетчик для цикла перебора температур uint32_t current_time = millis(); // Текущее время - // конструкция программного таймера на 200 мс - if (current_time - tmr >= 200) + +#if DEBUG_INPUT == 1 + byte n = Serial.available(); + if (n == 0) + { + currentTemp = Serial.parseFloat(); + } +#endif // DEBUG_INPUT + // конструкция программного таймера на 800 мс + if (current_time - tmr >= 800) { // Обновляем переменную для таймера опроса датчика tmr = current_time; // читаем прошлое значение if (sensor.readTemp()) { +#if DEBUG_INPUT == 0 currentTemp = sensor.getTemp(); -#if DEBUG == 1 - Serial.println(currentTemp); -#endif // DEBUG -#if DEBUG_INPUT == 1 - currentTemp = Serial.parseFloat(); #endif // DEBUG_INPUT } #if DEBUG == 1 else - Serial.println("error"); + Serial.println("sensor.readTemp error"); #endif // DEBUG // запрашиваем новое измерение sensor.requestTemp(); @@ -123,10 +132,27 @@ void loop() if (i == timeouts_count) i--; - // Если значение индекса параметров таймаута для данной температуры неотрицательное, значит нужно произвести работу с реле на текущей температуре + relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть + // Если значение индекса параметров таймаута для данной температуры неотрицательное, значит нужно произвести работу с реле на текущей + +#if DEBUG == 1 + Serial.print("Temp: "); + Serial.print(currentTemp); + Serial.print(" Time: "); + Serial.print(current_time); + Serial.print(" Relay: "); + Serial.print(lastRelayTime); + Serial.print(" index: "); + Serial.print(i); +#endif // DEBUG if (0 <= i) { - relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть +#if DEBUG == 1 + Serial.print(" openTime: "); + Serial.print(timeouts[i].openTime); + Serial.print(" closeTime: "); + Serial.print(timeouts[i].closeTime); +#endif // DEBUG // Если время открытия ещё не истекло, то открываем реле if (current_time < lastRelayTime + timeouts[i].openTime) { @@ -134,13 +160,22 @@ void loop() } else // иначе, // Если время привышает время закрытия, то необходимо сбросить время управления реле - if (current_time > lastRelayTime + timeouts[i].openTime + timeouts[i].closeTime) + if (current_time > lastRelayTime + timeouts[i].openTime + timeouts[i].closeTime + || !lastRelayTime) { lastRelayTime = current_time; } } else // иначе, выключить реле + { relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть + lastRelayTime = 0; + } + +#if DEBUG == 1 + Serial.println(""); +#endif // DEBUG digitalWrite(PIN_RELAY, relayState); // Изменяем значение сигнала на пине для управление реле + } \ No newline at end of file