Главная » Статьи » Общая тематика |
Работаем с 8:30 до 19:00
Выдалось немного свободного времени, и я решил поделиться своими наработками. Описания устройства я не планировал, скажу кратко. Там есть часы реального времени, микроконтроллер и 4 реле. Одной из задач МК является включать и выключать выбранные пользователем реле (то есть, устройства, подключенные этим же пользователем к этим реле) в определенные интервалы суток. Так называемый автомат включения и выключения нагрузки. Так вот, с задачей чтения времени и даты я справился, а вот с временем включения и выключения повозился. Искал в сети алгоритм, но не обнаружил подходящего. Предлагаю свой вариант. Возможно, не оригинальный, но все же, кого-то подтолкнет к решению своей задачи. Итак, имеем время в обычном формате ЧЧ:ММ:СС. ![]() Для удобства назовем их HH:MM:SS Это реальное текущее время. Тот же формат имеет и время включения и выключения. Не важно, как мы их получили. Обозначим их как - HHon:MMon:SSon - время требуемого включения. И соответственно - HHoff:MMoff:SSoff - время требуемого выключения. Идея проста: преобразуем этот формат в секунды. Если нужна миллисекундная точность, то в миллисекунды, но число огромное уже получится. Получаем текущее время: HH*3600 + MM*60 + SS Таким же макаром получаем и время вкл/выкл. Дадим имена переменным, которые будут хранить это время: RealTime, OnTime и OffTime. При секундной точности требуется переменная размерностью в 4 байта, при минутной - достаточно двухбайтной переменной. Для примера возьмем реальные цифры. Текущее время - пусть будет 13:26:07, время включения 12:20:00, Время выключения 17:30:00 Я не буду привязываться к какому-то языку, описываю лишь алгоритм. Итак - RealTime = 13*3600 + 26*60 + 07 = 48367 секунд, OnTime = 12*3600 + 20*60 + 00 = 44400 секунд, OffTime = 17*3600 + 30*60 + 00 = 63000 секунд. Далее создаем алгоритм для определения момента включения нагрузки. Если текущее время больше или равно времени включения и меньше времени выключения, то включаем нагрузку. В простом варианте выглядит так: If (RealTime >= OnTime) And (RealTime < OffTime) Then Relay = Work Else Relay = NoWork EndIf В общем случае этот вариант работает. И в данном примере можно проверить: 48367 больше, чем 44400, но меньше, чем 63000. Но давайте представим, что юзеру ни с того ни с сего понадобилось включить, к примеру, вентилятор, в 21:40:00, а выключить - в 00:20:00. Вышеприведенное условие не выполнится. Как быть в этом случае? Условие немного усложняется: If ((RealTime >= OnTime) And (RealTime < OffTime)) Or_ ((RealTime > OffTime) And (OffTime < OnTime))Then Relay = Work Else Relay = NoWork EndIf Прочитаем это условие по-русски: Если текущее время в данный момент больше или равно времени включения, но пока еще меньше времени выключения, а также, если оно больше времени включения, и при этом время выключения меньше времени включения, то разрешаем работу. Вторая часть условия проверяет, если время выключения меньше времени включения, то значит интервал нужного нам времени переходит через ноль часов. И таким образом, пока текущее время меньше времени выключения - работаем. Но опять же, мы можем оказаться сразу при включении в этом интервале, который не будет охватываться условием. Поэтому добавим еще одно: If ((RealTime >= OnTime) And (RealTime < OffTime)) Or_ ((RealTime > OffTime) And (OffTime < OnTime)) Or_ (RealTime < OffTime) And (RealTime < OnTime) And (OnTime > OffTime) Then Relay = Work Else Relay = NoWork EndIf Добавилась следующая проверка: Если, независимо от первых двух условий, текущее время меньше и времени включения и времени выключения, и при этом время включения больше времени выключения,то также разрешаем работу. Дабы не писать монструозную проверку в одно условие, я делаю так: Dim a As Bit Dim b As Bit Dim c As Bit If ((RealTime >= OnTime) And (RealTime < OffTime)) Then a = 1 else a = 0 EndIf И так далее... В конце проверяю: If (a = 1 Or b = 1 Or с = 1) Then Relay = Work Else Relay = NoWork EndIf Мое устройство находится на стадии завершения разработки ПО, но данная часть работает. Если у кого-то есть замечания - прошу! | |
Просмотров: 4623 | Комментарии: 13 | | |