Включение реле на 1 час без использования RTC

Тема в разделе "Arduino & Shields", создана пользователем vovchik001, 17 апр 2015.

  1. vovchik001

    vovchik001 Нерд

    Посоветуйте, как можно реализовать включение реле по сигналу с беспроводного пульта. Смысл такой - есть розетка к которой подключен телевизор ребенка разрешенное время просмотра - 1 час. Вот возникла необходимость аппаратно включать и выключать розетку на 1 час в выбранное ребенком время. Пришла сказала "папа хочу мультики" - нажали кнопку па пультике 433 mhz розетка запиталась и пошел отсчет - 1 час до отключения. Заранее благодарен.
     
  2. Tomasina

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

    Для этого RTC не нужно (оно понадобится если надо будет включить в 19.00 и выключить в 20.00).
    После получения команды с пульта включает реле и присваиваем переменной startTime текущее значение millis. Затем постоянно проверяем текущее значение millis на выражение startTime+1час. Как только превысило - выключаем реле.

    P.S. Ребёнок быстро сообразит как воткнуть телик в свободную розетку.
     
    Последнее редактирование: 18 апр 2015
  3. Unixon

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

    Если встроить таймер в телевизор, то это не поможет.
     
  4. Tomasina

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

    В современные телики реле по толщине не влезет :)
     
    NikitOS нравится это.
  5. Unixon

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

    Это смотря какой таймер ;)
     
  6. ИгорьК

    ИгорьК Гуру

    А размер таймера зависит от размера времени срабатывания... Если на 30 минут, то затолкать можно, а если на час, то уже с трудом :-(
     
  7. X-Dron

    X-Dron Гик

    А если внимательно посмотреть инструкцию на телевизор, может там уже это реализовано? В телевизорах сборки 20-ти летней давности это было практически у всех.

    Если нет:
    Покупается
    1. простое реле для управления с arduino (все ссылки даю на Али, в амперке аналоги в разы дороже, а давать ссылки на конкурентов в России совесть не позволяет (но они есть с вменяемыми ценниками)).
    http://www.aliexpress.com/item/5V-O...-PIC-AVR-DSP-ARM-MCU-Arduino/32287609565.html
    Ставится NO контактом в разрыв фазы розетки.
    2. Аналог или оригинал Аrduino nano.
    3. Приемник 433МГц. Подключается к нано.
    http://www.aliexpress.com/item/Free...nk-Kit-For-Arduino-ARM-MCU-WL/1952236441.html
    По ссылке комплект приемник-передатчик, но нужен только приемник.
    4. Брелок управления 433МГц.
    http://www.aliexpress.com/item/Silv...-MHz-2-Channel-Free-shipping/32298218410.html
    Кнопки брелка можно использовать не только на включение, но и на смену режима (отключать не отключать.)
    5. Блок питания с выходом на miniUSB для запитки нано.
    Пишется скетч приема сигналов с пульта и формирование импульса на реле длительностью 1 час с блокировкой повторного включения в течение 10 минут.
    Все детали кроме п4 ходовые и практически всегда можно найти в российских магазинах.

    Можно поступить вообще просто. Необходимые условия:
    У телевизора есть USB гнездо. Данный телевизор смотрит только ребенок.
    Тогда нужны только 1 и 2. Реле рвет фазу разетки NС контактом.
    Телевизор включается, питание подается на нано, идет отсчет времени, по истечении времени выдается сигнал на реле для разрыва питающей цепи. Все обестачивается.
    Минус этого способа - никто не запрещает включить телевизор сразу после выключения, зато дешево и быстро. Можно использовать как промежуточный вариант, пока идут детали для первого.
     
    Последнее редактирование: 18 апр 2015
  8. vovchik001

    vovchik001 Нерд

    А можно подробнее про функцию Starttime? Я пробовал сделать с функцией delay как в примере blink но похоже там есть ограничение максимального времени задержки секунд в 8 примерно.
     
  9. geher

    geher Гуру

    полагаю, что в данном контексте startTime - это не функция, а переменная, куда надо поместить текущее значение, возвращаемое millis(), сразу после получения команды включения.
    Ограничение там вроде как должно быть существенно больше, что-то четырех миллионов секунд (определяется типом unsigned long, используемым для millis()).
     
  10. iglooshtosser

    iglooshtosser Гик

    Можно встроить не в сам телевизор, а в разрвыв кабеля питания телевизора. Сам же кабель к телевизору приклеить. ;)
     
  11. iglooshtosser

    iglooshtosser Гик

    StartTime = millis ();
    digitalWrite (releyPin,HIGH);
    while ((millis () - StartTime) < 3600000) {;}
    digitalWrite (releyPin, LOW);
     
  12. 9xA59kK

    9xA59kK Гик

    В "разрыв провода питания телевизора" работать не будет , потому что после отключения питания телека(грубо выдернуть из розетки),если после этого подать питание на телек он перейдет в режим "ОЖИДАНИЯ"- он сам не включится, к примеру пока не нажмешь на пульте ВКЛ
     
  13. Nitro77rus

    Nitro77rus Гик

    digitalWrite (releyPin,HIGH);
    delay(3600000);

    А так не проще?
     
  14. Tomasina

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

    так-то проще, но с одной весьма неприятной особенностью - пока выполняется delay(3600000), то контроллер не будет ни на что реагировать. В коде #11 нет этого недостатка, он будет продолжать обрабаывать другие команды (в т.ч. комбинацию разблокировки с пульта).
     
    Nitro77rus нравится это.
  15. Machineman

    Machineman Нуб

    И пока выполняется While остальной код стоит , ничем не лучше delay..
     
  16. akl

    akl Гуру

    можно использовать if.
    а вообще, эта система плохая, т.к. негуманная, т.к. во-первых, 1 час это слишком мало, а во-вторых, что если оно вырубится прям на середине мультика?
     
  17. Machineman

    Machineman Нуб

    Кстати подскажите как включать реле по событию на определенное время без delay() через if с помощью millis() ?
    Мигать получается, а на время включить не выходит
     
  18. Limoney

    Limoney Гик

    Увеличите интервал в условии, или сделайте интервал millis() каждую минуту и складывайте счетчик минут до часа
     
  19. ostrov

    ostrov Гуру

    delay(3600000);
     
  20. Machineman

    Machineman Нуб

    А можно с примером? Мне нужно включать вентилятор в ванной и выключать через время N после наступлении условия включения (фотодатчик или влажность)/ перепробовал множество вариантов с millis, но успехов нет. Мигает фунциями отлично, а с вентилятором засада.
    Код (C++):
    //////////////////////////////////////////////////////////////////////
    //мигаем функциями температуры и влажности раз в 5 секунд.
    unsigned long currentMillis_showFunc = millis();
      if(currentMillis_showFunc - previousMillis_showFunc > 5000){
        previousMillis_showFunc = currentMillis_showFunc;
        if(showState == 0){
          showState = 1;
        }
        else
        showState = 0;    //флаг смены функций через заданное  заданное время
      }

      if(showState == 0){
        displayTermo();
      }

      if(showState == 1){
         displayHydro();
        }
    //////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////
    //работаем с вентилятором
    //if (Vent == 1) digitalWrite(13, HIGH);
    //if (Vent == 0) digitalWrite(13, LOW);

    if(foto > 500 || hydro > 80){
      if(millis() > currentMillis_Vent){
        Vent != Vent;
        digitalWrite(13, Vent);
        if(Vent){
          currentMillis_Vent = millis() + 3000;
        }
        else{
          currentMillis_Vent = millis() + 6000;
        }
       }
      }