go to bottom
Постоянный посетитель
Аквафорум рыбкаАквафорум рыбкаАквафорум рыбка
Аватар пользователя

693 90
Выкса
3 года

ARDUINO для автоматизации аквариума (страница 14)

Создал отдельную тему по вопросам использования простых и не дорогих плат ARDUINO для целей автоматизации аквариума.
Идея такая - довести это устройство до полнофункционального контроллера для аквариума, в итоге - с WEB сервером для управления по сети в т.ч. Интернет, и GSM модулем с отправкой SMS.
Начало обсуждения в теме про дозатор :
дозатор

Информация будет, в основном, в виде конкретных примеров.

Пример 1. Использоание плат Arduino UNO и Arduino NANO для управления по времени суток устройствами в 2-х каналах посредством релейного модуля.
Предполагается использование для создания 2-х канального дозатора, но и для включения света, например подойдет, и для многих других целей также.

Используется модуль часов реального времени, для точного планирования по времени суток, и релейный модуль. В данном примере используется 4-канальный, но 2 канала не используются...

Схема коммутации в случае использования платы UNO R3:

для форума


Схема коммутации в случае использования платы 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
2013-12-2121/12/2013 15:57:48
#1907148
Свой на Aqa.ru, Советник
Советник аквафорума

Аватар пользователя

2284 514
Москва
7 года

megaagressor

Последняя табличка на картинке: 10V PWM
2016-07-1717/07/2016 22:40:18
#2252027
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

189 19
Ульяновск
1 года

А что это обозначает???

2016-07-1717/07/2016 22:48:06
#2252028
Свой на Aqa.ru, Кандидат в Советники
Кандидат в советники аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорума

Аватар пользователя

2593 1107
Москва
5 года

megaagressor

Это означает, что амплитуда ШИМ 10в. Усилитель надо делать.
2016-07-1717/07/2016 22:49:58
#2252029
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

189 19
Ульяновск
1 года

Спасибо, я ноль в андруино. Только начал интересоваться, можете более объяснить???

2016-07-1717/07/2016 22:52:51
#2252030
Свой на Aqa.ru, Кандидат в Советники
Кандидат в советники аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорумаРыбки аквафорума

Аватар пользователя

2593 1107
Москва
5 года

megaagressor

Можно использовать например транзистор TIP122 .
2016-07-1818/07/2016 05:49:42
#2252047
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

Ардуинка (страница 14)


Z0RS

Привет. В работе с МК, новичок. Почитав первые посты, используя скетчи Примеры 1 и 2, немного исправив код для своих целей сделал незатейливую автоматику аквариума на 8-канальной плате реле: Реле 1-3 постепенно увеличивают мощность освещения в аквариуме (лампы ЛМ через 3 выключателя 1+1+2 Лампы), 4 - Розетка для управления ЭМ клапаном СО2 по времени, 6 и 7 - управление дозаторами, 7 и 8 - посредством использования датчика температуры (Пример 2) соответственно Нагрев и Охлаждение аквариума. В тестовом режиме несколько суток.

Спасибо Автору темы за открытость и доступность преподносимой информации.
Хотя сегодня далеко не все понятно, но суть просматривается =).

Изменено 31.8.16 автор epifran
2016-08-3131/08/2016 13:33:35
#2265147
Малёк
Аквафорум рыбка
Аватар пользователя

10 1
Люберцы
9 года

Доброго дня всем!!!
Ребят, с ардуино раньше не сталкивался, только начал изучать сей интересный девайс.
У меня вопрос возник, чем различаются эти две платы Классик УНО(кроме визуального различия)??? И какая плата лучше???
Первый вариант - http://ru.aliexpress... Второй вариант http://ru.aliexpress...
Спасибо всем откликнувшимся!!!

Изменено 1.9.16 автор ShreD

Изменено 1.9.16 автор ShreD

2016-09-0101/09/2016 12:45:20
#2265441
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

375 87
Москва
7 час.

