Реле включения нагрузки по времени на arduino

Итак, задача. Нужно включать-выключать некоторую нагрузку, скажем, насос для полива растений на улице, и делать это в автоматическом режиме с гибко настраиваемыми интервалами.

Для решения этой задачи нам понадобится

IMG_20150204_122959

  • Arduino Uno — плата, которую мы программируем
  • Sensor shield (или плата прототипирования) — для облегчения соединения датчиков с платой
  • Провода мама-мама
  • Дисплей на 2 строки по 16 символов LCD1602
  • Реле переключения нагрузки
  • Датчик угла поворота с кнопкой
  • Блок питания 9V 1А (для тестирования можно питать устройство и по USB кабелю самой Arduino)

Принцип действия

IMG_20150204_122854

К реле подключается полезная нагрузка, скажем, двигатель на 12 вольт или насос. Реле выступает в качестве включателя/выключателя, который управляется программно, т.е. мы в коде говорим, когда нам замкнуть контакты в реле (включить насос) или разомкнуть (выключить насос). Датчиком угла поворота мы настраиваем через какой промежуток времени (минут) нам нужно включить реле (ON) и через какой — выключить (OFF). Сколько осталось минут до окончания текущего режима, сколько минут продлится режим включения и выключения — все это мы видим на экране LCD.

Подключение

IMG_20150204_123021

 

Arduino UNO LCD1602 Реле Датчик угла
 VCC 5V  VCC  +  +
 GND  GND  —  GND
 Analog 4  SDA
 Analog 5  SCL
 Digital 5  SW
 Digital 8  S
 Digital 11  CLK
 Digital 12  DT

 

Полный код программы: relay-timer-project.zip

Вот и видео того, что получилось.

Комментарий к видео.

На дисплее строка Active OFF 1 говорит, что активен режим OFF — реле выключено и это продлится еще 1 минуту. Строка ON: 4 OFF: 1 говорит что устройство настроено на периодическое включение реле на 4 минуты, затем выключение на 1 минуту. Крутим датчик угла поворота, регулируя сколько осталось до смены режима (ON/OFF). Нажав кнопку переходим в режим редактирования значения ON, далее по кнопке переходим в режим редактирования OFF, далее по кнопке возвращаемся в основной режим. Спустя минуту после щелчка загорается светодиод на реле (реле включено) и на дисплее видим смену режима на ON, который продлится 2 минуты. Отключаем питание устройства и включаем снова, видим, что настройки ON2 и OFF1 сохранились — при загрузке arduino прочла их из энергонезависимой памяти eeprom. Также режим изменился на OFF.

Заключение

IMG_20150204_122912

Если все-таки хочется сделать готовое устройство:

  • Плату arduino uno лучше заменить на arduino pro mini — она значительно меньше, дешевле и припаивать провода легче
  • Все соединительные провода между платой и остальными устройствами нужно припаять — ржавчина теперь не повлияет на долговечность соединительных контактов
  • Собрать все в корпус — на вид приличнее будет, да и защита от всяких воздействий (случайно задетого провода)
  • Добавить выключатель — при покидании жилища на длительное время (при том что в этом устройстве нет необходимости в отсутствии хозяев) лучше все-таки обесточивать девайс, и делать это выключателем удобнее, чем выдергивать блок питания из розетки

Удачных экспериментов!

Возможно, вам потребуются файлы:

