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

<<  2345678 >>

Свой на Aqa.ru




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

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

Пример 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 Files\Arduino\libraries
Сюда и помещайте папки с подключаемыми библиотеками. Если на этот момент, среда программирования была запущена - ее необходимо закрыть, и запустить заново. После этого библиотека будет доступна в меню Скетч/Импортировать библиотеку.

Микросхема 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

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Итак.
Пример 2. Использование простого и недорогого датчика температуры DS18B20.

Сделаем простенький термоконтроль на термодатчике и оставшемся от предыдущего примера - ТРЕТЬЕМ канале релейного модуля.
Для начала нужно подключить датчик температуры. DS18B20 - простой, недорогой, но довольно эффективный датчик температуры, если точность контроля на превышает 0,125 градуса. Но поскольку в аквариуме такая точность ни к чему - то этот датчик, хорошо подойдет для задач поддержания температуры, как нагревающими, так и охлаждающими устройствами.
У меня как раз "завалялся" один такой.

Данный датчик цифровой, он отдает значение температуры не ввиде аналогового сигнала, а использует цифровую шину данных, так называемую OneWire или IC.
Для того, чтобы организовать эту шину, в самом простейшем варианте - понадобиться постоянный резистор номиналом 4.3 кОм.
Итоговая схема соединений, с учетом предыдущего примера c использование платы Arduino UNO, а также с учетом использования LCD 16x2 будет выглядеть так:



Лишнее, с этой схемы можете убрать сами. Схему соединений с платой NANO - приводить не буду, т.к. практически все аналогично делается (см. предыдущий пример).

Здесь можно скачать архив с данной версией скетча:
http://my-files.ru/7...

Экран LCD при работе данного скетча - выглядит так:


Если LCD не будет использоваться - то соответствующие строки нужно удалить из скетча. Эти строки можно "опознать" либо по комментариям, либо они содержат функции объекта lcd, например lcd.setCursor(), или lcd.print ().

У датчика DS18B20 проверялась калибровка по двум точкам - таяния льда и кипения воды (вода для льда, и кипящая - дистиллированная), вот результаты:


Результаты - вполне приемлемые для простого термоконтроля в аквариуме. Термо-контроль в данном скетче - действительно примитивный, и близок по своей простоте и примитивности, к биметаллической пластине терморегуляторов в аквариумных нагревателях. Но с другой стороны имеется возможность подбирать точку уставки температуры и ширину гистерезиса.
Можно, конечно и сделать более сложный регулятор.....но для аквариума - это излишество.
В данном скетче я оставил настройки температуры, которые нужно изменить по необходимости :
float t0 = 30.5; //Уставка температуры для ТРЕТЬЕГО канала релейного модуля
float tGistrsis = 0.7;

т.е уставка на 30 с половиной градуса плюс-минус 0,35 градуса. Датчик положил на корпус реле 3го канала ( реле же нагревается немного во время срабатывания) и эта система уже вторые сутки "качает" температуру реле в пределах 1,2 градуса - ну, понятно, что практического применения это не имеет - только для тестирования системы, но в тестовом режиме - пока отрабатывает нормально.

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


Изменено 24.12.13 автор Z0RS
2013-12-24 добавлено 24/12/2013 20:19:47#1908795

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




257 4
Новосибирск
6 мес. назад
А можно как нить светодиоды запитать от ардуино? Желательно чтобы рассвет, закат.
Светодиод 3 ватта 6000К-6500К;
максимальный ток 700мА,
напряжение питания 3,4 В.
Вот таких штук десять диодов.
2013-12-25 добавлено 25/12/2013 13:44:05#1909026

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
lisenkow
А можно как нить светодиоды запитать от ардуино? Желательно чтобы рассвет, закат.


Ну...я надеюсь, что под словом "запитать", имелось ввиду управление яркостью светодиодов, а не электропитание, ардуино - все-таки, не блок питания, а микропроцессорная плата.

Вообще, пока безотносительно к управлению яркостью свечения светодиодов - для организации "правильного" эл.питания светодиодов - применяют стабилизаторы тока, которые называют - "драйвер". Т.е с источника постоянного напряжения (первичное не стабилизированное) - питание подается на драйвер, а с другой стороны к драйверу подключается светодиод или несколько последовательно соединенных светодиодов. Требуемое суммарное падение напряжения на последовательной сборке светодиодов, плюс падение напряжения на драйвере должно быть меньше, чем первичное постоянное напряжение, подаваемое на драйвер.

Иногда источник первичного постоянного напряжения и драйвер объединяют в одно устройство.

Как правило драйвер светодиода - использует частотно-импульсную модуляцию для организации стабилизации тока, и требует, в случае питания последовательной сборки нескольких светодиодов - подбора номиналов некоторых деталей, как правило - сопротивления драйвера, индуктивности дросселя и емкостей входного и выходного конденсаторов. Вообще, драйвер представляет из себя микросхему драйвера и несколько деталей, почти все из которых я перечислил выше - всего, как правило 5 деталей.

Теперь об управлении.

Существуют микросхемы драйвера, имеющие диммирующий вход. Диммирующий вход позволяет использовать на нем сигнал с Широтно-Импульсной Модулящией (ШИМ).
Работает диммирующий вход, как правило - следующим образом - при подаче на него низкого уровня (как правило до 0,3В - но необходимо уточнить в даташите) внутренний ключ драйвера - закрывается. Подавая на этот вход с выхода платы ардуино сигнал ШИМ и управляя процентным содержанием скважности ШИМ сигнала - можно управлять яркостью свечения светодиода, подключенного к драйверу - практически с линейной зависимостью.
Необходимо, проверять соответствие частоты ШИМ сигнала (для Ардуино это 500 Гц.) и диапазона допустимых частот микросхемы драйвера.

На ибее попадаются комплектные драйвера с ШИМ диммированием (LED Driver PWM) например, такие :
http://www.ebay.com/...

или вот такой, с настраиваемым током (0,35 или 0,7 или 1,0 А):
http://www.ebay.com/...
Этот относительно недорогой....

Но собрать самому - все равно, будет дешевле раза в 3-4. Тем более что, иногда микросхемы драйверов попадаются по бросовым ценам - 20-30 руб за MBI6651, на которой можно собрать весьма мощные драйвера.

Здесь можно посмотреть про нее:


Ну и в даташите лучше всего :
http://www.ledlabs.r...

Можно брать более мощные микросхемы драйвера и объединять светодиоды последовательно, но тогда понадобится источник первичного постоянного напряжения с более высоким уровнем, и у микросхемы драйвера могут быть ограничения по питающему напряжению.

К сожалению, из-за отсутствия возможности "по-быстрому" раздобыть микросхему драйвера с диммирующим входом - остался не выясненным вопрос о токе на диммирующем входе, в даташитах - почему-то этот параметр не указан.
Из-за этого непонятно, сколько димирующих входов можно присоединить к выходу платы, например Arduino UNO, на котором организован ШИМ.
Возможно, при присоединении группы драйверов - придется делать усиление тока управления диммирующими входами драйверов.

Постараюсь этот вопрос разобрать по-подробнее позднее, когда поэксперементирую с диммирующими драйверами...

Как организовать ШИМ выход на плате, например на 3 дискретном выводе. Необходимо в секции setup() добавить строчку
pinMode(3, OUTPUT);
необходимо заметить, что ШИМ можно организовать не на всех доступных портах, а только на тех, на которых эта возможность поддерживается. Эти порты указаны в даташите на процессор или в описаниях соответствующей платы на сайте www.arduino.cc.
Например, для платы Arduino UNO дискретными выводами, на которых возможно организовать ШИМ являются : 3, 5, 6, 9, 10, 11. Причем на выводах 5 и 6 частота ШИМ будет примерно 980 Гц, а на остальных 490 Гц.

Далее...в секции loop() должна быть строчка
analogWrite(3, value);

