Постоянный посетитель
|
ARDUINO для автоматизации аквариума (страница 16) |
Создал отдельную тему по вопросам использования простых и не дорогих плат 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 |
Новичок
9
8 года |
|
dkozyrev Для меня не все так просто, я кое как выдать значения смог в сериал порт, на большее нужна практика. У меня похоже еще что-то с самой ардуино. Она изначально как то странно запускалась - проходило на все ножки паразитное напряжение при включении. Подозреваю на неисправность фильтров питания. Вроде бы одного резистора не хватает на входе питания. Заказал еще две, когда придут более плотно займусь этим вопросом. Сегодня убил почти 2 часа вспоминая как написать простой код рассвета-заката без привязки к времени через функцию "for" и задержку "delay" Собрал все назад, но запускается через раз. Стабильный запуск только при подключении через USB (думаю за счет опроса ардуино нормально стартует). Точно что-то с самой платкой. Извиняюсь за неверную ссылку. Вот нормальная: https://drive.google... |
|
#2331025 |
|
Малёк
18
4 года |
|
Roywalk Проверьте, может дело в питании? При питании от USB ардуина оттуда берет 5 вольт и сразу пользует, при питании через ножки ардуина пропускает напряжение через понижающий стабилизатор до 5 вольт. Возможно этот узел глючит, если больше 5 вольт. У меня так было, на 9 вольт на всех аналоговых выходах напряжение появлялось, независимо от скетча. Даже на блинке реллюшки работали. Хотя по стандартам ардуина должна больше 9 вольт тянуть. Изменено 24.1.17 автор D.motor |
|
#2331091 |
Посетитель
|
|
Roywalk Вобщем проверяйте питание. Вывод +5V как раз с питанием микроконтроллера соединен. И на все выходы оно точно не должно идти при включении. Может сгорел преобразователь и МК подпалило. Программа не шедевр, но работать должна. И по поводу рассветов в цикле, оно конечно самому подумать всегда полезно , но можно было и заглянуть в код Дядьки-рыбомора из соседней темы: long pwm; if ((UTime=Led1Off + Led1Dur)) { pwm=PWM_MIN; } else if((UTime>=Led1On) && (UTime { pwm = ((UTime - Led1On)*(PWM_MAX-PWM_MIN)) / Led1Dur; } else if((UTime>=Led1Off) && (UTime { pwm=((Led1Off + Led1Dur - UTime)*(PWM_MAX-PWM_MIN))/Led1Dur; } else { pwm=PWM_MAX; } analogWrite(Led1, pwm); |
|
#2331103 |
Постоянный посетитель
|
|
При 8 битном шим свет включается ступенчато, и уже при analogWrite(LedPin, 1) светодиоды светятся весьма ярко, не получается плавного "рассвета/заката". |
|
#2331549 |
Посетитель
|
Питание (страница 16) |
#2334113 |
|
Посетитель
|
|
StanOK Можно конечно, но зачем? Если потребление небольшое (ардуинка, датчики, твердотельное реле), то можно и 12В напрямую кормить. Если схема жрет много (+пяток электромагнитных реле, вентиляторы), то и при 7В набортный преобразователь будет греться, хотя и в разы меньше чем от 12. А если уж ставите DC-DC, то чего бы сразу 5В не сделать и на +5В (или на USB) не подать, исключив набортный линейник вообще. |
|
#2334204 |
Посетитель
|
|
dkozyrev Предполагается такой обвес к Arduino uno: 1.LCD 16*2 (I2C) + 3 кнопки 2.Два твердотельных реле 3.Датчик температуры 4.Модуль часов 5.Работа ШИМ (с поднятием сигнала до 0-10V, с отдельным питанием, как раз для этого и буду 12в подводить). При 12В норм будет? или какой-то радиатор или вент примострячить нужно? впервые работаю с Arduino =) ). Изменено 30.1.17 автор StanOK |
|
#2334217 |
Малёк
18
4 года |
|
StanOK Использую подобный преобразователь. Выдает 5в на общую шину. С шины питаю Arduino через USB разъем и всю периферию (релюшки, часы реального времени, экран, блютус модуль, датчики температуры) Изменено 30.1.17 автор D.motor Изменено 30.1.17 автор D.motor |
|
#2334218 |
|
Посетитель
|
|
StanOK В таком наборе самое жручее это подсветка экрана, но миллиампер в 150 должно уложиться, а значит на линейнике не больше 1Вт выделится. А дальше зависит от разводки платы ардуины - если преобразователь к приличному полигончику припаян, то радиаторы-вентиляторы не понадобятся. А если будет сильно греться, то всегда можно DC-DC поставить, причем лучше такую https://ru.aliexpres... Без вольтметра, но места не занимает и микросхема эффективнее. |
|
#2334228 |
Посетитель
|
|
Roywalk У меня такое было, включались все каналы. Я уже не помню почему, но это связано с питанием ардуинки! |
|
#2334409 |
Новичок
1
8 года |
Помогите пожалуйста! (страница 16) |
Z0RS Доброго времени суток !Очень буду благодарен за помощь, так как в программировании я полный чайник (( Насколько я понимаю при заливке скетча строка // RTC.adjust(DateTime(__DATE__, __TIME__)); используется один раз, и в дальнейшем удаляется из скетча. Строка RTC.adjust(__DATE__, __TIME__)) не изменяется и прописывает время компиляции сама автоматически, или нужно в ней прописывать дату, тогда подскажите в каком формате?? Выходит что если пропало питание на ардуино и через время появилось то она(ардуинка) будет в DS1307 перешивать дату по новой из-за етой строки или я заблуждаюсь ? И еще подскажите пожалуйста как сюда прописать датчик влажности lm393 что б ардуино постоянно проверял (ежесекундно или ежеминутно ) влажность и при достижении например 70 % влажности отключал питание на реле в не зависимости от показаний часов реального времени , то есть защита от КЗ при намокании, а когда уровень влажности будет меньше 70% разрешал включать/выключать свет на реле через показания часов реального времени? Во блин загнул, надеюсь поймете )) |
|
#2361677 |
|
Постоянный посетитель
|
|
Lm393 - датчик влажности почвы, а не воздуха. Если нужен датчик влажности воздуха, то существуют датчики DHT11 и DHT22. По ним много примеров в сети. |
|
#2361696 |
Посетитель
|
|
Dybina RTC.Adjust прописывает в часы время компиляции, а значит если ее оставить на постоянную, то будет портить время при перезагрузках. Надо раскомментировать эту строку, загрузить скетч для выставления времени, а потом закомментировать обратно и еще раз загрузить. Lm393 вообще не датчик, а микросхема компаратор, выдает цифровой сигнал при достижении аналоговым сигналом заданного уровня. Что у вас там в качестве собственно датчика? И да, запрещать включать свет при высокой влажности не дело. Под крышкой аквариума она будет гарантировано. Но можно включать вентилятор для ее понижения. |
|
#2361730 |
Новичок
3
7 года |
|
Z0RS Здравствуйте, сделал по Вашему скетчу проект: свет по движению, PIRдатчик -> ардуино -> реле -> свет, поработал минутку-две, потух. НО, днем свет включать не нужно ибо имеется "лампочка" природная. использую RTC3231 скетч https://drive.google... но выполняется только второе условие "NO Check" Уж голову заламал, помогите |
|
#2395409 |
|
Посетитель
|
|
V_Z У вас свет включается по движению рыбок?? А проблема тут: const int StartPIRCn_1 = 72000; const int DurationCh_1 = 1400; уставки надо тоже long делать, не лезут такие числа в int а лучше (ОЗУ не расходует) #define StartPIRCn_1 72000UL #define DurationCh_1 1400UL |
|
#2395414 |
Новичок
3
7 года |
|
а-а-н нет не для рыбок. просто перелопатил инет и не нашел ни одного скетча. а здесь мне понравился |
|
#2395427 |
Новичок
3
7 года |
|
#2395431 |
|
Свой на Aqa.ru
|
|
dkozyrev Коллеги, Есть просьба, помочь с актуализацией названий устройств для покупки компонентов, с Arduino никогда дело не имел, но думаю достаточно быстро освоить. Дома стоит 2 unix сервера, для одного старого на arm периодически приходится что-то перекомпилировать. Мысли следующие. 1. Розетки таймеры, 4-5 штук управляемые по WIFI. Сеть настраивается - 2 (два устройства) 2. Управляющий компьютер - Host (возможно на Raspberi PI) - подключен по ethernet. Порт с web - интерфейсом доступен из вне для управления. 3. Управление температурой через 2 розетки (1 на нагрев, 2-я Охлаждение) и через температурный датчик (лучше встроить в №1). Охлаждение - вентиляторы с регулировкой вращения через питание. Дополнительно (план на будущее) 4. Отдельное устройство - спектрофотометр - точный анализ тестов воды на основе капельных тестов JBL PH, Нитраты, Фосфаты, Калий Пока все... |
|
#2399620 |
Посетитель
|
|
rainmaverick Если важно подключение аквакомпа (умной розетки) по WIFI, то имеет смысл собирать не на основе плат Arduino, а на ESP8266. Тут управляющий МК и сеть в одном чипе. Есть как мелкие дешевые модули типа ESP-12E, малопригодные для пайки на макетке, так и более удобные типа NodeMcu V3 с обвесом как у Arduino Nano. Программируется из той же среды Arduino IDE с библиотеками. Можно сделать как веб интерфейс на самом микроконтроллере, так и клиент-серверный обмен, например MQTT. Но танцев с бубном побольше чем у ардуин, питание надо покачественнее. Есть уже готовые проекты: https://reefcentral.... Реле для розеток имеет смысл брать на 12В (массово продаются аналогичные на 5В) https://ru.aliexpres... в этом случае будет достаточно одного мощного БП для питания реле и вентиляторов охлаждения и минимум преобразователей. И не забыть вынуть перемычку VCC / JD-VCC. Ну или симисторные OMRON G3MB-202P: https://mysku.ru/blo... Плюс термодатчики DS18В20, часы реального времени DS3231 для автономности. Для охлаждения компьютерные вентиляторы и регулировка при помощи 12В ШИМ. В качестве ключа любой мосфет, например IRLML5203 и нему оптодрайвер TLP250. PS А у меня акваконтроллером работает Atmega328 + Ethernet ENC28J60. HTTP для настройки и управления, NTP, Narodmon, лог на флешке. На меге объем памяти не позволит реализовать интерфейс с рюшечками, но зато просто, надежно, и вирусы не страшны |
|
#2401343 Нравится rainmaverick
|
Свой на Aqa.ru
|
|
dkozyrev В домашней сети уже есть Linux сервер, даже два. Поэтому думал это все на MQTT затащить... Спасибо за информацию, буду на досуге разбираться и заказывать части. |
|
#2401347 |
|
Посетитель
|
|
Господа, а возможно ли сделать подсчет пузырьков в счетчике ардуинкой? Какой датчик сможет их увидеть? Оптический в видимом диапазоне справится? |
|
#2449799 |
Посетитель
|
|
Отвечаю на свой же вопрос: |
|
#2449884 |
Посетитель
|
|
#2449891 |
|
Посетитель
|
|
Gar-Ik Нет. В счетчике вода подкрашена пищевым красителем хлорофиллином (надо пробовать ещё прозрачную). Колба просвечивается по центру лазерным лучом. Пятно падает на фоторезистор. При прохождении пузырька луч преломляется и рассеивается в стороны. Световой поток на фоторезистор уменьшается и сигнал пропадает. Чувствительность фоторезистора настраивается. Обычными светодиодами бесполезно. Рассеивается свет. Изменено 10.1.18 автор Lex_vx |
|
#2450017 |
Посетитель
|
|
#2450024 |