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