Итак, задача. Нужно включать-выключать некоторую нагрузку, скажем, насос для полива растений на улице, и делать это в автоматическом режиме с гибко настраиваемыми интервалами.
Для решения этой задачи нам понадобится
- Uno – arduino-совместимая плата, которую мы программируем
- Sensor shield (или плата прототипирования) – для облегчения соединения датчиков с платой
- Провода мама-мама
- Дисплей на 2 строки по 16 символов LCD1602
- Реле переключения нагрузки
- Датчик угла поворота с кнопкой
- Блок питания 9V 1А (для тестирования можно питать устройство и по USB кабелю самой Arduino)
Принцип действия
К реле подключается полезная нагрузка, скажем, двигатель на 12 вольт или насос. Реле выступает в качестве включателя/выключателя, который управляется программно, т.е. мы в коде говорим, когда нам замкнуть контакты в реле (включить насос) или разомкнуть (выключить насос). Датчиком угла поворота мы настраиваем через какой промежуток времени (минут) нам нужно включить реле (ON) и через какой – выключить (OFF). Сколько осталось минут до окончания текущего режима, сколько минут продлится режим включения и выключения – все это мы видим на экране LCD.
Подключение
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.
Заключение
Если все-таки хочется сделать готовое устройство:
- Плату arduino uno лучше заменить на arduino pro mini – она значительно меньше, дешевле и припаивать провода легче
- Все соединительные провода между платой и остальными устройствами нужно припаять – ржавчина теперь не повлияет на долговечность соединительных контактов
- Собрать все в корпус – на вид приличнее будет, да и защита от всяких воздействий (случайно задетого провода)
- Добавить выключатель – при покидании жилища на длительное время (при том что в этом устройстве нет необходимости в отсутствии хозяев) лучше все-таки обесточивать девайс, и делать это выключателем удобнее, чем выдергивать блок питания из розетки
Удачных экспериментов!
Возможно, вам потребуются файлы:
- Библиотека для дисплея 1602 I2c: LiquidCrystal_I2C.zip
Добрый вечер!, а как будет выглядеть код если требуется поливать один день в неделю к примеру в понедельник с 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);//текущее время
}
На днях напишу статью, как сделать свой будильник. Сможете взять кусок кода оттуда.
Блин код не полностью отобразился
Добрый день! для перевода с минут в часы, достаточно будет переправить переменную seconds с 60 на 3600 ???
Думаю что должно работать! Везде где этой переменной присваивается 60 – изменить на 3600
Привет, я могу изменить программу, потому что мы работаем с нормальным потенциометра подключен к аналоговому входу, и одной кнопки.
Благодаря.
Марк
Да, можно использовать и аналоговый потенциометр. Вот его код: https://www.arduino.cc/en/tutorial/potentiometer
Спасибо, еще- бы дисплей на 128X64 заменить с русскими символами, возможно?
Да, это возможно. Туториал по ссылке: https://lesson.iarduino.ru/page/urok-8-russkiy-yazyk-na-oled-displee-128×64/
Изменив строчке 1000 на 10: currentTime >= (loopTime2 + 10, сделал чтоб секунды считал, а как сделать чтоб OFF считалось в минутах, а ON в секундах?
В этой строчке раз в секунду программа проверяет, не нужно ли переключать режим. Думаю, ее нужно оставить как есть.
Чтобы работать с минутами, нужно многое менять в программе, добавлять хранение в eeprom минут, менять редактор, чтобы потенциометром было удобно выставлять минуты и секунды. Иначе долго крутить придется чтобы выставить секундами… интервал в 2 часа.
Однако, если задача не стоит менять интервалы после программирования устройства, проще удалить пол кода и прописать вручную значения в секундах в коде.
Спасибо, да интервалы корректировать надо, задача: выставить ON 5 сек. OFF 20 мин. Ну и 50% туда- сюда изменения. Для меня это все ново т.ч. извиняйте, туплю.
Посмотрел данный урок и решил спросить как сделать подобный таймер, но только отсечки времени нужны начиная от милисекунд до секунд. И что бы выставленный временной интервал отображался на небольшом дисплее. Вообще такой таймер нужен для контактной (точечной сварки) при сварке аккумуляторов, т.к. нажимая и отпуская кнопку просто рукой все равно проходит довольно много времени и иногда никелевую шину, которую привариваю к аккумулятору просто прожигает. Т.е нужно сделать так, что бы при нажатии кнопки нагрузка подавалась на установленный временной интервал и потом отключалась. Какие компоненты для ардуино нужны для реализации такого устройства. Опыта в написания кода для ардуино нет. Если не трудно прошу помочь в создании данного устройства
Для этого проекта я бы взял arduino nano, одноканальное реле и кнопку, скажем такую (https://www.arduino.md/hardware/sensors-2/key-switch-button-w110/). В коде прописать, что при нажатии на кнопку – реле замыкается на сколько-то миллисекунд. Код можно взять с инета, google: arduino button relay
А какой дисплейчик подойдет для этих целей, ну что бы видеть какая задержка выствленна?
И что еще нужно что бы менять временной интервал не меняя при этом прошиввку?