где переменная value должно принимать значения в диапазоне 0-255, что будет соответствовать нагрузке ШИМ в диапазоне 0 - 100%, и соответственно будет меняться и яркость.
Как программно изменять значене переменной - ну я уж не буду объяснять, это процесс - творческий ...
Тем более, что иммитируя рассвет, например, можно сымитировать даже нелинейное увеличение освещенности за ед.времени...а можно просто линейно поднять яркость светодиодов.
Световой день, также можно сделать фиксированным, а можно сделать изменяемым, равным астрономическому дню на той широте местности, на которой находится водоем, который имитируется. Ну это для "особых" любителей....
Вообще используя такой подход и соответствующие светодиоды, в аквариуме можно имитировать, и прохождение облаков, и лунный свет по фазам луны, и грозы и т.д.


Изменено 26.12.13 автор Z0RS

Изменено 27.12.13 автор Z0RS
2013-12-26 добавлено 26/12/2013 20:24:46#1909651
Нравится Batusay

Посетитель




232 11
Курчатов
2 мес. назад
разглядывал jarduino, интересно, но что-то в 2012 году автор замолчал...
а лучше бы на Cubieboard, два ядра хорошо. но там с pwm как-то напряжно (
темка интересная, можно руками поработать не особенно углубляясь в электронику
2014-01-07 добавлено 06/01/2014 23:38:48#1914308

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
Yuriy46
разглядывал jarduino, интересно, ...


Да...проект побогаче....некоторых других...

С другой стороны - в принципе, ATMega 2560 кардинально, от ATmega 328 отличается только наличием большого количества Flash-памяти под программный код (и он действительно большой, чтобы такой проект как аквариумный контроллер - писать как угодно, лишь бы работал....можно вообще забыть слово "оптимизация кода") ну и количеством (но не качеством) периферии...

Вот графический дисплей, да еще и с ТАЧскрином - это, да...приятная вещь...но не более того....да еще цена проекта сразу возрастает. А с другой стороны, для нормального отображения статистики - он мал размером и разрешением...

По мне - проще данные с проца (Меги какой нибудь) и\или с подключенной к процу SD-шки - передать по сети на сервак, и там уже сделать нормальную "человеческую" обработку....и выдать нормальные отчеты или страницы с органами управления. Удовольствие это - со стороны микроконтрллера - недорогое, цена вопроса - 120 руб за Ethernet карту на чипе ENC28J60, да десяток строчек кода....это - на стороне микроконтроллера, а на стороне сервера - это уж, кто-во что горазд...
Конечно, бесплатных платформ, где можно взять Appache + SQL (Какой-нить)+ php, или что-то в этом роде - есть некоторое количество - но там должна быть посещаемость...

Можно, конечно взять платный хостинг, купить доменное имя и сделать "офигенский" коммерческий (но не дорогой) проект по аквариумным контроллерам, но не эту "лабуду" которую предлагают в паре - тройке мест в интернете, а действительно и серьезный с аппаратной стороны и с другой стороны - сетевой проект, когда владелец контроллера может посмотреть, статистику, изменить настройки, по-управлять аквариумом удаленно через Интернет, отдыхая где-нить в Доменикане...хы...
Ну или зависая безвылазно на работе..... а на состояние банки глянуть хочется....

Вот тогда - появится интерес к аквариумным контроллерам - а сейчас это - "чуть расширенные комплектные таймеры с розеткой".

Yuriy46
а лучше бы на Cubieboard, два ядра хорошо...

Ага....а еще лучше на нем сделать бегущие огни, или елку на новый год зажигать....

Нужно все-таки оборудование соразмерно задаче подбирать....
Это ARM - здесь совсем другая производительность (но и цена вопроса)...это для контроллера аквариума - излишне....если только поиграться есть желание....вот для какого-нибудь океанариума - самое то ... , но там больше чем уверен, поставят PLC Siemens или Shneider или Omron или ABB и будут правы - все таки промышленная автоматика - это надежность другого уровня....

Yuriy46
но там с pwm как-то напряжно (

Нет никаких напрягов - просто его нет ....аппаратно не реализован, как в процессорах AVR, да и ARM - это другая философия....
Порты ввода/вывода организованы отдельными контроллерами - они программируются ...т.е. ничто не мешает PWM организовать программно.
2014-01-11 добавлено 11/01/2014 03:04:42#1916926

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
А теперь, продемонстрирую - одну "фишку", из описанных в предыдущем сообщении...а именно удаленное, посредством сети Интернет - управление нагрузкой, подключенной к релейному модулю, а именно к реле №4. Смотри предыдущие примеры и схему соединений, в этом сообщении.

Для начала, необходимо присоединить сетевую плату, посредством которой, микроконтроллер будет общаться с Интернет.
Сетевая плата, которую я использовал - самая дешевая на чипе ENC28J60. Типа такой:
http://www.ebay.com/...

Эта - карта, конечно, не самая "крутая", которую можно присоединить к Arduino. Например, можно присоединить шилд, или плату на основе чипа WizNet W5100 - она более функциональна, и многие функции реализованы аппаратно, т.е. на самом чипе, и не будут отвлекать ресурсы микроконтроллера, но и цена за такую плату - выше значительно.

Например : http://www.ebay.com/...
Как видите - цена только сетевухи - уже переваливает за 500 руб. Ого....а оно нам надо? Можно обойтись и бюджетным вариантом за 120 руб.

Библиотека Ethernet - в стандартном дистрибутиве среды программирования Arduino - рассчитана на работу, именно с чипом WizNet W5100. Поэтому, пытаться использовать данную библиотеку для платы на основе чипа ENC28J60 - бесполезное дело. Для использования данного чипа библиотеку нужно скачать, например здесь
https://github.com/j...
Справа на странице есть кнопка - Download ZIP, необходимо скачать архив, затем установить библиотеку. Я уже упоминал, как это делается см. сообщения выше.
Библиотека, эта - довольно старая, но довольно стабильная. Для примера ее достаточно.

Для реализации чего-нибудь по-серьезнее, брать лучше ( а может быть и не лучше ) более свежую и более функциональную библиотеку для этого чипа, здесь:
https://github.com/n...

Схему соединений из предыдущего примера - придется переделать, т.к. я использовал порты, которые по умолчанию использует SPI интерфес платы. В принципе, какие пины и как используются - можно посмотреть в первом же заголовочном файле библиотеки EtherCard.h , в нем в начале файла, в комментариях есть следующие строки:
// VCC - 3.3V
// GND - GND
// SCK - Pin 13
// SO - Pin 12
// SI - Pin 11
// CS - Pin 8

Собственно, вот и вся схема присоединения этой платы. Но поскольку в предыдущих примерах я занял некоторые пины из необходимых - то схему пришлось переделать...ну есть еще конечно, кое-какие соображения на будущее...



Необходимо обратить внимание, что сетевая плата на основе чипа ENC28J60 - требует напряжения питания 3.3V , а вот уровень напряжения на пинах SPI интерфейса - допускается и 5V поэтому данные уровни для этого чипа - согласовывать нет необходимости.
Питание 3.3 вольта - в моем случае, берется с платы Arduino UNO - она имеет соответствующий преобразователь питания. А вот для MINI/MICRO/NANO - придется позаботиться отдельно...либо плата должна быть с таким преобразователем...хорошо то, что среди всевозможных клонов от китайских производителей - можно без труда подобрать такой....

Для питания всей этой схемы был приспособлен блок питания с мини USB разъемом , купленный за 120 руб на рынке в ларьке с мелочевкой...характеристики блока питания 5V - 1.0A, разьем срезал, сделал разветвитель для "земли" и "+5V". На схеме все видно...

Понятно, что изменив схему присоединения - необходимо изменить и инициализацию портов в программе - в скетче....ну, я думаю, это - уже понятно как сделать - поэтому приводить здесь весь скетч, я не буду, тем более, что в итоговом варианте - в нем много лишнего.

Теперь, чтобы использовать плату необходимо добавить в скетч следующие строки:
где нибудь вверху, до функции setup() и до функции loop()

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };// Определяем какой будет MAC адрес у сетевого интерфейса....необходимо, чтобы в той сети, где он будет действовать - адрес был уникальным...
byte Ethernet::buffer[700]; //Определяем буфер для отправки и приема сообщений....
BufferFiller bfill;

В функции setup() должны быть строки :
Serial.begin(9600); // Это - проинициализирует последовательный порт для связи с компьютером и в него будут направляться сообщения диагностики. В принципе это - не обязательно.
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println(F("Ethernet Failed!")); // Если сетевая плата не отвечает на попытку инициализации - вывести сообщение.

//Пытаемся получить автоматическую конфигурацию IP интерфейса с сервера DHCP - он сейчас есть в практически каждом квартирном роутере....

if (!ether.dhcpSetup()) Serial.println(F("DHCP failed")); //если карта не смогла отконфигурироваться автоматически - выведется сообщение, иначе интерфейс получит IP адрес, адрес шлюза и адрес DNS.

Если автоматически получать конфигурацию не возможно - ну нет, например DHCP сервера ... тогда можно отконфигурировать сетевую плату статическим адресом.
Тогда в области до фунции setup() должны быть строки:
static byte my_ip[] = { 192,168,1,203 };//Определяет IP адрес сетевой платы (здесь необходимо прописывать значения актуальные для Ваших сетей)
static byte gw_ip[] = { 192,168,1,1 };//IP адрес шлюза без него в Интернет не будет маршрута
static byte dns_ip[] = { 192,168,1,1 };// IP адрес для DNS запросов

В функцию setup() добавить строки :
staticSetup(my_ip, gw_ip, dns_ip ); // Это проинициализирует интерфейс статическим IP адресом и адресом шлюза и DNS.

В принципе функция staticSetup - также возвращает в случае неудачи не нулевое значение - можно устроить проверку и вывести сообщение, по аналогии (см. чуть выше)

Далее, если в функцию loop() добавить следующие строки :

word len = ether.packetReceive();
word pos = ether.packetLoop(len);

то сетевая карта начнет отвечать на ICMP запросы команды ping. Если пинги по нашему адресу - появились - то все идет как надо....
В случае с моим IP адресом все будет выглядеть так:

Как видите - интерфейс имеет назначенный MAC-адрес, по DHCP получил IP-адрес 192.168.1.203 и отвечает на команду ping.
Пол-дела сделано....т.е сетевая плата подключена, проинициализирована, организован процесс эха...а дальше нужно решать, как мы ее будем использовать?

Можно "поднять" несложный WEB непосредственно на связке ардуино+сетевая карта...но наигравшись с ним достаточно, я понял, что вешщь эта - весьма ущербная, да и выпустить его в Интернет - весьма не просто, если у Вас несильно внятный и клиентоориентированный провайдер Интернет....я своего не только на реальный IP адрес не могу уговорить, но и на то, чтобы он 80 порт моего сервера - оттранслировал на какой-нибудь порт своего реального IP адреса, чтобы мой сервис - таки в Интернете появился...но с ТранТелеКом договорится - это сложно...
Поэтому, я нашел такой привлекательный сервис как www.devicehub.net сервис - бесплатный, пока по крайней мере....хоть и Румынский....конечно, это - немного настораживает...

Смысл данного сервиса, в том, что ваше устройство - должно иметь маршрут в Интернет (но к нему обращаться из Интернет - нет необходимости, да возможности может и не быть, как в моем случае) и уметь выполнять HTTP запросы и обрабатывать ответы...Запросы будут специальной формы, об этом - ниже....

Идем по адресу http://devicehub.net и регистрируемся. Вверху - на главной странице сайта - есть ссылка New account. Жмем....

После регистрации создаем проект, у проекта будет уникальный идентификатор и еще будет выдан apiKey. В проекте создаем актуатор (actuator), он тоже имеет уникальный идентификатор. Актуатор, это кнопка на WEB форме, с состояниями ON и OFF - включено, выключено....в соответствие с которыми в ответе на HTTP запрос будет ответ либо символ "0" либо "1". Все просто....

Выглядит актуатор на сайте devicehub.net - примерно так:



Итого, у Вас будет три необходимые для запроса вещи: ProjectID, actuatorID и apikey (это типа, для авторизации - идентификатор сессии) - его необходимо хранить от компроментации.

Далее, необходимо создать функцию, которая будет обрабатывать ответ от сервера, для этого в скетче, в любом месте, кроме, как внутри тела функций setup() или loop() необходимо вставить строки типа:
int state = 0; // просто переменная для хранения состояния актуатора - эту строку лучше вставлять, вверху программы до функции setup()

//а эти строки можно вставить в самый низ программы, после закрывающей скобки от самой нижней функции...

static void ActuatorCalback (byte status, word off, word len){
Ethernet::buffer[off+300] = 0;
state = *(const char*)(Ethernet::buffer + off + len - 1);
if(state == 49) // если актуатор находится во включенном состоянии - в ответе на запрос будет символ "1" - ASCII код = 49 (десятичный)
{
digitalWrite(RelayChn4, LOW); // Включаем реле №4 (напоминаю - у релейного модуля на входе логика инверсная, т.к. модуль с опторазвязками)
}else if(state == 48) //Если актуатор в выключенном состоянии - в ответе на запрос будет символ "0" - ASCII код = 48 (десятичный)
{
digitalWrite(RelayChn4, HIGH); //Выключаем реле
}
}

В принципе, вместо включения\выключения реле - можете подставить необходимые Вам действия....Итак, реакцию на поступивший ответ мы определили, осталось организовать отправку запроса:

Чтобы отправлять запросы необходимы строки типа:

char queryString[256] = {0}; // это буфер для формирования строки запроса
sprintf(queryString, "?apiKey= сюда подставить свой ключ");
ether.browseUrl(PSTR("/io/сюда поставить свой projectID/actuator/сюда поставить свой actuator ID/"), queryString, website, ActuatorCalback);

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

Запрос, в каждом цикле - отправлять нельзя, во-первых, это ни к чему, во-вторых нехватит ресурсов микроконтроллера. Я отправляю запрос по каждому актуатору не чаще чем раз в 5 секунд
Для этого можно организовать несложный таймер с использованием функции millis() и проверку в конструкции if.

Я делаю проще, в начале каждого запроса я читаю в выделенную переменную, значение времени в формате unixtime - оно в секундах, сравниваю с временем в выделенной переменной
и после выполнения увеличиваю выделенную переменную на 5 (например).
В самом начале программы в секции определения переменных - выделенную для этого таймера переменную - нужно обнулить.

Таким образом запрос на состояние актуатора будет выполняться не чаще чем раз в 5 секунд. В большинстве случаев - этого быстродействия - более чем достаточно...

Теперь, тем, кому захочется обрабатывать несколько актуаторов:
1. В одном запросе - это невозможно....это конечно "дикость" и архаизм сознания разработчиков сервиса девайсхаб , но пока - это так...Я им написал вопрос...посмотрим, что ответят..
2. Если делать несколько запросов (а именно - это и придется делать) то, их нельзя "прижимать" по времени друг к другу ближе чем 1-2 секунды...т.к. какая-то асинхронность в работе сетевой карты на физическом уровне видимо - все-таки присутствует...и последующий запрос, что-то портит у предыдущего....

Есть еще один интересный момент в работе сервиса devicehub.net
В проекте можно организовать не только актуатор (кнопку с состояниями) а еще и sensor - т.е. датчик. Это интересная штука, графически отображающая различные состояния и значения...

Например можно сделать сенсор для отображения температуры - выглядеть это будет примерно так:


Для оправки значений в сенсор на сайте девайсхабнет - необходимо просто отправить HTTP запрос, можно не обрабатывать ответ, как в предыдущем примере.

Формат запроса такой:
"http://www.devicehub.net/io/ProjectID/?apiKey=ВАШapiKey&SensorID=Значение сенсора"
Вот с сенсорами у них все-прекрасно - можно отправлять значение нескольких сенсоров в одном запросе, просто добавляя их в конец запроса через символ амперсанда, типа так
&SensorID=Значение сенсора"&SensorID=Значение сенсора"&SensorID=Значение сенсора"

Таким образом можно организовать несложный удаленный контроль и за температурой и за pH и за разными другими показателями...бинарные значения также можно отправлять - типа было включено/выключено в такое-то время...да мало-ли еще чего можно напридумывать, даже с таким не очень богатыми возможностями...

Удачи....


Изменено 14.1.14 автор Z0RS
2014-01-11 добавлено 11/01/2014 15:41:34#1917132

Завсегдатай




359 25
Москва
20 мин. назад
Есть arduino, хотелось бы собрать контроллер с рн для аквариума. Аrduino / http://www.ebay.com/... /. Будет ли функционировать Юсуповская схема? / http://www.[ лютые руссофобы. ссылка скрыта, чтобы не разжигать межнациональную рознь]/forum/index.php?showtopic=2581&st=50 /.
------------------------------------------------------------------------------------------
: Юсуповская схема / http://www.[ лютые руссофобы. ссылка скрыта, чтобы не разжигать межнациональную рознь]/forum/index.php?s=c6e365a96de692553d27f7ff757740ea&act=attach&type=post&id=14605 /
------------------------------------------------------------------------------------------
Есть еще одна проблема!!! Подскажите пожалуйста, У рН электрода кабель коротковат. / http://www.ebay.com/... /. Как поступить - Поменять кабель электрода или вывести из arduino плату усилителя рН контролера. Ведь у кабеля электрода наверное определенное сопротивление.
2014-01-15 добавлено 15/01/2014 13:26:00#1919541

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
strannic


Простой ответ на поставленный вопрос оказался проще чем я предполагал...
Вот схема с того же сайта, откуда и Вы ссылку привели:
http://aquacontrol.n...
Тема - вот : http://aquacontrol.n...

На схеме видно, что Выход операционного усилителя подключен непосредственно к аналоговому входу микроконтроллера ATMega 3216.

Аналого-цифровые преобразователи у процессора ATMega3216 и ATMega2560 (это тот, на котором построена плата, на которую Вы дали ссылку) - аналогичные....
Вот цитата из даташита : " ...8/16-channel, 10-bit ADC (ATmega1281/2561, ATmega640/1280/2560)"
Так что - можете смело применять ту часть схемы которая отвечает за усиление сигнала с pH - электрода и ORP-электрода...

Кстати в той ссылке, что Вы привели http://www.[ лютые руссофобы. ссылка скрыта, чтобы не разжигать межнациональную рознь]/forum/index.php?s=c6e365a96de692553d27f7ff757740ea&act=attach&type=post&id=14605
в схеме усилителя ошибка - стабилитрон должен стоять "носиком" к плюсу.


strannic
Есть еще одна проблема!!! Подскажите пожалуйста, У рН электрода кабель коротковат.

Удлинить можно....
На кабеле в данном случае потенциал - постоянный...переменки - нет и волновые свойства он не проявляет...
Коаксиальный в данном случае потому, что требуется защита от помех и оплетка ее выполняет....
Поэтому, при спайке - нужно обратить внимание на восстановление равномерности контакта в оплетке. А центральные жилы можно спаять просто в нахлест без выравнивания сечения....сверху - незатейливо за-изолировть.
Длину более 3 метров делать - не рекомендую....вообще, понятно что, чем короче - тем лучше.
Выносить плату усилителя далеко от ножки микропроцессора тоже - не стоит.
Тут правила такие - все как можно ближе - вход с кабеля (с электрода) как можно ближе к усилителю, выход как можно ближе ко входу ADC микроконтроллера.

strannic
Ведь у кабеля электрода наверное определенное сопротивление.

Волновое сопротивление, в данном случае - не важно какое....
А активное....
Вы обратили внимание, какого номинала стоит резистор на входе в Усилитель потенциала ?
1 мОм.... Так что сопротивление кабеля...здесь не важно....
2014-01-16 добавлено 16/01/2014 04:02:41#1919979

Завсегдатай




359 25
Москва
20 мин. назад
ARDUINO для автоматизации аквариума
Спасибо за информацию! По этому вопросу осталось дело за малым..... После того как соберу конечно. Прикрутить к ATMega2560! Может кому встречался материал на эту тему? Был бы признателен. С pH Информация вроде встречается, а вот по поводу "Контроллера редокс потенциала" как бы сложнее.
Может кто собирал на ATMega2560?



Изменено 16.1.14 автор strannic
2014-01-16 добавлено 16/01/2014 06:57:47#1919991

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
strannic
Прикрутить к ATMega2560!

Вы такие странные вопросы задаете....

Что значит прикрутить? В схеме однозначно показано как. Земли соединяем, а выход операционника подаем на аналоговый порт. С которого считываем значение....
Вообще, и pH метр и тем более ORP - метр это по сути своей - миливольтметры.

Если с ph - значительно сложнее ситуация, то - с ORP метром - как раз, все очень просто.
Потенциал электрода в миливольтах = редокс потенциалу. Один миливольт к одной единице ORP-потенциала.

Т.е. делаешь схему ORP - метра, затем калибруешь ее по образцовому калибратору, на котором можно выставлять значение напряжения в миливольтах с высокой точностью, хотя бы до единицы миливольта....я Fluke-ом калибровал, там точность до 2 знаков...

Смысл калибровки - должно быть однозначное соотношение милливольт - в нескольких точках диапазона измерения, диапазон зависит о электрода - поэтому надо читать мануал на электрод...
А программно измерение выглядит, вообще, очень просто - читаешь из аналогового порта значение потенциала, затем - делаешь фильтрацию заначения. Способов фильтрации - масса...
Самый простой, это - усреднение нескольких значений за единицу времени.
Фильтрация необходима т.к. будут небольшие колебания потенциала из-за качества электрода, наводок на кабель, качества сборки усилителя потенциала и деталей для него, и главное - очень низкой битности аналого-цифрового преобразователя.
Затем выводишь полученный результат ....никакой математики....

Конечно, битность в 10 бит - для таких задач - это, конечно не то, чтобы много, а скорее наоборот....ну, конечно зависит какую точность хотите получить....с такими схемами и битностью, как в Вашем случае - лучший вариант, если удастся - получить точность около 0,05 единицы pH. или одной-двух единиц ORP. Если для измерения ORP-это, вообще не критично, то для pH измерения такая точность - не очень хороша....хотя все китайские приборы, которые обещают точность до 0,01 единицы ( ) - едва попадают и в 0,1 .
2014-01-16 добавлено 16/01/2014 11:31:21#1920086

Завсегдатай




359 25
Москва
20 мин. назад
Еще раз спасибо за информацию.
Говоря про материал в предыдущем сообщении, я имел в виду (как прописать все это на ATMega2560). Думаю у кого то стоит уже аналогичная система. Да бы не наступать на те же грабли.... кто то поделится!
2014-01-16 добавлено 16/01/2014 22:04:24#1920430

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
strannic
Говоря про материал в предыдущем сообщении, я имел в виду (как прописать все это на ATMega2560). Думаю у кого то стоит уже аналогичная система. Да бы не наступать на те же грабли.... кто то поделится!


Т.е. если я правильно понимаю, сами Вы ничего писать не собираетесь...и будете подыскивать ПО, которое точно подойдет под Вашу конфигурацию?
2014-01-17 добавлено 17/01/2014 22:18:47#1920995

Новичок




35 1
Russian Federation Moscow
3 г. назад
Z0RS
Идея такая - довести это устройство до полнофункционального контроллера для аквариума, в итоге - с WEB сервером для управления по сети в т.ч. Интернет, и GSM модулем с отправкой SMS


мне кажется не с ардуины нужно начинать, а с веб сервера и протокола обмена с ардуиной. А то веб управление будет ой как тяжко сделать, а может и даже не возможно. Естественно если делать полноценное управление. Т.е. реал-тайм в обе стороны.
Себе прикручиваю для этого mr3020+CyberWRT+modbus. Может есть что то более удобоваримое - не знаю. Но в любом случае, рисуя скетчи нужно плясать от формата данных, которыми будет плеваться в ардуину веб сервер (а то кусок кода, отвечающий за протокол, будет очень и очень большой)
2014-01-20 добавлено 20/01/2014 12:33:21#1922255

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
azh122
мне кажется не с ардуины нужно начинать, а с веб сервера и протокола обмена с ардуиной.
А то веб управление будет ой как тяжко сделать, а может и даже не возможно. Естественно если делать полноценное управление. Т.е. реал-тайм в обе стороны.


Я конечно, не очень понимаю некоторые Ваши высказывания...например "реал-тайм" в обе стороны....

При применении физической среды EtherNet, и тем более TCP протокола - обмен данных в реальном времени не гарантируется вовсе....даже с дискретой времени 1 минута...т.к. это спецификации протокола....он нечего и не обещает в этом случае...поэтому, о реальном времени речь не идет вообще.

А если нужна дискрета времени меньше...скажем десяток миллисекунд....то об Ethernet - речи уже не идет....тут будут другие физические среды и другие протоколы...

И причем тут WEB сервер....для среднестатистического аквариумиста - это далеко не первое, что необходимо для автоматизации банки...а как раз наоборот.
А ядро управляющих функций - из которых самая востребованная это многокомандный программный таймер - легко организуется на любой из плат ардуино - лишь бы пинов под вывод хватало - для коммутации нагрузки...

Да..... и "полноценное управление" - это что? по Вашему?
Т.е. ядро управляющих функций - разместить на стороне WEB-сервера? а Ардуино использовать для удаленного I/O ? Что к этому подталкивает - нехватка ресурсов амтеловских процессоров ?
Если возникла такая потребность - необходимо брать другу платформу, например на ARM. Ставить на эту платформу тонкого Линя, на него WEB - и делать любое изощренное удаленное управление на сколько фантазии хватит. Сейчас много чего из TYNY дистрибутивов Linux можно поставить под ARM...но возможно, что и платформу придется подбирать - под набор дистрибутива...

А для управления по-проще, типа - неспешно включить/выключить что-нибудь, переключить режимы работы, посмотреть температуру, pH и что вообще включено в данный момент - для всех этих вопросов - web сервера организованного на самом процессоре класса MEGA вышеуказанных плат - более чем достаточно...и делается он в несколько строчек кода.
А мой "финт" в 3-м примере - это для тех, кто не может напрямую выпустить свой контроллер в интернет с реального IP адреса.


azh122
Себе прикручиваю для этого mr3020+CyberWRT+modbus. Может есть что то более удобоваримое - не знаю.

А в чем удобоваримость то именно такого решения? Ну прошьете Вы Ваш роутер "сырой" прошивкой в которой для связи с ардуино - нет ничего и что дальше?
Намного проще будет использовать WEB сервер на mr3020 и обмен с ардуино по EtherNet. Но более-менее серьезного web сервиса от mr3020 - ждать не приходится...

А Модбас, я вообще - не понял к чему? Что с чем вы собираетесь соединять этой древней сетью на основе RS-485 интерфейса?

У Вас есть какие-то устройства с этим интерфейсом? которые Вы хотите к ардуино подключить?

Со стороны Ардуино придется ставить преобразователь TTL/RS-485, Потом найти библиотеку под сам RS-485, ModBus поверх него - это тоже отдельная библиотека...

И после этого идет речь о удобоваримости этого решения ??? ну-ну...
Как "удобно сварите" - "не забудьте" показать....так сказать тнуть носом....

Хотя конечно...ничего невозможного нет....просто в данном случае это не упрощение - а очень сильное усложнение общей структуры проекта управления аквариумом...очень сильное...

azh122
Но в любом случае, рисуя скетчи нужно плясать от формата данных, которыми будет плеваться в ардуину веб сервер (а то кусок кода, отвечающий за протокол, будет очень и очень большой)


Кусок отвечающий за обмен - всегда будет один и тот же....
А вот структура данных - она и описывается в программной конструкции под названием структура...один раз за весь код...
И дальше - несложная функция по сбору данных в поля структуры....
Конечно можно и самому себе все усложнить...и из любой мартышки - всегда можно сделать слона или даже целое стадо. Код большим сделать - не проблема...маленьким и эффективным -проблема.
Когда -то, очень давно....мой начальник пытался мне платить за количество кода....
Но...видимо по моим сильно "вспыхнувшим" глазам - он понял, что предложил что-то не то...а жаль....я бы сейчас писал это пост находясь на мальдивах...а не в богом забытом городе Нижегородской области...
2014-01-20 добавлено 20/01/2014 14:47:23#1922317

Новичок




35 1
Russian Federation Moscow
3 г. назад
Так это.. Я не профи. Я лох в програмиировании. Просто типа хобби. Что нить прикрутить к аквасу, дому.
Поэтому аргументированно спорить не могу. Так что, если не против, с удовольствием в личке пообщался бы... . А то вопросов на тему куда двигаться куча, а на учится на собственных ошибка уже достало - просто времени нет. Хочется результат побыстрее. Так, конструкция выходного дня - и удовольствие от собственных усилий.
Поэтому совсем простыми МК рулю. Ну захотелось мне в розетки таймеры загнать - купил компютерный блок розеток, вкрячил туда релюшки, и скромный мк. Протоку вот мне потребовалось модернизировать (счетчики воды, блин, вынудили поставить) - еще один мк... Не только аквас - На контроль отопления дома (у меня частный) - еще один. В теплицу жене захотелось ... В общем уже под десяток....
А все это связать нужно чем то нужно. Ну или хотелось бы. Так что потихоньку изучаю джаву, аджакс, php, эс-ку-лайты..
Модбас (даже по умолчанию) - вполне катит. Это же не только провода - копеешные китайские модули rf433 ой как рулят...
Кстати: Ардуину почти уже почти не использую. Дорого, жрет много. Да и нет часов, датчиков температуры. TI MSP430, стеллариус - в общем то что дружит с ардуиовским языком в виде енергии(далее, увы, не продвинулся)..

Изменено 20.1.14 автор azh122
2014-01-20 добавлено 20/01/2014 16:48:58#1922377

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
azh122
Так это.. Я не профи. Я лох в програмиировании. Просто типа хобби. Что нить прикрутить к аквасу, дому.
Поэтому аргументированно спорить не могу.

Да все ....не боги....и я не профессиональный программист уже....хотя и работал прикладником некоторое время....

Дело...в том, что данная тема - это тема про использование именно младшей линейки плат - ардуино.

Платы Ардуино на процессоре AVR класса MEGA от фирмы ATMEL - как то очень мне понравились....хотя я их открыл для себя совсем недавно....Дешевые....а позволяют очень много....

В профессиональной деятельности - я сталкивался в основном с промышленными программируемыми контроллерами серьезных фирм (где-то выше я уже перечислял линейку производителей и она еще не полная...)
Но там, для среднестатистического любителя аквариума, желающего автоматизировать процессы в банке - все очень ...ОООООЧЕНЬ дорого.....
И задачу, которую на ардуино можно решить за 1000 рублей...вряд-ли удастся вписать в рамки одной тысячи долларов....

И когда Вы приводите аргументы в пользу другой конфигурации - она должна быть чем-то лучше: может быть дешевле, проще процесс программирования или настройки, большая повторяемость в Интернет...тогда да...аргументированный спор возможен...

А чем лучше то - что Вы предложили? Попробуйте сами оценить.

Да и моя цель в этой теме - не по-спорить ....а показать основы использования данной конфигурации - чтобы у аквариумистов пропал страх к самостоятельной работе с устройствами автоматизации....тем более, что Ардуино - очень дружественная к пользователю - непрограммисту, платформа.... ОООЧЕНЬ...дружественнее я не встечал...

Язык упрощенной среды программировани Ардуино, это - Си.
Си в базовом варианте - это не сложнее Бейсика....ведь никто не заставляет использовать весь "блеск" конструкций языка Си, его ООП (объектно-ориентированное программирование) парадигму (хотя даже в простых примерах это используется, т.к. эффективно и не сложно для осознания) . Можно обойтись конструкциями по-проще...и ведь...в итоге все будет работать...да - код будет не эффективный...да....использование ресурсов будет не оптимальным, но при такой цене "железа", это - можно компенсировать чуть более мощным микроконтроллером, чем это, на самом деле, требуется....
Конечно, с точки зрения привития философии языка Си - это в корне не верно.....ну тут двух зайцев не поймаешь....





azh122
Так что, если не против, с удовольствием в личке пообщался бы... . А то вопросов на тему куда двигаться куча, а на учится на собственных ошибка уже достало - просто времени нет. Хочется результат побыстрее. Так, конструкция выходного дня - и удовольствие от собственных усилий.

Чтож...в личке - то? Или вопросы будут такие, о которых другим лучше не знать?

azh122
Поэтому совсем простыми МК рулю. Ну захотелось мне в розетки таймеры загнать - купил компютерный блок розеток, вкрячил туда релюшки, и скромный мк. Протоку вот мне потребовалось модернизировать (счетчики воды, блин, вынудили поставить) - еще один мк... Не только аквас - На контроль отопления дома (у меня частный) - еще один. В теплицу жене захотелось ... В общем уже под десяток....

Да....серьезное хозяйство получается...

А я - туплю...по-тихоньку....мог бы и догадаться для чего ModBus будет использоваться.

Да - сети на основе RS-485 интерфейса - хороши, именно для связи между устройствами автоматизации - так называемые "полевые шины"...И проводной ProfiBUS (промышленный стандарт) - он тоже на его основе.

Да ...несколько микроконтроллеров, причем разнородных - можно этой сеткой увязывать...сеть с гарантированным временем доставки пакета...для надежной автоматизации самое оно...

Можно и данные передавать на мастер-станцию...которая в Вашем случае уже должна быть чем-то по-серьезнее...Возможно и на какой-то ARM платформе или чем-то аналогичным - чтобы и не дорого и относительно функционально....

Но на роутер как Вы хотите - RS485 не затянете...придется делать промежуточное и "слабое" звено на платформе по-проще...

А в случае ARM - можно полевую щину непосредственно к платформе обработки данных присоединить...получится и не дорого и довольно эффективно....точнее сказать - очень эффективно.
Для примера - по подобной схеме до-сих пор строятся системы автоматизации в металлургии....конечно "железо" - другое...дорогущее...но смысл то тот же...

Ну...конечно это потребует усилий по изучению много-чего....если в основе будет Linux..то его придется изучать слегка...потом ну всякие апачи с пчп джавами айяксами сиквелами - ну это в любом случае не на один выходной день.....и не на один десяток выходных дней....


azh122
Кстати: Ардуину почти уже почти не использую. Дорого, жрет много. Да и нет часов, датчиков температуры. TI MSP430, стеллариус - в общем то что дружит с ардуиовским языком в виде енергии(далее, увы, не продвинулся)..


Хозяин - барин....

Только ...зачем же в заблуждение вводить - в каких проектах она жрет много - при питании от батареек? Тогда да...и то...много это преувеличено...
А при наличии AC/DC питания - это не существенно...

Много жрет - периферия...а она от микроконтроллера не зависит..она все равно будет потреблять не мало...таже сетевая плата на основе ENC28J60 потребляет 110 mA - зато дешевая...
Релейные модули по 40-60 мА на канал во включенном состоянии...причем в независимости к какому микроконтроллеру Вы их подключите...

Так что ...это все - условно....
Часов т.е. если имеется ввиду RTC - нет ни на одном названном процессоре - просто в Вашем случае - RTC уже размазан на плате и датчик температуры тоже...так и цена-то выше...в любом случае - часы можно сделать на таймере...а, или если нужно восстанавливать значение времени после сброса и перезагрузки - все внешний RTC использовать - да стоит ли переживать - при цене вопроса 30-50 руб...

При сравнении по цене - плата ардуино младшей серии на ATMEL ATMega самом среднем - "порвет" плату на основе TI MSP430.
Но понятно - для разных проектов подойдет разное железо...
Посмотрел Среду программирования для MSP430 - это брат близнец ATMEL Studio - "старшего брата" среды программирования ARDUINO. Но она и сложнее соответсвенно...

Вообщем...все не так просто....поизучаю и MSP430 - очень возможно что скоро пригодится...
2014-01-20 добавлено 20/01/2014 22:59:27#1922572

Новичок




35 1
Russian Federation Moscow
3 г. назад
Z0RS
Но на роутер как Вы хотите - RS485 не затянете


Да затягивается легко. Можно просто по USB воткнуть, если дуин не много. А можно с rf433 поиграться.
в общем когда то вот с этой темы начинал: http://www.cyber-pla...
работает. обновление раз в секунду. Только чуть подправить надо - 10-20 регистров для аквариумного светильника мало.

MSP430. Просто быстро и удобно - уже через 3-4 дня курер DHL в дверь стучится.
Да и лаунччпадом приходит два контроллера (так что цену можно на два делить). Кварц то же в комплекте есть (на таймере деалать - время уезжает).
Ест мало - именно батарейка и спасала. конденсатор по питанию - вот и вся обвязка.
Есть еще один плюс того что мало жрет - входы легко утягиваются резисторами в 1мом (ардуине и 100к много). Так что легко делаются датчики уровня воды, протечек и пр. В общем хорошее решение для отдельных мелких задач.
Еще мне ARM проц на 80мгц (платка за 13 долларов). Правда экранчик к нему стоит 35долларов (но зато по качеству на голову выше тач скрина для меги). можно поробовать просто андроид девайс подцепить (USBхосту не пропадать же)...
И все это программируется на энергии (http://www.energia.nu/) - которая отличается от ардуиновского софта только разве что цветом.

В общем вариантов много. А куда и как правильнее двигаться - не знаю, весь в сомнениях. Пока просто пока леплю простенькие контроллеры под конкретные задачки и потихоньку цепляю их на роутер. Там, кстати, готовый модуль отсылки почты есть. А где почта - там и смс оповещение. Вот в выходные попробую прикрутить.

Изменено 20.1.14 автор azh122
2014-01-21 добавлено 21/01/2014 00:44:21#1922602

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
azh122
Да затягивается легко. Можно просто по USB воткнуть, если дуин не много. А можно с rf433 поиграться.


В принципе - да....этот роутер, как и многие другие - по сути своей тоже платформа с Линем...всего скорее....уточнять не охота, т.к. в роутеростроении - альтернатив почти нет.

ЮСБ есть...значит много чего можно прицепить....теоретически ....практически - это может вылится в необходимость компилировать самостоятельно драйвера конвертера интерфейсов USB/RS-485, ну это - если все-таки контроллеры будете в проводную сеть объединять на основе RS-485, которую в свою очередь затягивать на роутер.
А компилеж софта под линь - а это вообще, занятие не для среднестатистического аквариумиста, согласитесь? Тем более компилеж драйверов...

PS: посмотрел Инфу по mr3020 - у него же на плате последовательный порт с TTL уровнями разведен...и не используется....можно на него повесить TTL to RS485 конвертер.

С беспроводным модулем - организовать взаимодействие - это да...проще....но потребует на каждом устройстве управления наличие модуля....цена конечно копеечная....
Посмотрю на досуге - что может этот модуль....

PS : Посмотрел...мда...это - всего лишь транслятор TTL уровня...причем одноканальный....т.е. один цифровой порт микроконтроллера можно одним модулем оттранслировать в друге место - как бы до 60 метров...и все...Питание 3.3 В - тоже специфично....потом, не увидел на модуле никаких устройств для адресации модуля...т.е. похоже, что 2 пары модулей работающих рядом - будут друг-другу мешать...Скорость передачи 9 килобит ...
Что- то мне подсказывает, что организовать обмен хоть сколь-конибудь значимого количества данных - на этим модулях - будет проблематично...
Но себе закажу пару - пар таких....поиграюсь...

azh122
MSP430


Нашел таки...интересную для меня отличительную особенность микропроцессоров данной серии - в некоторых моделях есть аж... 24 - битный дельта-сигма аналого-цифровой преобразователь...Это ...да....это гуд...вэри гуд....Спасибо за неожиданную подсказку!!!

Обязательно закажу себе таких МК несколько - для прецизионного pH-измерителя....
А то с 10 битным - слишком много надо с "бубном" плясать даже для того чтобы плюс-минус 0.05 единицы Ph "наплясать"....
А здесь - с хорошим электродом никак не меньше 0,005 можно выдать, а уж 0,01 - стандартно....

azh122
входы легко утягиваются резисторами в 1мом (ардуине и 100к много). Так что легко делаются датчики уровня воды, протечек и пр. В общем хорошее решение для отдельных мелких задач.

Да... это - тоже очень хорошо...ардуине и 50К много для стабильной подтяжки... стандартно, я смотрю - все используют 10К на I/O пинах ...а вообще 20-50 по даташиту.
Однако борьбе с наводками и шумами сигнала - придется отводить больше внимания....ATMEL-овские железки в этом плане более непробиваемые...

Правда и одно Но - нашел ...TTL уровни - 3 вольтовые...т.е. применение большого класса дешевейших устройств с TTL уровнями 5 вольт - без преобразователей уровня - закрытая тема....
Это - "расплата" за пониженное энергопотребление...
Хотя в принципе - тенденция перехода на пониженные уровни - в последние пару - тройку стала сильно прослеживаться....

azh122
И все это программируется на энергии

Ой...я в шоке...даже шрифты похожие...вот что значит рынок....интересно "кто под кого закосил" ATMEL под TI или наоборот....?
А вообще - понятно, что это одно и тоже...только набор библиотек другой да "коннекторы" к платам другие.

PS: Нет....энергия чуть по - хуже будет....размер скетча в коде - не показывает..система вывода ошибок - мутнее...
И цветовая гамма - это "что-то" ...такая зловредная...
На PROGMEM - ругается....интересно а, что в этом диалекте Си - нет такого макроса?
Как данные во Флеше оставляют? Мда.....разбираться нужно....


Да...веселая у Вас задачка ...интересная....
Но она выходит за рамки данной темы.....а открывать еще одну на аквариумном форуме - более чем смешно будет....
Но я бы пообсуждал кое-что....

azh122
Еще мне ARM проц на 80мгц (платка за 13 долларов). Правда экранчик к нему стоит 35долларов (но зато по качеству на голову выше тач скрина для меги). можно поробовать просто андроид девайс подцепить (USBхосту не пропадать же)...

В общем вариантов много. А куда и как правильнее двигаться - не знаю, весь в сомнениях. Пока просто пока леплю простенькие контроллеры под конкретные задачки и потихоньку цепляю их на роутер. Там, кстати, готовый модуль отсылки почты есть. А где почта - там и смс оповещение. Вот в выходные попробую прикрутить.


Вообще...как мне кажется Вы скромничаете слегка....

Я к сожаленью сейчас слегка стеснен в средствах - иначе на столе много чего-бы лежало из возможных железок....
А так...вариантов - вообще очень много....нужно остановиться на чем-нибудь что покроет задачи с запасом...и этого в любом случае на много лет хватит....
А цены на электронику такого класса - снижаются ...ну понятно что рубль...доллар играют в свои игры...но электроника все равно весьма доступна...никто же не помешает с использованием одной платформы - исследовать неспешно другую....

Изменено 21.1.14 автор Z0RS
2014-01-21 добавлено 21/01/2014 02:38:39#1922611

Новичок




35 1
Russian Federation Moscow
3 г. назад
Про rf433 свои слова беру обратно. Готового, надежного и дешевого решения нет.
Я парюсь с A7205 потому что в доме все выключаетели, димеры на этом чипе - грех их заодно не подцепить.
А что касается всего остального - ни времени, ни мозгов не хватает.

Arduino IDE сравнивать с energia смысла нет, коль есть CodeBlocks.

MSP430:
Никаких наводок и шумов. Там есть INPUT_PULLUP и INPUT_PULLDOWN - внутренние резисторы. Они то же на 10ком если не ошибаюсь.
Если датчики уровней и протечек делать, то гальваническую развязку городить (ногу притягивать на землю 1мом и через меликий конденсатор на электрод) - а она только через импульс работает.
Раз в секунду или пять мухой состояние ног считываешь - какие уж тут наоводки:
digitalWrite(P1_5, HIGH); //посылаем +3v на общий электрод
inreg = P2IN; // считываем состояние всех электродов а дальше разбираем как хотим
digitalWrite(P1_5, LOW); //снимаем +3

3-вольтовые уровнии - это самая меньшая проблема, которая есть.
5-ти вольтовые модули по входу как правило с 3.3в дружат, на выход на крайняк делитель поставить.
А 3.3в все равно из 5вольт делаю (такопилась куча БП на 5в от тефонов, роутеров)

Но. Если для управлением акваса веб сервер городить на роутере с минимумом пайки и мин стоимостью, то только ардуина рулит ( pl2303 или fdti - под другое готовых драйверов нет).
Т.е. роутер, хаб, флешка. В хаб сразу же по usb ардуину (ну или больше) - прошивать можно и через сеть.
Ой, а кажись модуль часов лишний - простой скрип легко может слать точное время на дуину.
Блин, а что же теперь с экраном то делать?
Если все есть на веб сервере, то зачем экран то? Просто типа удобно подойти к авасу и что то подкрутить?
Так покупаем самый дешевый андроид смарфон (ну или бу) и вешаем в удобном месте - вот вам и емкостной, а не резестивный экран.
А если есть андроид смартфон, то на нем же можно веб сервер поднять (зачем нам тогда роутер?). Ой, а еще же там есть сотовый модуль.
А еще уже есть программка под назаванием tasker, которая и так много что умеет. А что не умеет - допишем.
А еще там блютус есть. А может выкинуть провода и бум дружить ардуину по блютусу?
Да еще и камера в смарфоне есть - надобно и ее задествовать - так, за рыбками понаблюдать сидя на море.
......
в общем так и не знаю куда двигаться ((
2014-01-21 добавлено 21/01/2014 14:06:27#1922789

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
МНОГОКОМАНДНЫЙ МНОГОКАНАЛЬНЫЙ ТАЙМЕР
Написал код для многокомандного и многоканального таймера.
В принципе, этот код подойдет для любого AVR микропроцессора и с минимальными доработками может быть портирован на микропроцессоры PIC или MSP.
Код традиционно для этой темы - в формате скетча для IDE ARDUINO.
Скетч примера можно скачать здесь:
http://my-files.ru/o...

Основа этого кода - список задач в специальном формате, например:
struct Task TaskList[] PROGMEM = {
{RelPin1, DAILY, 22*hr+40*mn, 40, LOW},
.....
{RelPin4, WEEKLY, 5*d+14*hr+29*mn, 5*mn, LOW},
{RelPin2, DAILY, 18*hr+15*mn, 0*hr+10*mn, LOW},
{TestPin, DAILY, 12*hr+1*mn, 25*mn+50, HIGH}
};

Многоточие показывает, что в список может быть гораздо большим.
Т.е. создается массив структур (сама структура описана в тексте скетча отдельно) который будет хранится только в программной части памяти во ФЛЭШ.
Это сделано для экономии использования RAM (т.к. у известных нам микропроцессоров оперативная память ограничена).

Первый параметр - это пин, к которому присоединяется соответствующая нагрузка....

Второй - это размерность интервала планирования, обрабатываются вообще любые интервалы...объясню ниже, но для двух стандартных (один день, одна неделя) созданы символьные константы.

Третий параметр - это время включения в количестве секунд от начала интервала планирования....но для удобства ввода задания - созданы символьные константы
d, hr, mn - это соответсвенно - день (сутки), час, минута...секунды задаются без применения символьной константы.

Для описания недельных задач - необходимо знать, что цифра дня - соответствует календарному дню недели, т.е. запись:
5*d+14*hr+29*mn, - означает "пятница" 14 часов 29 минут 00 секунд, а не суббота,
1*d+8*hr+10*mn+30, - "понедельник" 8 часов 10 минут 30 секунд...
для воскресенья - цифра дня будет 0 а не 7 и ее указывать нет смысла...просто указать часы минуты и секунды.
Как вы поняли - неделя начинается с воскресенья....зато все остальные дни более понятны...1-понедельник, 2- вторник.....6 - суббота.

Четвертый параметр - это длительность включения нагрузки в данной задаче...Задается также в секундах...для удобства понимания задачи - применяйте символьные константы...
Необходимо следить, чтобы время включения+длительность включения не превышали размерность интервала планирования.
т.е. если вы в ежедневной задаче - включаете нагрузку в 23 часа - то максимум на сколько вы ее можете включить - это на 59 минут 59 секунд. Иначе событие выключения - не возникнет никогда....
Но этим тоже можно пользоваться для переноса задачи на другие сутки. Создается еще одна задача для этого же пина, с временем включения 0 и необходимой длительностью, например 5 часов 35 минут...тогда в 5-35 на пине, указанном в задаче - появится состояние обратное включенному.

Пятый параметр - это состояние пина для ВКЛЮЧЕНИЯ нагрузки.
Для релейных модулей с опторазвязкой оно, как правило равно - LOW, а для, например, присоединенных к пину, симмисторных ключей или релейных входов без опторазвязки - HIGH.

Т.е. одновременно можно использовать разную логику на разных пинах...на одном пине использовать несколько задач с разной логикой - теоретически тоже можно...но практически не имеет смысла...и сложно для понимания, при планировании...вообщем не рекомендую.

У меня в тексте примера пинам присвоены символьные имена - это делать не обязательно...дальнейшая обработка данного массива задач, сделана так, что пины будут проинициализированы все, которые встретятся в списке задач. Если для одного пина встретится несколько задач...пин проинициализируется несколько раз. Это не страшно.
В процессе инициализации выясняется не находится ли текущее время внутри интервала планирования како-либо задачи - и если это так, то пин указанный в задаче - переводится в состояние которое указано в задаче для включения нагрузки. Т.е. при инициализации контроллера, нагрузка на пинах, которая по описанию задачи должна быть включена в момент иинициализации - она будет включена.....

Интервалов планирования длительностью 1 мес - я не делал...т.к. месяц не имеет детерминированной длины...
В принципе можно во втором параметре указывать количество секунд для создания циклических задач....Например необходимо, каждые 3,5 часа включать нагрузку на 15 сек, на 9 пине с сотоянием включено = HIGH (например симмистор подключен к этому пину). Задача в массиве задач - будет выглядеть так:

{9, 3*hr+30*mn, 0, 15 , HIGH},

А такая запись

{9, 60, 0, 15 , HIGH},

Будет включать нагрузку на 9 пине каждую минуту на 15 секунд.....
Ну я думаю с описанием задач все понятно.....т.к. все очень не сложно....


Т.е. чтобы создать многоканальный многокомандный таймер - все есть....берете плату, так, чтобы дискретных (цифровых) портов разведенных на соответствующие пины, хватало для ваших задач, присоединяете релейный модуль или несколько...и / или симмисторные ключи, или еще какую нагрузку с TTL уровнями в 5 вольт на входе....и описывете задачи в простом формате....заливаете скетч на микропроцессор и наслаждаетесь автоматизацией....

В каждом цикле (главного програмного цикла) - обрабатывается одна задача....поэтому делать длительность цикл слишком большим нельзя....программа будет пропускать моменты включения/выключения....

Спасибо за внимание !
2014-01-24 добавлено 24/01/2014 15:24:37#1924645

Завсегдатай




359 25
Москва
20 мин. назад
ARDUINO для автоматизации аквариума
Много читал... Приобрел Вот эту Arduino SainSmart Mega2560 R3. Попытался прошить. Но выдает постоянно ошибки(скрипт с ошибкой). Подгружаю другие скетчи (для проверки) белый экран. В чем проблема?
2014-02-08 добавлено 08/02/2014 21:25:26#1934089

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
strannic

Прошу прощения, за опозание с ответами...несколько дней не было сети и соответственно и Интернет.....

Мега - хорошая штука...хотя и не очень эффективна по вложению денежек...но в любом случае - "поиграться" с этой платформой можно значительно больше и продуктивнее для собственного опыта, чем на UNO R3. Я вот, уже "упираюсь" в недостаток ресурсов 328 процессора на плате UNO.

strannic
Много читал... Приобрел Вот эту Arduino SainSmart Mega2560 R3. Попытался прошить. Но выдает постоянно ошибки(скрипт с ошибкой). Подгружаю другие скетчи (для проверки) белый экран. В чем проблема?


Я к сожалению, могу только догадываться что, за ошибки при компиляции скетчей у Вас возникают. Лучше их указывать.
А судя по указанию на наличие белого экрана, и некоторым предыдущим сообщениям, у Вас - есть в наличии графический дисплей. Его необходимо "привязывать" и настраивать.
Т.е. необходимо, либо знать протокол обмена с дисплеем, знать по какому интерфейсу он привязан, и реализовать протокол обмена самостоятельно, или использовать готовую библиотеку. Все это справедливо для любого периферийного устройства, присоединяемого к основным платам Arduino.
Конечно, использование начинающим программистом относительно сложных устройств, типа TFT дисплея или GSM модуля, осложняет то, что соответствующие библиотеки - практически не документированы, или слегка документированы на английском языке. Но, кого это - когда останавливало? ...
2014-02-15 добавлено 15/02/2014 00:29:40#1937449

Новичок




26
Ростов-на-Дону
2 г. назад
здравствуйте, подскажите пожалуйста как проще организовать рассвет закат.
Например мы имеем информацию о том сколько секунд прошло после рассвета. Есть константа когда начать рассвет. Рассогласованиае начало рассвета и текущее время надо привязать к значению ШИМа. Может создать таблицу и в зависимости от разницы от начала рассвета выбирать значения,?
если не трудно может кто приведет пример как это реализуется. (только начинаю программировать ардуино)
большое спасибо.
2014-02-18 добавлено 18/02/2014 15:33:21#1939307

Свой на Aqa.ru




693 77
Выкса
8 мес. назад
electron
здравствуйте, подскажите пожалуйста как проще организовать рассвет закат.
Например мы имеем информацию о том сколько секунд прошло после рассвета. Есть константа когда начать рассвет. Рассогласованиае начало рассвета и текущее время надо привязать к значению ШИМа. Может создать таблицу и в зависимости от разницы от начала рассвета выбирать значения,?
если не трудно может кто приведет пример как это реализуется. (только начинаю программировать ардуино)
большое спасибо.


Давайте уточним - будет ли использоваться RTC в проекте, и на какой плате будет собираться проект...точнее интересно какой будет использоваться микроконтроллер?
Потом, как я понимаю, длительность рассвета тоже будет фиксированная и задаваться константой?
И последний вопрос - яркость в период рассвета должна линейно нарастать или по какой-то функции нелинейной? Ведь в природе освещенность места во время рассвета нарастает не линейно....
2014-02-18 добавлено 18/02/2014 21:38:39#1939575

<<  2345678 >> Создать новую темуБыстрый ответ