Правки по логике
This commit is contained in:
parent
02cf73cda7
commit
b514cedf4c
|
@ -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); // Изменяем значение сигнала на пине для управление реле
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue