Постоянный посетитель


693 78
Выкса
2 г. назад

ARDUINO для автоматизации аквариума

Создал отдельную тему по вопросам использования простых и не дорогих плат 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 <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC
#include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени 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 < (StartRelCn_1+DurationCh_1)))
//Если секунд с начала суток больше, чем задано для включения
//Но, одновременно и меньше, чем задано для включения + длительность
{
digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
}
else //во всех остальных случаях
{
digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
}

//------------КАНАЛ 2 - все аналогично -----------
if ((utime >= StartRelCn_2) &&
(utime < (StartRelCn_2+DurationCh_2)))
{
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-21 добавлено 21/12/2013 15:57:48#1907148

Новичок


9
Russian Federation Tomsk
11 мес. назад
dkozyrev

Для меня не все так просто, я кое как выдать значения смог в сериал порт, на большее нужна практика.
У меня похоже еще что-то с самой ардуино. Она изначально как то странно запускалась - проходило на все ножки паразитное напряжение при включении. Подозреваю на неисправность фильтров питания. Вроде бы одного резистора не хватает на входе питания.
Заказал еще две, когда придут более плотно займусь этим вопросом.

Сегодня убил почти 2 часа вспоминая как написать простой код рассвета-заката без привязки к времени через функцию "for" и задержку "delay"
Собрал все назад, но запускается через раз. Стабильный запуск только при подключении через USB (думаю за счет опроса ардуино нормально стартует). Точно что-то с самой платкой.

Извиняюсь за неверную ссылку. Вот нормальная:
https://drive.google...
2017-01-24 добавлено 24/01/2017 14:02:02#2331025

Малёк


15
Russian Federation Moscow
2 мес. назад
Roywalk

Проверьте, может дело в питании? При питании от USB ардуина оттуда берет 5 вольт и сразу пользует, при питании через ножки ардуина пропускает напряжение через понижающий стабилизатор до 5 вольт. Возможно этот узел глючит, если больше 5 вольт.
У меня так было, на 9 вольт на всех аналоговых выходах напряжение появлялось, независимо от скетча. Даже на блинке реллюшки работали. Хотя по стандартам ардуина должна больше 9 вольт тянуть.

Изменено 24.1.17 автор D.motor
2017-01-24 добавлено 24/01/2017 16:13:35#2331091

Посетитель


387 49
Подольск
9 дн. назад
Roywalk

Вобщем проверяйте питание. Вывод +5V как раз с питанием микроконтроллера соединен.
И на все выходы оно точно не должно идти при включении. Может сгорел преобразователь и МК подпалило.
Программа не шедевр, но работать должна.
И по поводу рассветов в цикле, оно конечно самому подумать всегда полезно , но можно было и заглянуть в код Дядьки-рыбомора из соседней темы:
long pwm;
if ((UTime<Led1On) || (UTime>=Led1Off + Led1Dur))
{
pwm=PWM_MIN;
}
else if((UTime>=Led1On) && (UTime<(Led1On + Led1Dur)))
{
pwm = ((UTime - Led1On)*(PWM_MAX-PWM_MIN)) / Led1Dur;
}
else if((UTime>=Led1Off) && (UTime<Led1Off + Led1Dur))
{
pwm=((Led1Off + Led1Dur - UTime)*(PWM_MAX-PWM_MIN))/Led1Dur;
}
else
{
pwm=PWM_MAX;
}
analogWrite(Led1, pwm);
2017-01-24 добавлено 24/01/2017 16:47:05#2331103

Посетитель


432 71
Новокузнецк
6 мес. назад
При 8 битном шим свет включается ступенчато, и уже при analogWrite(LedPin, 1) светодиоды светятся весьма ярко, не получается плавного "рассвета/заката".
Все гораздо лучше смотрится при шим 10 бит, но аппаратно он есть у DUE, (а эта плата заметно дороже даже Меги и нетерпима к напряжению более 3,3 В на портах, что добавляет некоторые неудобства, хоть и решаемые). Сегодня получил PCA9685 модуль для arduino , попробую с ней ради интереса, хотя сделал уже на DUE.

А с другой стороны - пока отлаживал поигрался с "расветозакатами", а сейчас все работает в режиме вкл/выкл... Нужны ли они - эти рассветы?

Изменено 25.1.17 автор KAA78
2017-01-25 добавлено 25/01/2017 11:38:40#2331549

Малёк


49 3
Russian Federation Chelyabinsk
2 дн. назад

Питание

D.motor


Здравствуйте. подскажите, что используете для питания Ардуино? только USB-порт? возможно ли использовать такую штуку ( ссылка ) для понижения с 12в до 7в для ардуино?
2017-01-30 добавлено 30/01/2017 07:21:51#2334113

Посетитель


387 49
Подольск
9 дн. назад
StanOK

Можно конечно, но зачем?
Если потребление небольшое (ардуинка, датчики, твердотельное реле), то можно и 12В напрямую кормить.
Если схема жрет много (+пяток электромагнитных реле, вентиляторы), то и при 7В набортный преобразователь будет греться, хотя и в разы меньше чем от 12.
А если уж ставите DC-DC, то чего бы сразу 5В не сделать и на +5В (или на USB) не подать, исключив набортный линейник вообще.
2017-01-30 добавлено 30/01/2017 12:32:46#2334204

Малёк


49 3
Russian Federation Chelyabinsk
2 дн. назад
dkozyrev


Предполагается такой обвес к Arduino uno:
1.LCD 16*2 (I2C) + 3 кнопки
2.Два твердотельных реле
3.Датчик температуры
4.Модуль часов
5.Работа ШИМ (с поднятием сигнала до 0-10V, с отдельным питанием, как раз для этого и буду 12в подводить).

При 12В норм будет? или какой-то радиатор или вент примострячить нужно? впервые работаю с Arduino =) ).

Изменено 30.1.17 автор StanOK
2017-01-30 добавлено 30/01/2017 12:55:39#2334217

Малёк


15
Russian Federation Moscow
2 мес. назад
StanOK

Использую подобный преобразователь.

Выдает 5в на общую шину. С шины питаю Arduino через USB разъем и всю периферию (релюшки, часы реального времени, экран, блютус модуль, датчики температуры)

Изменено 30.1.17 автор D.motor

Изменено 30.1.17 автор D.motor
2017-01-30 добавлено 30/01/2017 12:56:33#2334218

Посетитель


387 49
Подольск
9 дн. назад
StanOK

В таком наборе самое жручее это подсветка экрана, но миллиампер в 150 должно уложиться, а значит на линейнике не больше 1Вт выделится. А дальше зависит от разводки платы ардуины - если преобразователь к приличному полигончику припаян, то радиаторы-вентиляторы не понадобятся.
А если будет сильно греться, то всегда можно DC-DC поставить, причем лучше такую
https://ru.aliexpres...
Без вольтметра, но места не занимает и микросхема эффективнее.
2017-01-30 добавлено 30/01/2017 13:26:56#2334228

Посетитель


123 3
Russian Federation Togliatti
28 дн. назад
Roywalk
Она изначально как то странно запускалась - проходило на все ножки паразитное напряжение при включении.

У меня такое было, включались все каналы. Я уже не помню почему, но это связано с питанием ардуинки!
2017-01-30 добавлено 30/01/2017 19:38:25#2334409

Новичок


1
Ukraine Kiev
8 мес. назад

Помогите пожалуйста!

Z0RS

Доброго времени суток !Очень буду благодарен за помощь, так как в программировании я полный чайник ((
Насколько я понимаю при заливке скетча строка // RTC.adjust(DateTime(__DATE__, __TIME__)); используется один раз, и в дальнейшем удаляется из скетча. Строка RTC.adjust(__DATE__, __TIME__)) не изменяется и прописывает время компиляции сама автоматически, или нужно в ней прописывать дату, тогда подскажите в каком формате?? Выходит что если пропало питание на ардуино и через время появилось то она(ардуинка) будет в DS1307 перешивать дату по новой из-за етой строки или я заблуждаюсь ?

И еще подскажите пожалуйста как сюда прописать датчик влажности lm393 что б ардуино постоянно проверял (ежесекундно или ежеминутно ) влажность и при достижении например 70 % влажности отключал питание на реле в не зависимости от показаний часов реального времени , то есть защита от КЗ при намокании, а когда уровень влажности будет меньше 70% разрешал включать/выключать свет на реле через показания часов реального времени? Во блин загнул, надеюсь поймете ))
2017-03-30 добавлено 30/03/2017 00:22:29#2361677

Посетитель


432 71
Новокузнецк
6 мес. назад
Lm393 - датчик влажности почвы, а не воздуха. Если нужен датчик влажности воздуха, то существуют датчики DHT11 и DHT22. По ним много примеров в сети.
Но, отключать свет по датчику влажности... ну не знаю... 70% - нормальная влажность летом, а под крышкой аквариума, если не вентилировать, то влажность скорее всего стремится к 100%.

RTC.adjust(DateTime(__DATE__, __TIME__)); // каждый раз прописывает в РТЦ время и дату, которое было в момент компиляции.

Изменено 30.3.17 автор KAA78
2017-03-30 добавлено 30/03/2017 06:14:49#2361696

Посетитель


387 49
Подольск
9 дн. назад
Dybina

RTC.Adjust прописывает в часы время компиляции, а значит если ее оставить на постоянную, то будет портить время при перезагрузках. Надо раскомментировать эту строку, загрузить скетч для выставления времени, а потом закомментировать обратно и еще раз загрузить.
Lm393 вообще не датчик, а микросхема компаратор, выдает цифровой сигнал при достижении аналоговым сигналом заданного уровня. Что у вас там в качестве собственно датчика?
И да, запрещать включать свет при высокой влажности не дело. Под крышкой аквариума она будет гарантировано. Но можно включать вентилятор для ее понижения.
2017-03-30 добавлено 30/03/2017 09:21:02#2361730

Новичок


3
United States Providence
5 мес. назад
Z0RS


Здравствуйте, сделал по Вашему скетчу проект: свет по движению, PIRдатчик -> ардуино -> реле -> свет, поработал минутку-две, потух. НО, днем свет включать не нужно ибо имеется "лампочка" природная.
использую RTC3231
скетч
ВОЗМОЖНО СПАМ. Если вы хотите открыть ссылку, скопируйте ее в адресную строку самостоятельно

но выполняется только второе условие "NO Check"
Уж голову заламал, помогите
2017-07-21 добавлено 21/07/2017 16:48:00#2395409

Посетитель


387 49
Подольск
9 дн. назад
V_Z

У вас свет включается по движению рыбок??
А проблема тут:
const int StartPIRCn_1 = 72000;
const int DurationCh_1 = 1400;
уставки надо тоже long делать, не лезут такие числа в int
а лучше (ОЗУ не расходует)
#define StartPIRCn_1 72000UL
#define DurationCh_1 1400UL
2017-07-21 добавлено 21/07/2017 17:00:00#2395414

Новичок


3
United States Providence
5 мес. назад
а-а-н нет не для рыбок. просто перелопатил инет и не нашел ни одного скетча. а здесь мне понравился
Спасибо что откликнулись сейчас попробую
2017-07-21 добавлено 21/07/2017 17:55:56#2395427

Новичок


3
United States Providence
5 мес. назад
dkozyrev


Вы просто БОГ !!!
СПАСИБО огромное !
2017-07-21 добавлено 21/07/2017 18:03:45#2395431

Завсегдатай


1657 293
Москва
1.5
8 час. назад
dkozyrev


Коллеги,

Есть просьба, помочь с актуализацией названий устройств для покупки компонентов, с Arduino никогда дело не имел, но думаю достаточно быстро освоить. Дома стоит 2 unix сервера, для одного старого на arm периодически приходится что-то перекомпилировать.

Мысли следующие.
1. Розетки таймеры, 4-5 штук управляемые по WIFI. Сеть настраивается - 2 (два устройства)
2. Управляющий компьютер - Host (возможно на Raspberi PI) - подключен по ethernet. Порт с web - интерфейсом доступен из вне для управления.
3. Управление температурой через 2 розетки (1 на нагрев, 2-я Охлаждение) и через температурный датчик (лучше встроить в №1).
Охлаждение - вентиляторы с регулировкой вращения через питание.

Дополнительно (план на будущее)
4. Отдельное устройство - спектрофотометр - точный анализ тестов воды на основе капельных тестов JBL
PH, Нитраты, Фосфаты, Калий

Пока все...
2017-08-07 добавлено 07/08/2017 00:05:46#2399620

Посетитель


387 49
Подольск
9 дн. назад
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, лог на флешке. На меге объем памяти не позволит реализовать интерфейс с рюшечками, но зато просто, надежно, и вирусы не страшны
2017-08-14 добавлено 14/08/2017 16:43:43#2401343
Нравится rainmaverick

Завсегдатай


1657 293
Москва
1.5
8 час. назад
dkozyrev


В домашней сети уже есть Linux сервер, даже два.
Поэтому думал это все на MQTT затащить... Спасибо за информацию, буду на досуге разбираться и заказывать части.
2017-08-14 добавлено 14/08/2017 16:55:59#2401347



Аквариум и аквариумные рыбки на АКВА.ру