Постоянный посетитель
|
ARDUINO для автоматизации аквариума (страница 17) |
Создал отдельную тему по вопросам использования простых и не дорогих плат ARDUINO для целей автоматизации аквариума. Схема коммутации в случае использования платы NANO: Программа для среды программирования Arduino: //*************************************************** // Скетч для управления релейным модулем, в котором * // использовано два канала. Используется также RTC * // Релейный модуль - с инверсной логикой на входе * // Автор: ZORS * // Версия 1. Дата 21.12.2013 02:40 * //*************************************************** //----------ИМПОРТ БИБЛИОТЕК------------------------- #include //Подключаем библиотеку для использования I2C интерфейса с модулем RTC #include //Подключаем библиотеку для использования модуля часов реального времени RTC RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC //----------Объявляем разные переменные------------ const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля //----------Настройки времени и продолжительности включения реле //----------ПЕРВЫЙ канал---------------------------- const long StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) //в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200) const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) //----------ВТОРОЙ канал---------------------------- const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) //----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) void setup(){ pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой Wire.begin(); //Инициируем I2C интерфейс RTC.begin(); //Инициирум RTC модуль // RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, //для того, чтобы загрузить в RTC дату и время на момент компиляции программы //Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки //времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! } // КОНЕЦ ИНИЦИАЛИЗАЦИИ //-------------------------------------------------- void loop() // ПРОГРАММЫй безусловный ЦИКЛ { DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла //----------Раздел обработки реле по времени ---- long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, //Это дает количество секунд с начала текущих суток //------------КАНАЛ 1------------------------------ if ((utime >= StartRelCn_1) && (utime //Если секунд с начала суток больше, чем задано для включения //Но, одновременно и меньше, чем задано для включения + длительность { digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает } else //во всех остальных случаях { digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается } //------------КАНАЛ 2 - все аналогично ----------- if ((utime >= StartRelCn_2) && (utime { digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает } else { digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается } }//------------Конец ЦИКЛА----------------------------- (Редактор текста на данном сайте - к сожалению, "ломает" красивое форматирование. PS: Выложил этот скетч на файлообменник : http://my-files.ru/h... В данной программе реализован, довольно-таки простой подход, а простота - основа надежности. Каждое из 2-х реле срабатывают один раз в сутки в указанное время, причем время указывается в количестве секунд от начала суток, и удерживается указанное количество времени в секундах. Такой способ задания времени - несколько сложен для понимания, но за это - не нагружает программу и процессор лишним функционалом, который понадобится всего один раз. Для определения времени наступления события начала включения и выключения реле - используется время в формате UNIX. Такой подход хорош тем, что даже если включение или перезагрузка платы произойдет в промежутке времени включения, то реле включится в оставшееся время. В случае с дозированием, это не много что дает, но в случае, если по аналогии будет сделано управление светом, то при подаче напряжения на плату, например, после пропадания напряжения питания, или после посадки напряжения, или др. аналогичных событий, включение и выключение реле произойдет корректно. У комплектных минутных и секундных таймеров "с розеткой" - об этом можно только мечтать....не реализован такой функционал, и еще у них есть один минус. Реле в таких таймерах - не удерживаемое, а переключаемое, со всеми вытекающими последствиями.... Для программирования нескольких включений каждого реле в течение суток - естественно, потребуется несколько другой подход....спрашивайте когда кому-то потребуется, пока не хочу все усложнять... В принципе, можно добавить константных переменных, содержащих время и длительность срабатывания, и соответственно добавить проверку на условия. Если количество необходимых срабатываний каждого реле в сутках больше чем 2 - лучше оформить проверку условий в отдельной функции. Как, говорил человек, учивший меня программированию - "все, что ты делаешь в программе больше двух раз - оформляй отдельной процедурой, или функцией". Главное ограничение этого подхода - включение и выключение реле - должно произойти в одних сутках. Если необходимо чтобы, реле включилось в одних сутках, а выключилось в других - необходимо разбить это задание на 2 задания, или применить другой метод проверки условий наступления событий включения и выключения. Весь этот пример тестировался на "живом" железе : Для наглядности отладки был еще подключен LCD дисплей 16 сим в 2 строках. Схема итоговая была такая: Обратите внимание, что при использовании I2C последовательного интерфейса - соединения значительно упрощаются. И LCD дисплей подключен транзитом через модуль RTC (часов реального времени). Никаких паяных соединений нет вообще....все скоммутировано - проводами с разъемами. Скетч - естественно, несколько другой использовался с добавлением строк инициализации и использования LCD 16x2. Плата использовалась типа такой: http://www.ebay.com/... цена примерно 350 руб. Релейный модуль http://www.ebay.com/... цена примерно 150 руб. Модуль часов реального времени: http://www.ebay.com/... Цена примерно 55 руб. Для сокращения бюджета можно использовать плату проще: http://www.ebay.com/... Цена примерно 200 руб. Если есть потребность подключить ЖК дисплейчик, то лучше брать ЖК дисплей (LCD) c I2C интерфейсом - это сильно упрощает коммутацию, и сокращает количество использованных портов на микроконтроллере. Например такой можно использовать : http://www.ebay.com/... цена около 180 руб. На ЖК можно выводить статусную информацию, информацию об ошибках, диагностическую информацию. Все это, конечно, можно и в последовательный порт компьютера выводить, но это не всегда удобно (скорее наоборот), поэтому я всегда использую какой-нибудь девайс для вывода информации. Для использования I2C интерфейса - необходима библиотека Wire. Она есть в стандартном дистрибутиве среды программирования Arduino. Для использования модуля RTC на микросхеме DS1307 нужна библиотека RTClib. Если ее не будет в стандартном дистрибутиве, то ее можно взять в интернет. Например здесь : http://arduino-info.... Необходимо, скачать, и разархивировать zip-файл в папку с понятным названием, например RTCLib. Затем эту папку поместить в папку, где среда Arduino хранит свои библиотеки. Если ставили среду программирования с настройками по умолчанию, то этой папкой будет : C:Program FilesArduinolibraries Сюда и помещайте папки с подключаемыми библиотеками. Если на этот момент, среда программирования была запущена - ее необходимо закрыть, и запустить заново. После этого библиотека будет доступна в меню Скетч/Импортировать библиотеку. Микросхема RTC модуля DS1307, как правило использует адрес на шине I2C равный 0x68 поэтому, необходимо проверить в библиотечных файлах, библиотеки RTClib наличие строки типа этой: #define DS1307_ADDRESS 0x68 Если будет использоваться LCD 16x2 с I2C интерфейсом, то - понадобиться библиотека LiquidCrystal_I2C. Можно скачать здесь : http://dvrobot.ru/lc... Как подключить к среде программирования Arduino - см. выше ВАЖНО : при использовании I2C устройств - в скетче, библиотека Wire - должна быть объявлена первой, иначе - будут ошибки компиляции. По этому примеру - все.... в следующем - присоединение термо-датчика DS18B20, и создание несложного терморегулятора..... Изменено 24.12.13 автор Z0RS |
|
#1907148 |
Посетитель
|
|
Z0RS Мне это напомнило фильм Картофельный Папа, там бросают шар в отверстие и ракета вылетает в космос. |
|
#2450049 |
|
Посетитель
|
|
Я просто достал это из лазерной указки для кота из фикспрайса) kalibriКажется, я не понял Вашей ассоциации... Изменено 10.1.18 автор B_wolf |
|
#2450075 |
Посетитель
|
|
#2450079 |
Посетитель
|
|
kalibri А, я понял. Скепсис. Объясню зачем я это делаю. Я использую реактор по принципу аппарата Киппа. И у него есть один недостаток-после определенного расхода реагентов давление в системе может повыситься и подача СО2 увеличивается. Также недавно после перезаправки я предварительно настроил подачу и пошел спать. Человеческий фактор. Давление вышло на рабочее значение и подача зашкаливала. Придя с работы обнаружил рыб в критическом состоянии. Апистограмма аварию не пережила. Остальных откачал. А это устройство будет считать пузыри и сервоприводом регулировать подачу, удерживая её в заданном интервале. Выставил на дисплее 2 пуз/сек и всё хорошо. Плюс можно посчитать количество СО2 в литрах, вырабатываемое за одну заправку, и выводить на дисплей расход реагентов в процентах. А если реагенты совсем уж закончились-попищать (в вечернее время, конечно же). Также оно будет управлять ЭМ клапаном. Выкинется один таймер из под аквы, у которого, кстати, реле не удерживаемое, а переключаемое. Другими словами если электроника таймера выходит из строя при включенном реле-оно не выключится. При зависании, отказе, перезагрузке ардуины по вачдогу-клапан всегда будет закрываться. Если бы я только пузыри считал-да, извращение. Но в таком ключе устройство для меня полезно и надежно. |
|
#2450103 |
Посетитель
|
|
Lex_vx Не хотел вас обидеть. То что вы говорите будет очень здорово использовать в деле. И искринне желаю вам успеха в задумке . Да, если посидеть и подумать то множество процессов можно автоматизировать. Сам купил себе контроллер закатов и рассветов, хочу прикрутить к нему клапан блокировки углекислоты на ночь. |
|
#2450109 |
|
Посетитель
|
|
Я не обидчивый) Да, можно еще сказать "а что не баллон?". Ну да, баллон с одной стороны удобнее. Но есть и минусы. Цена и необходимость возить баллон на заправку. Ну лень мне это делать! |
|
#2450123 |
Новичок
1
6 года |
|
Z0RS Народ подкиньте пожалуйста код из первой страницы (он удален из диска). Очень нужен таймер на несколько включений в день. Для дозатора Балинга на перистальтических насосах. Хочу за несколько раз вносить дневную дозу. Спасибо |
|
#2515146 |
Посетитель
|
Рабочий, код кривой вставляется, нужно поправлять (страница 17) |
// Скетч для управления релейным модулем и PWM* // Используется также RTC для точных часов без корректировки* // Релейный модуль - с инверсной логикой на входе * |
|
#2522122 |
|
Новичок
3
6 года |
|
Всем доброго времени суток, подкиньте пожалуйста скетч Z0RS , многокомандный таймер. Подскажите как сделать что-бы реле срабатывало каждые 30 секунд. |
|
#2526044 |
Новичок
3
6 года |
|
#2543741 |
Новичок
3
6 года |
|
ZebrajА как такой код на часах DS1302 будет выглядеть? |
|
#2544120 |
|
Посетитель
|
|
#2544263 |
Посетитель
|
|
Khabibra Для 1302 надо искать другую библиотеку, ибо она не I2C и RTClib с Wire работать не будут. А лучше вообще саму 1302 заменить на гораздо более точный DS3231. |
|
#2544277 |
Новичок
3
6 года |
|
Есть такой код |
|
#2544465 |
|
Посетитель
|
|
Khabibra Что вы понимаете под "два таймера" и что значит "устанавливается" ? В приведенном коде единственное реле включается на интервал t1:m1-t2:m2, причем эти тэ и мэ забиты константами в программе и это сложно назвать "установкой" |
|
#2545013 |
Посетитель
|
|
А я себе вот такие штуки собрал. |
|
#2664236 |
Посетитель
|
Огромное Спасибо Z0RS (страница 17) |
Вот уже 7 лет, как я залез в тему Ардуино |
|
#2664620 |
|
Новичок
1
5 года |
|
#2681968 |
Посетитель
|
|
Контроллер с ШИМ для светодиодов с рассветом/закатом, луной ТУТ обновил статью Изменено автор Paradox860 |
|
#2754773 |
Новичок
5
5 года |
|
Z0RS Здравствуйте. Очень заинтересовался темой. Хочу попросить совета по созданию системы автоматизации террариума. Необходимые условия- 1 Включение ламы - обогрева в зависимости от температуры день-ночь 2 Изменение установок температуры день ( примерно 30) ночь (примерно 22) 3 День включение ультрафиолетовой лампы 4 Периодические включение днем поилки на 30 мин, с паузой в 120 мин 5 Контроль влажности, при понижении ниже 25% включение малого увлажнения 6 При понижении влажности ниже 15 включение ультразвукового увлажнителя. 7 При повышении температуры выше 33 включение вентилятора обдува. Что посоветуете по комплектующим ? Какая ардуино достаточна? Я немного нуб , но поддаюсь обучению. |
|
#2759835 |
|
Новичок
|
|
Zebraj А вот код корректировки никто не писал? Может кто по поделиться примером? Я в своём проекте реализовывал вот так: ------------------------------------------- unsigned long corrTime = 0; //время старта в секундах от начала суток int adjSecond = 0; //переменная подстройки времени int day = 0; //переменная дня подстройки времени //функция установки/ручной корректировки времени содержит код: //corrTime = now.hour() * 60L * 60L + now.minute() * 60L + now.second(); //запоминаем время в секундах //что бы программа знала когда последний раз корректировали время //и отсчитывала от этого времени 24 часа. void autoCorrection() //коррекция времени раз в сутки { unsigned long ref = now.hour() * 60L * 60L + now.minute() * 60L + now.second(); //опорное время в секундах if (ref == corrTime && day != now.day()) { day = now.day(); RTC.adjust(now + TimeSpan(0, 0, 0, adjSecond)); } } void loop() { if (adjSecond != 0)autoCorrection(); } -------------------------------------- Но может есть какой то более правильный метод? |
|
#2767730 |
Постоянный посетитель
|
|
Arhar Я не претендую на правильность, но альтернативой программной коррекции может служить переход с DS1307 на DS3231. |
|
#2767779 |
Новичок
|
|
KAA78 да. об этом слышу много) Но это метод для ленивых ))) мы же не ищем лёгких путей. вообще могу поделиться своим проектом, если кому то интересно. Лежит в моём блоге https://unicaster.ru... но мой проект попроще в плане автоматики. 4 реле (3 по времени, 1 по температуре). Изменено 4.4.20 автор Arhar |
|
#2767781 Нравится KAA78
|
|
Посетитель
|
|
Проект не стоит на месте! В контроллер добавлена функция дневной паузы для освещения, функция автокормушки. Добавлен второй температурный датчик для радиатора светодиодов и выход на вентилятор для охлаждения радиатора. В теме на форуме выложил исходники кому интересно! |
|
#2809511 |
Новичок
1
4 года |
|
Может кто скетч написать, готов его оплатить. Я полный ноль в ардуино, нужно тупо прописать релейный модуль на 8 штук, часы и дисплей на 4 контакта |
|
#2859310 |