Как реализовать суточный таймер?

Тема в разделе "Arduino & Shields", создана пользователем saniks, 25 янв 2014.

  1. saniks

    saniks Нуб

    Помогите придумать алгоритм суточного таймера. Задается время начала и конца включения. Например 12.00 - 14.00, т.е. включить в 12.00, выключить в 14.00 Или 23.30 - 05.30.

    Сам к сожалению смог придумать только варианты с кучей if .. else, которые неправильно работали если время выключения ниже времени включения.
    Код (Text):
    void check_time(byte vkl_hour, byte vkl_min, byte vikl_hour, byte vikl_min)
    {
      if (hour >= x && minute >= y && hour <=o && minute <p)
        {
          digitalWrite(nagruzka, HIGH);
        }
       
      else digitalWrite(nagruzka, LOW);
      ..
      ..
    }
     
  2. Mactep8

    Mactep8 Нерд

    А почему нельзя так:

    if (hour = vkl_hour && minute = vkl_min) digitalWrite(nagruzka, HIGH);
    if (hour = vikl_hour && minute = vikl_min) digitalWrite(nagruzka, LOW);
     
  3. Unixon

    Unixon Оракул Модератор

    rav_75 нравится это.
  4. geher

    geher Гуру

    Примерно так
    Код (Text):
    void check_time(byte vkl_hour, byte vkl_min, byte vikl_hour, byte vikl_min)
    {
       // переводим время в количество минут с начала суток (меньше толкотни с часами-минутами)
       int vkl_time=vkl_hour*60+vkl_min;
       int vikl_time=vikl_hour*60+vikl_min;
       int now=hour*60+minute;
       if (
             // включение раньше выключения
             (
               (vkl_time<vikl_time)&&
               ((vkl_time<=now)&&(now<vikl_time))
             ) ||
             // включение позже выключения (работа через полночь)
             (
               (vkl_time>vikl_time)&&
               ((now<vikl_time)||(vkl_time<=now))
             )
          )
       {
          digitalWrite(nagruzka, HIGH);
       } else {
          digitalWrite(nagruzka, LOW);
       }
    }
     
    Последнее редактирование: 25 янв 2014
    Tomasina нравится это.
  5. geher

    geher Гуру

    Это можно использовать, если не предполагаются возможные выключения "тонкой управляющей электроники" "в самый ответственный момент", в то время как включить или выключить лучше поздно, чем никогда.
     
  6. CryNET

    CryNET Гик

    Возможно так - работоспособность кода не проверял...
    P.S. Код из внешнего источника (не правильный)

    Код (Text):

    Код наказан за неработоспособность ;)
     
     
    Последнее редактирование: 28 янв 2014
  7. rav_75

    rav_75 Гик

    CryNET, код "условно" рабочий ;)
    Unixon, четкая ссылка, в тему :D
     
    Последнее редактирование: 28 янв 2014
  8. saniks

    saniks Нуб

    Спасибо всем за помощь! Код geher полностью рабочий.
    Пожалуй вот такой постараюсь взять https://www.ozon.ru/context/detail/id/4958146/ :)
     
  9. olivergreen

    olivergreen Нуб

    а не подскажете новичку, как решить проблему циклического таймера, когда что выполняется Х времени, а потом не исполняется Y времени и так по кругу?

    учусь и уже 2 дня не могу толком осилить логику такого таймера.
     
  10. DIYMan

    DIYMan Guest

    Могу в псевдокоде, он компилироваться не будет, но логику - покажет:

    Код (C++):
    TimerTime timeToOn = 10000; // 10 секунд работает
    TimerTime timeToOff = 20000; // 20 секунд не работает
    TimerState timerState = stateOff;
    unsigned long past;

    void TimerOnAction()
    {
        // тут выполняем действие, когда таймер включается
    }
    void TimerOffAction()
    {
        // тут выполняем действие, когда таймер выключается
       
    }

    void setup()
    {
        past = millis();
        TimerOffAction();
    }

    void loop()
    {
        unsigned long now = millis();
        switch(timerState)
        {
            case stateOff:
            {
                if(now - past > timeToOn)
                {
                    past = now;
                    timerState = stateOn;
                    TimerOnAction();
                }
            }
            break;
           
            case stateOn:
            {
                if(now - past > timeToOff)
                {
                    past = now;
                    timerState = stateOff;
                    TimerOffAction();
                }
               
            }
            break;
        }
    }
     
     
    olivergreen нравится это.
  11. olivergreen

    olivergreen Нуб

    Большое спасибо! Сейчас буду изучать!
    Изначально думал переделать http://forum.amperka.ru/threads/Как-реализовать-суточный-таймер.2418/#post-18943 этот код, использовав несколько дополнительных переменных (int start = секундное представление времени начала выполнения, int till start + время выполнения и пр.) но пока ничего желаемого не получилось )
    Еще раз спасибо!
     
  12. Limoney

    Limoney Гик

  13. olivergreen

    olivergreen Нуб

  14. Tomasina

    Tomasina Сушитель лампочек Модератор

    А подскажите логику не суточного таймера, а ещё реже - раз в 3 суток.
     
  15. olivergreen

    olivergreen Нуб

    Возможно в таком случае следует сделать соответствующий интервал в 72ч.?
     
  16. DIYMan

    DIYMan Guest

    Это типа подкол? Или я чего не понял?