Правки по логике

This commit is contained in:
parent 02cf73cda7
commit b514cedf4c
1 changed files with 55 additions and 20 deletions

View File

@ -1,9 +1,9 @@
#include <microDS18B20.h> #include <microDS18B20.h> // Датчик температуры
// Отладка вывода // Отладка вывода
#define DEBUG 1 #define DEBUG 1
// Отладка ввода // Отладка ввода температуры
#define DEBUG_INPUT 1 #define DEBUG_INPUT 0
// Пин датчика температуры // Пин датчика температуры
#define PIN_SENSOR 2 #define PIN_SENSOR 2
@ -19,8 +19,8 @@ MicroDS18B20<PIN_SENSOR> sensor; // датчик на пине D2
struct struct
{ {
float temp; float temp;
int openTime; uint32_t openTime;
int closeTime; uint32_t closeTime;
} timeouts[MAX_TIMEOUTS]; } timeouts[MAX_TIMEOUTS];
int timeouts_count = 0; // Общее количество зарегистрированных данных о тем-ре и таймаутах 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 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() void setup()
{ {
@ -72,35 +72,44 @@ void setup()
// Настройка реле // Настройка реле
pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0 digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0
// запрашиваем новое измерение с датчика
sensor.requestTemp();
} }
uint32_t tmr; // Для таймера опроса датчика
uint32_t lastRelayTime = 0; // Для управления реле
float currentTemp; // Текущая температура
void loop() void loop()
{ {
static uint32_t tmr; // Для таймера опроса датчика
static uint32_t lastRelayTime = 0; // Для управления реле
static float currentTemp = 0; // Текущая температура
int relayState; // Значение реле на текущий момент int relayState; // Значение реле на текущий момент
int i; // Счетчик для цикла перебора температур int i; // Счетчик для цикла перебора температур
uint32_t current_time = millis(); // Текущее время 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; tmr = current_time;
// читаем прошлое значение // читаем прошлое значение
if (sensor.readTemp()) if (sensor.readTemp())
{ {
#if DEBUG_INPUT == 0
currentTemp = sensor.getTemp(); currentTemp = sensor.getTemp();
#if DEBUG == 1
Serial.println(currentTemp);
#endif // DEBUG
#if DEBUG_INPUT == 1
currentTemp = Serial.parseFloat();
#endif // DEBUG_INPUT #endif // DEBUG_INPUT
} }
#if DEBUG == 1 #if DEBUG == 1
else else
Serial.println("error"); Serial.println("sensor.readTemp error");
#endif // DEBUG #endif // DEBUG
// запрашиваем новое измерение // запрашиваем новое измерение
sensor.requestTemp(); sensor.requestTemp();
@ -123,10 +132,27 @@ void loop()
if (i == timeouts_count) if (i == timeouts_count)
i--; 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) 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) if (current_time < lastRelayTime + timeouts[i].openTime)
{ {
@ -134,13 +160,22 @@ void loop()
} }
else // иначе, 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; lastRelayTime = current_time;
} }
} }
else // иначе, выключить реле else // иначе, выключить реле
{
relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть relayState = LOW; // Считаем что если не попали во время открытия, то реле надо закрыть
lastRelayTime = 0;
}
#if DEBUG == 1
Serial.println("");
#endif // DEBUG
digitalWrite(PIN_RELAY, relayState); // Изменяем значение сигнала на пине для управление реле digitalWrite(PIN_RELAY, relayState); // Изменяем значение сигнала на пине для управление реле
} }