ShreD
Ребят, с ардуино раньше не сталкивался, только начал изучать сей интересный девайс.
У меня вопрос возник, чем различаются эти две платы Классик УНО(кроме визуального различия)??? И какая плата лучше???
Первый вариант - http://ru.aliexpress... Второй вариант http://ru.aliexpress...
Возможно (по второй ссылке не видно), стоят разные микросхемы контроллера USB. При наличии драйвера - не существенно.
Первая - выглядит по-аккуратнее. На наличие/отсутсвие кабеля можно не смотреть.
2016-09-0101/09/2016 14:56:39
#2265493
Малёк
Аквафорум рыбка
Аватар пользователя

10 1
Люберцы
9 года

fogary

Ясна, спасибо за ответ!
2016-09-0101/09/2016 15:11:58
#2265500
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

375 87
Москва
7 час.

ShreD
Если планируете использовать модуль RTC, выбирайте на микросхеме DS3231. Преимущество - точность хода; два программируемых будильника.
2016-09-0101/09/2016 15:29:15
#2265505
Малёк
Аквафорум рыбка
Аватар пользователя

10 1
Люберцы
9 года

fogary

Да, в планах было использовать модуль RTC.
Вы не против если я пару вопросов задам в U2U?
2016-09-0101/09/2016 15:38:11
#2265510
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

414 62
Подольск
10 мес.

ShreD

Второй вариант (с ATMEGA16U2) лучше как минимум потому, что это клон оригинальной итальянской схемы и его можно перепрограммировать по своим нуждам - чтобы ардуина видилась клавой/мышкой, а не просто ком-портом.
2016-09-0101/09/2016 18:23:05
#2265545
Малёк
Аквафорум рыбка
Аватар пользователя

10 1
Люберцы
9 года

Спасиб Дим, учту при заказе.

2016-09-0101/09/2016 18:36:50
#2265549
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

358 130
Russian Federation Tyumen
21 дн.

[q] dkozyrev

ShreD

Если делать контроллер для аквариума, то совсем необязательно, чтобы он виделся клавой или мышкой. Вот такая плата уно у меня прекрасно работает в контроллере аквариума http://www.ebay.com/...
Стоит как минимум в 1.5 раза дешевле. Никаких проблем с ней не было. Недавно пришла плата Arduino Nano, она мне настолько понравилась своей миниатюрностью и полным функционалом UNO, что решил теперь устройства делать только на ней. Стоит еще дешевле. Вот. например http://www.ebay.com/...
2016-09-0202/09/2016 10:57:19
#2265721
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

375 87
Москва
7 час.

ShreD
Вы не против если я пару вопросов задам в U2U?
Не против.
2016-09-0202/09/2016 13:28:38
#2265780
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

В работе датчик DS18B20 с подтягивающим 4к7 резистором. Освещение ЛМ лампы, когда включатся в работу все, датчик сходит с ума: жуткий дребезг, выгружал в сериал, то показывает температуру нормально, то -1001 градус. Скорее всего ловит наводки с ЭПРА светильников.
Как можно избавится от эфекта? Когда работают половина ламп (две из четырех и менее) - то все ОК.

Изменено 2.9.16 автор epifran

2016-09-0202/09/2016 21:54:12
#2265978
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

373 92
Ижевск
7 года

epifran
В работе датчик DS18B20 с подтягивающим 4к7 резистором.

Провод удлиняли? Я удлинял. И с таким номиналом у меня датчик тоже выдавал температуру, уходящую в минус. Сейчас уже не помню на каком номинале резистора методом подбора остановился. Короб разбирать не хочу. Попробуйте 2 или 1 кОм.
Почитайте ещё здесь .

Изменено 2.9.16 автор Mr.Sim
2016-09-0202/09/2016 22:25:25
#2265988
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

Mr.Sim

Пасиб за наводку =)
2016-09-0303/09/2016 08:36:54
#2266025
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

Mr.Sim

Отыскал кабель ЮСБ, вроде такого
для форума
(выпотрошил непотребный кабель).
Два провода на +5vdc, два провода на data. наружную оплетку на gnd.
Глюки исчезли.
2016-09-0303/09/2016 18:55:05
#2266168
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

414 62
Подольск
10 мес.

frdimitry
Если делать контроллер для аквариума, то совсем необязательно, чтобы он виделся клавой или мышкой. Вот такая плата уно у меня прекрасно работает в контроллере аквариума

