DS3231. логика включения и выключению светодиода при времени включении больше, чем время выключения(в след. сутках)

rapidshe
Offline
Зарегистрирован: 31.12.2015

Задача: включить светодиод например в 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часа и общая сумма секунд ВЫКЛЮЧЕНИЯ получается больше чем сумма секунд ВКЛЮЧЕНИЯ.

разово вприницпи должно сработать... а чтоб ежедневно работало...

Araris
Offline
Зарегистрирован: 09.11.2012

Если речь идёт о промежутке времени менее суток, то годы, месяцы и дни нам не понадобятся, схематично будет так :

boolean состояние_действия; 

if ( время_начала_действия > время_окончания_действия )  // часы, минуты, секунды для сравнений преобразуем в количество секунд.

 { состояние_действия = ( текущее_время >= время_начала_действия || текущее_время <= время_окончания_действия ); }

else

 { состояние_действия = ( текущее_время >= время_начала_действия && текущее_время <= время_окончания_действия ); }

Надеюсь, не слишком заумно написал )).

MacSim
Offline
Зарегистрирован: 28.11.2012

день сравнивайте

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Делаю так, кусок из проекта:

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;
}

Можно пришпилить и проверку на день начала работы, если надо. Ни на что не претендую, если что.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Araris пишет:

Если речь идёт о промежутке времени менее суток, то годы, месяцы и дни нам не понадобятся, схематично будет так :

boolean состояние_действия; 

if ( время_начала_действия > время_окончания_действия )  // часы, минуты, секунды для сравнений преобразуем в количество секунд.

 { состояние_действия = ( текущее_время >= время_начала_действия || текущее_время <= время_окончания_действия ); }

else

 { состояние_действия = ( текущее_время >= время_начала_действия && текущее_время <= время_окончания_действия ); }

Надеюсь, не слишком заумно написал )).

Изящно ;)

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

проверку на день пока стараюсь избежать.

пока засыпал пришла идея в голову. правда наверное свет успеет моргнуть..а может и пытаться не будет)

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
      }
   }

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

rapidshe пишет:
Задача: включить светодиод например в 19:00, выключить в 18:00 следующих суток. и при этом состояние светодиоды могло восстановиться после отключения сети.
Если задачу перефразировать: выключить в 18:00, включить в 19:00, то и проблем никаких нет.

rapidshe
Offline
Зарегистрирован: 31.12.2015

просто включить и просто выключить проблем нет, а вот чтоб состояние пина востановилось после отключения электричества в этот промежуток...для меня проблема.

но вроде бы должна работать пришедшая идея. не сработает - буду разбираться в подсказках.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Просто добавить в setup

if (t>Tвыкл && t<Tвкл) выключить; else включить;

Разве нет?

trad72
Offline
Зарегистрирован: 12.04.2016

господа, всем спасибо .