DS3231. логика включения и выключению светодиода при времени включении больше, чем время выключения(в след. сутках)
- Войдите на сайт для отправки комментариев
Пнд, 11/04/2016 - 21:12
Задача: включить светодиод например в 19:00, выключить в 18:00 следующих суток. и при этом состояние светодиоды могло восстановиться после отключения сети.
пол дня голову ломаю. для случая включения в течении одних и тех же суток понятно.
Если (Час.сейчас >=Час.вкл И Мин.сейчас>=Мин.вкл И Час.сейчас <= Час.выкл И Мин.сейчас <= Мин.выкл)
{светодиод включить}
иначе выключить
А вот с переходом на следующие сутки как?
если образ идеи, но до ума не доводится никак...
Если (Тсейчас[год*12*31*24*60*60 + месяц*31*24*60*60+день*24*60*60+час*60*60+минуты*60+секунды] >= Твкл[год*12*31*24*60*60 + месяц*31*24*60*60+день*24*60*60+час*60*60+минуты*60+секунды] И Тсейчас[год*12*31*24*60*60 + месяц*31*24*60*60+день*24*60*60+час*60*60+минуты*60+секунды] <= Твкл[год*12*31*24*60*60 + месяц*31*24*60*60+день*24*60*60+час*60*60+минуты*60+секунды +24*60*60]
к времени выключения добавляется 24часа и общая сумма секунд ВЫКЛЮЧЕНИЯ получается больше чем сумма секунд ВКЛЮЧЕНИЯ.
разово вприницпи должно сработать... а чтоб ежедневно работало...
Если речь идёт о промежутке времени менее суток, то годы, месяцы и дни нам не понадобятся, схематично будет так :
boolean состояние_действия; if ( время_начала_действия > время_окончания_действия ) // часы, минуты, секунды для сравнений преобразуем в количество секунд. { состояние_действия = ( текущее_время >= время_начала_действия || текущее_время <= время_окончания_действия ); } else { состояние_действия = ( текущее_время >= время_начала_действия && текущее_время <= время_окончания_действия ); }Надеюсь, не слишком заумно написал )).
день сравнивайте
Делаю так, кусок из проекта:
bool CheckCanWork(uint8_t currentHour, uint8_t currentMinute, uint8_t startHour, uint16_6 duration_in_minutes) { bool canWork = true; // считаем, что мы можем работать if(start_hour == 0 && duration_in_minutes == 0) // работаем всегда return canWork; // создаём диапазон для проверки uint16_t startDia = startHour*60; uint16_t stopDia = startDia + duration_in_minutes; // если мы находимся между этим диапазоном, то мы можем работать в это время, // иначе - не можем, и просто выставляем флаг работы в false. // надо отразить текущее время в этот диапазон. Существует одна особенность диапазона: // если он полностью попадает в текущие сутки, то мы просто смотрим, попадает ли // текущее время в этот диапазон. Иначе (например, час начала 23, продолжительность - // 120 минут, т.е. работа закончится на следующие сутки, в час ночи) нам надо отразить // текущий час на этот диапазон, т.е. виртуально продлить сутки. Для этого к текущему // времени прибавляем кол-во минут в сутках. const uint16_t mins_in_day = 1440; // кол-во минут в сутках uint16_t checkMinutes = currentHour*60 + currentMinute; // текущее время в минутах if(stopDia >= mins_in_day) { // правая граница диапазона перешагнула на следующие сутки, // отражаем диапазон текущего часа на следующие сутки // только в том случае, если текущий час меньше, чем час начала работы if(currentHour < startHour) checkMinutes += mins_in_day; } // проверяем попадание в диапазон canWork = checkMinutes >= startDia && checkMinutes <= stopDia; return canWork; }Можно пришпилить и проверку на день начала работы, если надо. Ни на что не претендую, если что.
Если речь идёт о промежутке времени менее суток, то годы, месяцы и дни нам не понадобятся, схематично будет так :
boolean состояние_действия; if ( время_начала_действия > время_окончания_действия ) // часы, минуты, секунды для сравнений преобразуем в количество секунд. { состояние_действия = ( текущее_время >= время_начала_действия || текущее_время <= время_окончания_действия ); } else { состояние_действия = ( текущее_время >= время_начала_действия && текущее_время <= время_окончания_действия ); }Надеюсь, не слишком заумно написал )).
Изящно ;)
проверку на день пока стараюсь избежать.
пока засыпал пришла идея в голову. правда наверное свет успеет моргнуть..а может и пытаться не будет)
if (t_вкл < t_выкл) { if (t_сейчас >= t_вкл && t_сейчас < t_выкл) { led_on } else { led_off } } else // if (t_вкл > t_выкл) { if ((t_сейчас >= t_вкл && t_сейчас <= 23:59:59) || ( t_сейчас >= 00:00:00 && t_сейчас < t_выкл )) led_on } else { led_off } }просто включить и просто выключить проблем нет, а вот чтоб состояние пина востановилось после отключения электричества в этот промежуток...для меня проблема.
но вроде бы должна работать пришедшая идея. не сработает - буду разбираться в подсказках.
Просто добавить в setup
Разве нет?
господа, всем спасибо .