Если брать ардуину только для установки в акваконтроллер, то понятно, чем дешевле тем лучше. Но для этих целей гораздо лучше подойдет Nano с еще более низкой ценой, габаритами и отсутствием лишних разъемов.
Uno, по-моему, стоит брать для экспериментов на столе, с паутиной проводов и навеской разных шилдов. И тут переплата в 1.5 раза в размере каких-то 100р идет за дополнительные функции, которые могут пригодиться, и возможность легко заменить МК. Который убить вполне реально ошибкой в расчетах, монтаже, да даже статикой от свитера, ибо защиты портов нет никакой. В вашем варианте придется ждать новую плату или осваивать пайку феном.
2016-09-0505/09/2016 11:40:46
#2266609
Посетитель
Аквафорум рыбкаАквафорум рыбка
Аватар пользователя

358 130
Russian Federation Tyumen
21 дн.

Я не совсем понял из последнего вашего поста, зачем переплачивать за такой контроллер, который вы предлагаете. Спалить ведь и его можно. Если есть боязнь спалить микроконтроллер, тогда за эти деньги, что вы предлагаете, купить 3 шт. ардуино нано и не переживать о том, что один из них спалишь. Уно удобен для макетирования, но тот контроллер (аналог уно), на который я дал ссылку, не менее удобен для макетирования. Получил ардуино нано и когда распечатал посылку, то сначала действительно испугался того, что он такой маленький и есть шанс перепутать выводы и что-нибудь спалить. Но. слава Богу, все обошлось, ничего не спалил. Все-таки схемы подключения того, что здесь рассматривается, довольно простые, и спалить нужно еще постараться. Один раз во время экспериментов на контроллер перестал загружаться скетч. Думал. что спалил что-то. Оказалось, что обновил версию IDE до 1.6.10 и в результате скетчи перестали загружаться. Откатился на 9 версию, все нормально. Сейчас стоит 11-я, также все нормально. Так что спалить можно все. что угодно. вот только это не аргумент для покупки более дорогой платы. Единственное ее преимущество - возможность загружать скетчи в arduino pro mini, но мне такая функция показалась сомнительной (вытаскивать контроллер из панельки, подключать платку, заливать скетч). Разница в стоимости между nano и pro mini такова, что проще купить nano и иметь возможность загружать модификации скетча без каких-то танцев с бубнами.

2016-09-0505/09/2016 21:05:38
#2266806
Малёк
Аквафорум рыбка
Аватар пользователя

11
Липецк
9 года

помогите разобраться
скетч самый первый никак не хочет работать

// RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале,
//для того, чтобы загрузить в RTC дату и время на момент компиляции программы
//Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки
//времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !
скажите как это сделать

Изменено 8.11.16 автор Moderator

2016-11-0808/11/2016 15:35:58
#2300105
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

bonlik


"//" - в начале строки, есть коментарий. Все, что после "//" - писаться не будет, это лишь пояснения, коментарий.
Если "//" не стоит - компилятор будет работать со строчкой.

Т.е.
Строчка
// RTC.adjust(DateTime(__DATE__, __TIME__));
Закоментирована
RTC.adjust(DateTime(__DATE__, __TIME__));
Не закоментирована.

Изменено 8.11.16 автор Moderator
2016-11-0808/11/2016 17:52:12
#2300150
Малёк
Аквафорум рыбка
Аватар пользователя

11
Липецк
9 года

спасибо огромное за пояснение. но скетч всё равно не хочет работать
что то я не правильно сделал
а что не пойму
говорила мама учись. нужно так?
RTC.adjust(DateTime(__DATE__, __TIME__));
почему не работает? ПОДСКАЖИТЕ



Изменено 8.11.16 автор bonlik

2016-11-0808/11/2016 21:26:30
#2300219
Новичок

Аватар пользователя

6
Belarus Zhodino
9 года

bonlik


Т.е. Вы целиком копируете весь скетчь из Пример1 с первой страницы топика, и у Вас не компилируется он?

Изменено 8.11.16 автор Moderator
2016-11-0808/11/2016 22:09:17
#2300239



Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Польвователь
Top