Постоянный посетитель
|
ARDUINO для автоматизации аквариума (страница 12) |
Создал отдельную тему по вопросам использования простых и не дорогих плат 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 Рад приветствовать! Давно не было слышно. Ваша тема уже выросла в целое направление ардуинистов-аквариумистов |
|
#2105720 |
|
Постоянный посетитель
|
|
Дядька-рыбомор Да. Спасибо Вам, что поддерживаете данную тему. Мне, к сожаленью, не легко на это находить время. Изменилось многое в жизни, работа, место жительства и пр. обстоятельства. Даже банками жена занимается...еще тот аквариумист получился... Извиниюсь за "не в тему".... PS: Главного то не сказал... Перечитал сейчас тему, и вообщем-то обнаружил, что в ней есть практически все, что нужно для построения несложного и довольно-таки надежного аквариумного контроллера, по среднестатистическим требованиям, и за не большие деньги. Значит не зря... Изменено 6.7.15 автор Z0RS |
|
#2105725 |
Постоянный посетитель
|
|
Z0RSспасибо за код , завтра попробую-) но коль все здесь, ещё немного понаглею . Но как теперь написать , что бы он озлаждал допустим на 1 градус до 25 и отключался . Ведь в данном случае он будет дёргаться он оф . Или может проще иф темпер больше 26 , работать 20 мин . затем проверить значение температуры? |
|
#2105730 |
Завсегдатай, Кандидат в Советники
|
|
Bloody К примеру, вот кусочек моего кода (там у меня еще одним условием было время, чтобы кулер не жужжал по ночам, но я его убрал, чтоб вас не путать). if(temp > (t + tGist)) { digitalWrite(TermRel, HIGH); } else if (temp { digitalWrite(TermRel, LOW); } Понятно, что значения t ( у меня 27 гр) и гистерезиса tGist (у меня 0,25 гр), вывода TermRel заданы заранее. Т.е. при достижении 27,25 гр кулер включается, а при опускании до 26,75 гр - выключается. Т.е. вегда есть люфт в 0,5 градусов, и релешка не щелкает постоянно. На этой основе можно постоить вообще кучу всего, типа датчика движения, пардон, в сортире, и т.д. |
|
#2105738 |
Постоянный посетитель
|
|
Дядька-рыбомор Всё работает , всё теперь понятно . Но теперь хочется большего !!! Хочется рассветзакат. Да да , для начала бутафорная лента на крии 5050 диодах . Всё это надо реализовывать на таких димирующих платах? http://ru.aliexpress... или есть на 1 канал? не могу найти . |
|
#2107510 |
|
Посетитель
|
|
Для светодиодной ленты не нужно никаких диммирующих плат. |
|
#2107816 |
Посетитель
|
|
Bloody Может Вам пригодиться как сделано у меня. Июнь был жарким, но в аквариуме вода выше 26 градусов не поднималась. Кулер состоит из 4-х обычных компьютерных 80-ти мм. вентиляторов. Управление через ШИМ на том же IRL520. Ниже приведена функция охлаждения. Кратко: f_temp - показания температурного датчика, f_tAqua - нужная температура в аквариуме. Остальные переменные, думаю, интуитивно понятны. Логика такая: void WaterCooling() { static int fansValue = 0; static boolean b_hotTrigger = 0; boolean b_waterHot = f_temp > (f_tAqua + f_hotGist); boolean b_waterNorm = !b_waterHot; boolean b_waterHotToNorm = f_temp boolean b_light_1 = digitalRead(pinMainLight) == ON; boolean b_light_2 = digitalRead(pinAuxLight) == ON; boolean b_coolingOn_1 = b_light_1 && !b_light_2; boolean b_coolingOn_2 = b_light_1 && b_light_2; boolean b_coolingOff = !(b_coolingOn_1 || b_coolingOn_2); if (b_waterHot) { //Максимальное вращение вентиляторов fansValue = 255; // при перегреве воды. b_hotTrigger = 1; } if (b_hotTrigger && !b_waterHotToNorm) { //Охлаждаем на максимальных оборотах до температуры f_tAqua + f_aquaGist fansValue = 255; } else if (b_waterHotToNorm && b_hotTrigger) { b_hotTrigger = 0; } if (b_waterNorm && b_coolingOn_1 && !b_hotTrigger) { //Охлаждение ламп при норм. темп-ре воды. fansValue = 80; } else if (b_waterNorm && b_coolingOn_2 && !b_hotTrigger) { //Включение дополнительного охлаждения при включении всех ламп. fansValue = 120; } else if (b_waterNorm && b_coolingOff && !b_hotTrigger) {//Выключение охлаждения на ночь, если темп-ра в пределах нормы fansValue = 0; } analogWrite(pinFans, fansValue); } Изменено 13.7.15 автор Mr.Sim Изменено 14.7.15 автор Mr.Sim |
|
#2107819 |
Малёк
13
Пермь 9 года |
2 DS18B20 на 2х каналах arduino (страница 12) |
Добрый день , купил ардуино нано 3 дисплей олед, 8 канальное реле, часовой модуль, столкнулся с проблемой. Нашел пример как подключается 1 термодатчик и в зависимости от температуры включает или выключает вентилятор, не выходит переделать его в 2 датчика и 2 канала. |
|
#2111667 |
|
Малёк
12
9 года |
Код рассвета/заката (страница 12) |
Добрый день. Оч. хочется посмотреть код рассвет/закат, который выкладывал Z0RS на второй-третей странице темы. К сожалению ссылки уже не работают. Если есть возможность, обновите ссылки пожалуйста. (SunRiseSunSet_2.rar удален из-за сбоя) |
|
#2132031 |
Новичок
1
9 года |
|
Доброго времени суток. |
|
#2147954 |
Посетитель
|
|
#2147987 |
|
Малёк
|
|
Доброе время суток. Имеется Лед светильник, который питается от двух разных НИПТ. Т.е. половина СД питаются от НИПТ-64350, а вторая половина от НИПТ-125300/350. Хочу сделать контроллер закат-рассвет. Вот такие компаненты я подобрал: Arduino Nano и модуль часов и Реле . |
|
#2158093 |
Посетитель
|
|
Sk13dustЕсли позволите, часы лучше брать на DS3231, не будет проблем с точностью хода, и релейный блок достаточно на два реле (если только для света). Вы же ступенчатое управление светом хотите, правильно? Изменено 7.12.15 автор fogary |
|
#2158186 |
Малёк
|
|
fogaryда, хочется рассвет- закат. Правильно-ли я понял что мои НИПТ подключаются к реле. Простите если задаю глупые вопросы, но честное слово, я читал тему и пытался понять, что к чему. Просто у автора на блок схеме дальше реле нет нечего. Изменено 7.12.15 автор Sk13dust |
|
#2158198 |
|
Посетитель
|
|
Sk13dustДа, НИПТ подключаете через реле. Вобщем-то, для Вашего случая достаточно использовать два таймера (для разетки). Подключаете НИПТ каждый к своему таймеру. Программируете один таймер на весь световой день. Второй так что бы включался позже, а выключался раньше на несколько часов. |
|
#2158212 |
Малёк
|
|
fogary Это все понятно. Но мне нужно диммировать оба канала по средствам ардуино. Изменено 7.12.15 автор Daxel |
|
#2158223 |
Посетитель
|
|
Sk13dustВроде у Ваших НИПТ нет функции диммирования. Если хотите использовать диммирование, то зачем тогда блок реле? |
|
#2158240 |
|
Малёк
|
|
fogaryА какой блок использовать? чтобы не убирать НИПТ? я понимаю, что нужно чтото вроде "реостата"))) под управлением ардуино. |
|
#2158249 |
Посетитель
|
|
Sk13dust С неуправляемыми драйверами не получится регулировать яркость. Это не светодиодная лента с БП, где можно тупо в разрез воткнуть ШИМ-ключ. Тут при отрубании нагрузки драйвер задерет напряжение на максимум и при подключении будет удар по диодам, пока не стабилизирует ток. И так много раз в секунду. Кому-то из них от такой работы может поплохеть. Управлять надо самим драйвером. |
|
#2158252 |
Малёк
|
|
dkozyrevСпасибо, понял. |
|
#2158260 |
|
Новичок
1
9 года |
|
Здравствуйте!!! |
|
#2184028 |
Новичок
|
|
Z0RS Для программирования нескольких включений каждого реле в течение суток - естественно, потребуется несколько другой подход....спрашивайте когда кому-то потребуется, пока не хочу все усложнять... Здравствуйте господа хорошие. Возникла потребность в четвертом канале с включением реле два раза в течении дня. Освещение аквариума с 9-13 и с15-21 часа Изменено 26.2.16 автор кикстартер |
|
#2191869 |
Посетитель
|
|
Есть такой вариант: |
|
#2192088 |
|
Посетитель
|
|
Еще есть вариант, через массив: |
|
#2192091 |
Новичок
|
|
БОЛЬШОЕ СПАСИБО за отклики но в программировании я "0", но зато очень хочется сотворить контроллер своими руками (руки чешутся ). Во втором варианте скетча уважаемый ZORS запустил третий канал под регулировку температуры воды. А вот четвертый канал с с двойным включения реле в течении суток для этого скетча с коментариями, вот что мне нужно! |
|
#2192254 |