16 thoughts on “Реле включения нагрузки по времени на arduino

  1. Андрей says:

    Добрый вечер!, а как будет выглядеть код если требуется поливать один день в неделю к примеру в понедельник с 12.00.00 до 12.00.03, 3 секунды, присоединив RTC и реле для управления высокой нагрузкой, вроде ничего сложного нет, но я в этом новичок. Просто смотрел схемы полива через датчики влажности почвы, пишут что выходят из строя, поэтому планирую сделать просто полив раз в неделю и обезопасить систему часами реального времени, на случай если отключат электроэнергию.
    Набросал код программы но он не правильный

    #include
    #include
    RTC_DS1307 RTC;

    int day;
    int hours;
    int minutes;
    int seconds;
    //блок реле
    int Relay1 = 12;
    int On_Time =0;
    int Off_Time =0;
    int Curent_Time = 0;

    void setup()
    {
    Serial.begin(9600);
    pinMode(Relay1, OUTPUT);
    digitalWrite(Relay1, HIGH);

    }

    void loop()
    {
    day = RTC.get(DS1307new_DAY,true);
    hours = RTC.get(DS1307new_HR,true);
    minutes = RTC.get(DS1307new_MIN,true);
    seconds = RTC.get(DS1307new_SEC,true);
    }
    {
    if(Day == Mondey && Hour == 12 && Minute == 0 && Second >= 0){digitalWrite(Relay1, HIGH);}
    if(Day == Mondey && Hour == 12 && Minute == 0 && Second >= 3){digitalWrite(Relay1, LOW);}
    // задаём день понельник время включения с 12.00.00 - 12.00.03; на 3 секунды
    Curent_Time=RTC.get(DS1307new_HR,true)*60+RTC.get(DS1307new_MIN,false);//текущее время
    }

    • Alex Santehnik says:

      На днях напишу статью, как сделать свой будильник. Сможете взять кусок кода оттуда.

  2. Сергей says:

    Добрый день! для перевода с минут в часы, достаточно будет переправить переменную seconds с 60 на 3600 ???

    • Alex Santehnik says:

      Думаю что должно работать! Везде где этой переменной присваивается 60 — изменить на 3600

  3. Марк says:

    Привет, я могу изменить программу, потому что мы работаем с нормальным потенциометра подключен к аналоговому входу, и одной кнопки.
    Благодаря.
    Марк

  4. Сергей says:

    Спасибо, еще- бы дисплей на 128X64 заменить с русскими символами, возможно?

  5. Сергей says:

    Изменив строчке 1000 на 10: currentTime >= (loopTime2 + 10, сделал чтоб секунды считал, а как сделать чтоб OFF считалось в минутах, а ON в секундах?

    • Alex Santehnik says:

      В этой строчке раз в секунду программа проверяет, не нужно ли переключать режим. Думаю, ее нужно оставить как есть.
      Чтобы работать с минутами, нужно многое менять в программе, добавлять хранение в eeprom минут, менять редактор, чтобы потенциометром было удобно выставлять минуты и секунды. Иначе долго крутить придется чтобы выставить секундами… интервал в 2 часа.
      Однако, если задача не стоит менять интервалы после программирования устройства, проще удалить пол кода и прописать вручную значения в секундах в коде.

      • Сергей says:

        Спасибо, да интервалы корректировать надо, задача: выставить ON 5 сек. OFF 20 мин. Ну и 50% туда- сюда изменения. Для меня это все ново т.ч. извиняйте, туплю.

  6. Дмитрий says:

    Посмотрел данный урок и решил спросить как сделать подобный таймер, но только отсечки времени нужны начиная от милисекунд до секунд. И что бы выставленный временной интервал отображался на небольшом дисплее. Вообще такой таймер нужен для контактной (точечной сварки) при сварке аккумуляторов, т.к. нажимая и отпуская кнопку просто рукой все равно проходит довольно много времени и иногда никелевую шину, которую привариваю к аккумулятору просто прожигает. Т.е нужно сделать так, что бы при нажатии кнопки нагрузка подавалась на установленный временной интервал и потом отключалась. Какие компоненты для ардуино нужны для реализации такого устройства. Опыта в написания кода для ардуино нет. Если не трудно прошу помочь в создании данного устройства

    • Alex Santehnik says:

      Для этого проекта я бы взял arduino nano, одноканальное реле и кнопку, скажем такую (https://www.arduino.md/hardware/sensors-2/key-switch-button-w110/). В коде прописать, что при нажатии на кнопку — реле замыкается на сколько-то миллисекунд. Код можно взять с инета, google: arduino button relay

      • Дмитрий says:

        А какой дисплейчик подойдет для этих целей, ну что бы видеть какая задержка выствленна?

        • Дмитрий says:

          И что еще нужно что бы менять временной интервал не меняя при этом прошиввку?

Добавить комментарий