помогите создать таймер включения и выключения света

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 2 янв 2016.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    есть лампочка которая подключена к пину ардуино и часы реального времени. в определенное время лампочка должна включится и потом выключится.
    Код (C++):
    //Если время совпало включаем LED

    if(h==HLEDON&&m==MLEDON){

      digitalWrite(ledPin,HIGH);
    }


    //Если время совпало выключаем LED

    if(h==HLEDOFF&&m==MLEDOFF){


        digitalWrite(ledPin,LOW);
    }
    но есть уязвимое место у этой системы- контроллер чтоб зажечь свет или погасить его должен явно получить с часов определенные часы и минуты чтоб сравнить их с установленными значениями и только после этого включить или выключить свет. но если на момент когда свет выключен а в момент когда он должен загореться отключат электричество, то контроллер пропустит необходимые значения и свет не включится пока они опять не совпадут.
    как сделать так чтоб контроллер понимал соответствует нынешний промежуток времени установленному, чтоб включить или выключить свет, или нет.

    двигался в направлении
    Код (C++):
    if(HLEDON<=HLEDOFF&&MLEDON<MLEDOFF){
      if(h>=HLEDON&&m>=MLEDON&&h<=HLEDOFF&&m<MLEDOFF){
        digitalWrite(ledPin,HIGH);
      }
    }
    в данном коде написано что если текущее время больше выставленных часов и минут на включени , то свет загорится , но если текущее время к примеру 19:35 и включение света запланировано было на 19:15, то свет естественно будет гореть, но стоит текущему времени превратиться в 20:05, к примеру, то 05 минут уже не больше установленных 15 ти и свет конечно выключается...
    так как же возможно реализовать такой таймер чтоб он понимал гореть в данный промежуток времени или нет?
     
  2. vvr

    vvr Инженерище

    запишите свой график в память и сравнивайте время с ним
    если график большой и сложной используйте PROGMEM
     
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    я записал график в память, но если время включения установлено к примеру на 19:00 и записано в память, а на момент подачи электричества данные с часов соответствуют 19:15 то свет не включится т.к. 19:15 не равно 19:00 и получается свет не загорится пока контроллер не будет включен во время прохождения времени 19:00.
     
  4. vvr

    vvr Инженерище

    так вы в условии включения прописывайте не равно, а больше
    time > 19
     
  5. Толик Иванов

    Толик Иванов Administrator Администратор

    это с часами прокатит, а с минутами? у меня ведь есть еще возможность установить минуты? как с минутами быть? сейчас они больше установленного времени, а когда перевалят за 59 минут станут уже меньше...
    пока как Вы говорите я смогу сделать правильную схему только если буду выставлять таймер только по часам.
    да и часы тоже нужно учитывать что они могут перевалить за 23 и станут уже меньше установленного времени...
     
  6. vvr

    vvr Инженерище

    в каждом условии прописываете два параметра - часы и минуты
    if(hour > ... && min >....)
     
  7. Толик Иванов

    Толик Иванов Administrator Администратор

    блин, ну я же в самом первом сообщении по этой теме написал два примера того что я делал...
    и второй пример не рабочий в силу того что минуты бывают и больше и меньше,
    в итоге свет горит только когда оба условия совпадают, а минуты то бывает совпадают а бывает нет.
    Простите меня пожалуйста, но вы посмотрели примеры, которые я описал в самом начале? то что Вы советуете, отличается от того, что я уже делал?
     
  8. vvr

    vvr Инженерище

    if(hour > 19 && min > 40) LED_ON;
    if(hour > 20 && min > 12) LED_OFF;
     
  9. Толик Иванов

    Толик Иванов Administrator Администратор

    а что произойдет если контроллер включится в 20:05?
    он проверит условие с данными с часов и получит что 20 больше 19 но 05 меньше 40 и свет не включится, условие не выполнилось полностью...и не будет гореть пока не настанет 20:12
     
  10. Толик Иванов

    Толик Иванов Administrator Администратор

    и если вы так задали условие то установив время включения на 19:40 по факту оно включится в 20:40, и то если контроллер включится в оставшиеся 20 минут... ваш пример впринципе работает только последние 20 минут в час
     
  11. Onkel

    Onkel Гуру

    переводите часы/минуты в минуты и работайте со временем в виде целой "число минут после полуночи".
     
  12. vvr

    vvr Инженерище

    if((hour > 19 && min > 40) && (hour <= 20 && min <= 12) ) LED_ON;
     
  13. Толик Иванов

    Толик Иванов Administrator Администратор

    интересная идея, но пока плохо представляю как это должно выглядеть, чтоб и иметь возможность выставлять время в человыеческом виде...
     
  14. Толик Иванов

    Толик Иванов Administrator Администратор

    в 19:40 свет не загорится? в 19:50 тоже? у вас не правильное условие...... проверьте его на работу если мне не верите
     
  15. Sparkfire

    Sparkfire Гик

    Может попробовать либо, как выше советовали, перевести время в минуты, либо, как второй вариант, записать полное время(часы/минуты) в переменную, и с ней работать. Не особо силён в операторах, но кажется stream поможет.
     
  16. Onkel

    Onkel Гуру

    представляйте так
    часы=время_в_минутах/60
    минуты=время_в_минутах%60