Постоянный посетитель
|
ARDUINO для автоматизации аквариума (страница 14) |
Создал отдельную тему по вопросам использования простых и не дорогих плат 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 |
Свой на Aqa.ru, Советник
|
|
#2252027 |
|
Посетитель
|
|
А что это обозначает??? |
|
#2252028 |
Свой на Aqa.ru, Кандидат в Советники
|
|
#2252029 |
Посетитель
|
|
Спасибо, я ноль в андруино. Только начал интересоваться, можете более объяснить??? |
|
#2252030 |
Свой на Aqa.ru, Кандидат в Советники
|
|
#2252047 |
|
Новичок
6
8 года |
Ардуинка (страница 14) |
Z0RS Привет. В работе с МК, новичок. Почитав первые посты, используя скетчи Примеры 1 и 2, немного исправив код для своих целей сделал незатейливую автоматику аквариума на 8-канальной плате реле: Реле 1-3 постепенно увеличивают мощность освещения в аквариуме (лампы ЛМ через 3 выключателя 1+1+2 Лампы), 4 - Розетка для управления ЭМ клапаном СО2 по времени, 6 и 7 - управление дозаторами, 7 и 8 - посредством использования датчика температуры (Пример 2) соответственно Нагрев и Охлаждение аквариума. В тестовом режиме несколько суток. Спасибо Автору темы за открытость и доступность преподносимой информации. Хотя сегодня далеко не все понятно, но суть просматривается =). Изменено 31.8.16 автор epifran |
|
#2265147 |
Малёк
|
|
Доброго дня всем!!! |
|
#2265441 |
Посетитель
|
|
ShreDВозможно (по второй ссылке не видно), стоят разные микросхемы контроллера USB. При наличии драйвера - не существенно. Первая - выглядит по-аккуратнее. На наличие/отсутсвие кабеля можно не смотреть. |
|
#2265493 |
|
Малёк
|
|
#2265500 |
Посетитель
|
|
ShreDЕсли планируете использовать модуль RTC, выбирайте на микросхеме DS3231. Преимущество - точность хода; два программируемых будильника. |
|
#2265505 |
Малёк
|
|
#2265510 |
|
Посетитель
|
|
ShreD Второй вариант (с ATMEGA16U2) лучше как минимум потому, что это клон оригинальной итальянской схемы и его можно перепрограммировать по своим нуждам - чтобы ардуина видилась клавой/мышкой, а не просто ком-портом. |
|
#2265545 |
Малёк
|
|
Спасиб Дим, учту при заказе. |
|
#2265549 |
Посетитель
|
|
[q] dkozyrev ShreD Если делать контроллер для аквариума, то совсем необязательно, чтобы он виделся клавой или мышкой. Вот такая плата уно у меня прекрасно работает в контроллере аквариума http://www.ebay.com/... Стоит как минимум в 1.5 раза дешевле. Никаких проблем с ней не было. Недавно пришла плата Arduino Nano, она мне настолько понравилась своей миниатюрностью и полным функционалом UNO, что решил теперь устройства делать только на ней. Стоит еще дешевле. Вот. например http://www.ebay.com/... |
|
#2265721 |
|
Посетитель
|
|
ShreDНе против. |
|
#2265780 |
Новичок
6
8 года |
|
В работе датчик DS18B20 с подтягивающим 4к7 резистором. Освещение ЛМ лампы, когда включатся в работу все, датчик сходит с ума: жуткий дребезг, выгружал в сериал, то показывает температуру нормально, то -1001 градус. Скорее всего ловит наводки с ЭПРА светильников. |
|
#2265978 |
Посетитель
|
|
epifran Провод удлиняли? Я удлинял. И с таким номиналом у меня датчик тоже выдавал температуру, уходящую в минус. Сейчас уже не помню на каком номинале резистора методом подбора остановился. Короб разбирать не хочу. Попробуйте 2 или 1 кОм. Почитайте ещё здесь . Изменено 2.9.16 автор Mr.Sim |
|
#2265988 |
|
Новичок
6
8 года |
|
#2266025 |
Новичок
6
8 года |
|
Mr.Sim Отыскал кабель ЮСБ, вроде такого (выпотрошил непотребный кабель). Два провода на +5vdc, два провода на data. наружную оплетку на gnd. Глюки исчезли. |
|
#2266168 |
Посетитель
|
|
frdimitry Если брать ардуину только для установки в акваконтроллер, то понятно, чем дешевле тем лучше. Но для этих целей гораздо лучше подойдет Nano с еще более низкой ценой, габаритами и отсутствием лишних разъемов. Uno, по-моему, стоит брать для экспериментов на столе, с паутиной проводов и навеской разных шилдов. И тут переплата в 1.5 раза в размере каких-то 100р идет за дополнительные функции, которые могут пригодиться, и возможность легко заменить МК. Который убить вполне реально ошибкой в расчетах, монтаже, да даже статикой от свитера, ибо защиты портов нет никакой. В вашем варианте придется ждать новую плату или осваивать пайку феном. |
|
#2266609 |
|
Посетитель
|
|
Я не совсем понял из последнего вашего поста, зачем переплачивать за такой контроллер, который вы предлагаете. Спалить ведь и его можно. Если есть боязнь спалить микроконтроллер, тогда за эти деньги, что вы предлагаете, купить 3 шт. ардуино нано и не переживать о том, что один из них спалишь. Уно удобен для макетирования, но тот контроллер (аналог уно), на который я дал ссылку, не менее удобен для макетирования. Получил ардуино нано и когда распечатал посылку, то сначала действительно испугался того, что он такой маленький и есть шанс перепутать выводы и что-нибудь спалить. Но. слава Богу, все обошлось, ничего не спалил. Все-таки схемы подключения того, что здесь рассматривается, довольно простые, и спалить нужно еще постараться. Один раз во время экспериментов на контроллер перестал загружаться скетч. Думал. что спалил что-то. Оказалось, что обновил версию IDE до 1.6.10 и в результате скетчи перестали загружаться. Откатился на 9 версию, все нормально. Сейчас стоит 11-я, также все нормально. Так что спалить можно все. что угодно. вот только это не аргумент для покупки более дорогой платы. Единственное ее преимущество - возможность загружать скетчи в arduino pro mini, но мне такая функция показалась сомнительной (вытаскивать контроллер из панельки, подключать платку, заливать скетч). Разница в стоимости между nano и pro mini такова, что проще купить nano и иметь возможность загружать модификации скетча без каких-то танцев с бубнами. |
|
#2266806 |
Малёк
11
Липецк 8 года |
|
помогите разобраться |
|
#2300105 |
Новичок
6
8 года |
|
bonlik "//" - в начале строки, есть коментарий. Все, что после "//" - писаться не будет, это лишь пояснения, коментарий. Если "//" не стоит - компилятор будет работать со строчкой. Т.е. Строчка // RTC.adjust(DateTime(__DATE__, __TIME__)); Закоментирована RTC.adjust(DateTime(__DATE__, __TIME__)); Не закоментирована. Изменено 8.11.16 автор Moderator |
|
#2300150 |
|
Малёк
11
Липецк 8 года |
|
спасибо огромное за пояснение. но скетч всё равно не хочет работать |
|
#2300219 |
Новичок
6
8 года |
|
bonlik Т.е. Вы целиком копируете весь скетчь из Пример1 с первой страницы топика, и у Вас не компилируется он? Изменено 8.11.16 автор Moderator |
|
#2300239 |