From b3b68c04e1099491bd195fc2544c1896a29efab2 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 7 Oct 2022 09:41:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TempRelay.ino | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/TempRelay.ino b/TempRelay.ino index 1993ee0..ef7be9e 100644 --- a/TempRelay.ino +++ b/TempRelay.ino @@ -17,7 +17,7 @@ MicroDS18B20 sensor; // датчик на пине D2 #define MAX_TIMEOUTS 10 // Структура для хранения данных о температуре и таймаутах -struct +struct TIMEOUT_DATA { float temp; uint32_t openTime; @@ -32,6 +32,16 @@ int timeouts_count = 0; // Общее количество зарегистри // Макрос для удобства записи таймаута в секундах (переводит в мс) #define SEC_TO_MSEC(time) (long)time*1000 +// функция сравнения элементов для qsort по возрастанию +int qsort_compare(const void *cmp1, const void *cmp2) +{ + // Указатели для простоты работы + struct TIMEOUT_DATA *a = (struct TIMEOUT_DATA *)cmp1; + struct TIMEOUT_DATA *b = (struct TIMEOUT_DATA *)cmp2; + // если значение отрицательное, то a < b, если положительное, то a > b, иначе равны + return a->temp - b->temp; +} + void setup() { // Для отладочной печати @@ -43,7 +53,6 @@ void setup() // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // // НИЖЕ РЕГИСТРИРУЕТСЯ ВРЕМЯ И ТАЙМАУТЫ ОТКРЫТИЯ/ЗАКРЫТИЯ РЕЛЕ // - // ЗНАЧЕНИЯ ДОЛЖНЫ БЫТЬ ОТСОРТИРОВАНЫ ПО ВОЗРАСТАНИЮ ТЕМПЕРАТУРЫ // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // REGISTER_TIMEOUT(83, 300, SEC_TO_MSEC(150)); @@ -60,7 +69,6 @@ void setup() // ВЫШЕ РЕГИСТРИРУЕТСЯ ВРЕМЯ И ТАЙМАУТЫ ОТКРЫТИЯ/ЗАКРЫТИЯ РЕЛЕ // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // - // Проверка что не было зарегистрировано больше данных, чем это возможно if (timeouts_count >= MAX_TIMEOUTS) { @@ -70,6 +78,9 @@ void setup() while(1); // Программа не запуститься дальше, если допущена ошибка } + // Сортировка массива по времени, критично для алгоритма + qsort(timeouts, timeouts_count, sizeof(timeouts[0]), qsort_compare); + // Настройка реле pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход digitalWrite(PIN_RELAY, LOW); // Выключаем реле - посылаем сигнал 0