Зарегистрируйтесь для отключения рекламы и доступа ко всем возможностям портала

Ардуино (Jarduino) на службе аквариуму.

dimetrius

Предлагаю всем кто как-то знаком с этим вопросом делиться знаниями и мыслями. :dr_ink:

Начну с того что задумал доверить управление своими тремя аквариумами микроконтроллерам Ардуино.

1. 20л. пресняк, нужно полное управление светом (вкл/выкл, рассвет/закат), контроль и поддержание температуры, включение кормушки и дозатора.

2. 20л. планируется мини море, нужно то что в предыдущем варианте, автодолив и то что ещё нужно для моря (если нужно).

3. 450л. цихлидник с растениями :ps_ih: , нужно управление светом по мин.4 каналам, то что в первом варианте и выключение фильтра на время кормёжки, автоподмена, LCD (?).

Начинать буду как и положено от простого к сложному, начну с 1 первого варианта, без монитора, управление настройками только через комп.
Какие блоки для этого нужны?
Справится-ли один контроллер со всеми этими задачами?
Ю.В.

Еще было бы неплохо, чтобы он в интернет заходил и в GSM формат. Чтоб управлять не просто со смартфона было, но и со старенького телефона :-)
Димон, чесслово, тебе проще и дешевле сервисника нанять. Извращенец!
dimetrius

Ю.В. писал(а):чтобы он в интернет заходил
Есть и такая приблуда для ардуино, если разберёшся - будем делать :-)
Ю.В. писал(а):тебе проще и дешевле сервисника нанять. Извращенец!
1.- Не дешевле - точно.
2.- Проще? Вряд-ли, а знаеш по чему? У меня жена неделю за неделей без мужа живёт, а тут какой-то "сервиснюк" легально наведываться будет?! Нет уж, пусть лучше комп аквариумом занимается. ;;-)))
dimetrius

Начнём выбор компонентов. Какие часы лучше, эти - http://www.amazon.de/dp/B00J3PD9PG/ref= ... H9LMOUAZIH или эти - http://www.amazon.de/dp/B00J3PBOE4/ref= ... R7PZJLDLLD
Dr0n

Я бы брал smd, думаю врядли придется менять микросхему часов :-): , а вот кровать с лишними контактами по мне там ни к чему.
Только вот придётся припаивать, или впаять пины для подключения, их там нет.

Добавлено спустя 23 минуты 24 секунды:
планируется что-то типа такого ?
dimetrius

smd или нет - роли не играет, места займёт не на много больше, важна относительная точность часиков, что-бы не сбегали за месяц-два.
Dr0n писал(а): что-то типа
Типа такого не потяну :hi_hi_hi: , хотелось-бы, но буду расчитывать на свои силы. :smu:sche_nie:
Dr0n

Да вроде как из тех двух представленных, обе очень близки.
На точность влияние будет оказывать разве что кварц ну и как писал есть вариант,что микросхема времени в разъема может вносить погрешности(не обязательно это будет, но с контактами и разъемами бывает по разному)
Если хотите супер точности можно посмотреть например на DS3231 ( собирал на ней часы, за полтора года погрешностей на глаз не заметно, может и есть пара секунд).
Dr0n

МК одинаковые используются, так что думаю это скорее какой из вариантов платы будет удобней для работы.
По ардуинам не подскажу, сам никак не соберусь почитать и разобраться, а вещь интересная.
Но смотрю там у последней в комплекте ещё и часы, и дороже выходит, видел там без часов http://www.amazon.de/dp/B00OEIMCIW?psc=1
dimetrius

Dr0n писал(а):в комплекте ещё и часы, и дороже выходит, видел там без часов
Я тоже видел, по цене примерно одинаково выходит, просто для примера показал, у Uno возможностей больше чем у Nano (Smart), или я ошибаюсь?
Dr0n

По возможностям не должны они отличатся, они на одной и той же МК ATmega328P (просто в разном корпусе).
пишут что:
Arduino Nano — это функциональный аналог Arduino Uno, но размещённый на миниатюрной плате. Отличие заключается в отсутствии собственного гнезда для внешнего питания, использованием чипа FTDI FT232RL для USB-Serial преобразования и применением mini-USB кабеля для взаимодействия вместо стандартного.
получается дело удобства и размера, можно воткнуть БП в разъем уже на плате.
dimetrius

Получил я свои "железяки", кое как прописал порт (пришлось почистить порты и соединения :hi_hi_hi: ), но не получается что либо загрузить, выдаёт что порт не открывается. Перерыл интернет, на английском непонимай, на русском и немецком решения подобной проблемы нет. :-( В чём косяк?

Добавлено спустя 58 минут 13 секунд:
Разобрался, в погоне за дешевыми товарами опять нарвался на братьев китайцев, вместо чипа FTDI USB в оригинале установлен аналог CH 340 (при покупке отзывы надо читать :smu:sche_nie: ). С установкой соответствующего драйвера всё заработало. :ya_hoo_oo:
dimetrius

Скетч предложеный krendel, для включения/выключения освещения с функцией рассвет/закат и контролем оборотов кулера в зависимости от нагрева радиатора. :dr_ink:

#include <DS1307.h> // библиотека для часов DS1307
#include <Wire.h> // библиотеки для датчика температуры
#include <OneWire.h>

// одна ардуина управляет светом на 2х аквариумах 200 и 20 литров
// поэтому половина всего тупо дублируется

const int r1 = 4; // прописываются пины для релюшки которая вырубает блоки питания от сети (на каждый аквас по БП)
const int r3 = 7;

// незнаю с чем связано, но когда на ШИМе 0, то на одной ленте не гаснут полностью 3 или 4 светодиода из 10. какойто паразитный ток. откуда - так и не нашел. мультиметр не кажет, осцилографа нет (

const int dim_pin = 9; // пин управления шим для основного (200л)
const int dim_pin2 = 5; //шим для малого аквариума (20л)

// у ардуинки стандартно на порту для ШИМа можно задавать значения от 0-255
// соответственно ток на драйверах можно регулировать с градацией 1/255
// устанавливаю ток на
const int pwr1 = 150; //мощность шим для аквариума - max 255 было 180.
// на 200л у меня БП на 36v 1А, соответственно на 3 ленты по 10 диодов суммарно идет 1A*150/255 примерно 0.6А, ленты параллельны, те отдельно взятый диод запитывается примерно 0.2А

const int pwr2 = 130; //мощность шим для малого аквариума - max 255 было 160

//время на рассвет\закат, в часах. Собственно можно и в минутах, но нужно чуток править код
const int dim_time = 2; // время плавного диммирования

// для термодатчика 18b20. Приляпан термоклеем к радиатору примерно над одним из светодиодов
OneWire ds(8);


// переменные для хранения даты и времени
// sdStatus - переменные для хранения величины ШИМ для большого и малого аквариумов
int YEAR, MNTH, DAY, HOUR, MIN, SEC, sdStatus1, sdStatus2;

// часы включения и выключения света
int tSwOn = 11;
int tSwOff = 22;

// под датчик температуры, собственно весь код для работы датчика температуры выдран из ардуиновского примера работы с 18b20
byte addr[8];


void setup()
{

// переводим все пины на OUTPUT

pinMode(r1, OUTPUT);
pinMode(r3, OUTPUT);

pinMode(dim_pin, OUTPUT);
pinMode(dim_pin2, OUTPUT);


if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}

if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}


Serial.begin(9600);


// раскомментируем только единожды, когда нужно установить время на часах
// после снова комментим и грузим заново уже закоменченный
//rtc_set();

}

void loop()
{


// дергаем функцию опроса часов, которая в свою очередь дергает управеление ШИМ
time();
// для вывода температуры в консоль
temp();
// задержка на 3с.
delay(3000);


};




void time()

{

// читаем дату, время
// осталось от времен когда был LCD экран. Выкинул за ненадобностью
YEAR = RTC.get(DS1307_YR,true);

MNTH = RTC.get(DS1307_MTH,false);

DAY = RTC.get(DS1307_DATE,false);

HOUR = RTC.get(DS1307_HR,false);

MIN = RTC.get(DS1307_MIN,false);

SEC = RTC.get(DS1307_SEC,false);

// выводим время в консоль, ну или на экран при желании
Serial.println(String(HOUR)+":"+ String(MIN)+ ":" + String(SEC));
// статусы релюшек - включены выключены
Serial.println("r1= " + String(digitalRead(r1)));
Serial.println("r3= " + String(digitalRead(r3)));

// вызываем управление ШИМ
timer1(HOUR, MIN, SEC);

}



void timer1(int HOUR, int MIN, int SEC)
{

// здесь все время переводим в секунды

int FullSec = (HOUR * 60 + MIN) * 60 + SEC;

// получаем значение ШИМ в зависимости от времени.
sdStatus1 = min(map(FullSec, tSwOn*60*60, (tSwOn + dim_time)*60*60, 0, pwr1), map(FullSec, (tSwOff - dim_time)*60*60, tSwOff*60*60, pwr1, 0)); // Получаем мощность подсветки в зависимости от времени
sdStatus2 = min(map(FullSec, tSwOn*60*60, (tSwOn + dim_time)*60*60, 0, pwr2), map(FullSec, (tSwOff - dim_time)*60*60, tSwOff*60*60, pwr2, 0)); // Получаем мощность подсветки в зависимости от времени


// сравниваем текущее время с временем включения выключения
if (HOUR >=tSwOn and HOUR<tSwOff)
{

if (digitalRead(r1)==1) {digitalWrite(r1, LOW);}; // включаем реле
if (digitalRead(r3)==1) {digitalWrite(r3, LOW);}; // включаем реле


if ((sdStatus1 >= 0) and (sdStatus1 <= 255)) // либо отдаем на драйвера значение ШИМ, либо просто максимальное значение установленное в самом верху
{
Serial.println("SdStatus1= "+String(sdStatus1) + "SdStatus2= "+String(sdStatus2));

Serial.println("Pwr1= " + String(pwr1) + " Pwr2= " + String(pwr2));
analogWrite(dim_pin, constrain(sdStatus1, 0, pwr1)); // ограничиваем значение мощности допустимым интервалом (0;255)
analogWrite(dim_pin2, constrain(sdStatus2, 0, pwr2)); // ограничиваем значение мощности допустимым интервалом (0;255)
}
else
{
analogWrite(dim_pin, pwr1); // ограничиваем значение мощности допустимым интервалом pwr
analogWrite(dim_pin2, pwr2);

};



}
else
{
if (digitalRead(r1)==0) {digitalWrite(r1, HIGH);}
if (digitalRead(r3)==0) {digitalWrite(r3, HIGH);}

}; //включаем и выключаем основной свет в зависимости от времени.



};

// установка времени
void rtc_set()
{

RTC.stop();
RTC.set(DS1307_SEC,00); //set the seconds
RTC.set(DS1307_MIN,44); //set the minutes
RTC.set(DS1307_HR,21); //set the hours
RTC.set(DS1307_DOW,4); //set the day of the week
RTC.set(DS1307_DATE,8); //set the date
RTC.set(DS1307_MTH,01); //set the month
RTC.set(DS1307_YR,15); //set the year
RTC.start();

};


// код работы с 18b20 из примера.
void temp(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
float celsius;


Serial.println();



ds.reset();
ds.select(addr);
ds.write(0x44, 1); // начинаем преобразование, с паразитным током в конце (start conversion, with parasite power on at the end)

delay(1000); // возможно 750 мс достаточно, возможно нет
// здесь мы могли бы сделать ds.depower (), но сброс позаботиться о нем и сам.

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad


for ( i = 0; i < 9; i++) { // нам нужны 9 байтов
data = ds.read();

}


// Преобразуем данные в фактическую температуру
// потому что результат - подписанное целое число 16 битов, он должен
// быть сохранен к типу "int16_t", который всегда является 16 битным
// даже когда собрано на 32-битном процессоре.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "количество остается", дает полную 12-битную резолюцию ("count remain" gives full 12 bit resolution)
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// в ниже res, низкие биты не определены, поэтому позволим перевевести значение в 0 (at lower res, the low bits are undefined, so let's zero them)
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;

Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.println();
Serial.println();

}

Те кто знаком с программированием и хорошо владеет английским предлагаю проверить на наличие ошибок.
Ждём дальнейшего описания конструкции от автора. :dr_ink:
Mysteo

Ю.В. писал(а):Еще было бы неплохо, чтобы он в интернет заходил и в GSM формат. Чтоб управлять не просто со смартфона было, но и со старенького телефона :-)
У меня есть опыт работы с GSM модулями от компании SIM )
Так, что GSM прикрутить не проблема и управлять можно будет тональным набором например или смсками, но вот только не пойму зачем управлять светом с телефона если время включения и выключения спокойно задается девайсом ?

Да и за температурой тоже железка сама следит. Если только на случай , что железо затупит ?
belkinnn

Всем здравствуйте. Хочу поделится своим контролером на arduino. Аквариум пресный на 250л с заделом на травник пока пару кустиков. Контролер arduino mega2560 управляет
-светом 4канала
-нагревателем воды и грунта
-кормление
-подлив воды
-автоподмена воды
-подача со2
-подача удобрений 2кагала
-управление фильтром
-компресором
-ночной подсветкой на светодиодах.
Вся настройка пока осуществляется с компьютера по сети мне просто так удобнее могу контролировать все параметры не вставая с места. Управление осуществляется по временив память контролера вшита суточная диаграма по всем необходимым каналам + недельные метки под автоподмегу. Нагревателями и охлождением управление производится по параметрам с двух датчиков ds18b20. Системы уже запущега но еще находится на стадии обкатки если клго заинтересовало отвечу поделюсь и буду рад любой критеке.
DenisYegorov

Не поделитесь кодом, тоже мега 2560, есть RTC d3231 и пару реле, нужно управлять светом по времени, компрессором ну и т.д.
belkinnn

Вот код программы и схема. прошу прощения что может криво но как есть. Цифрами обозначены выводы меги...
Вложения
index.zip
(600.94 КБ) 567 скачиваний
Ардуино Jarduino на службе аквариуму. - фото#68301
Ардуино Jarduino на службе аквариуму. - фото#68302
Dr0n

Можно немного вмешаюсь :smu:sche_nie:
Я бы посоветовал поставить электролитические конденсаторы на управление транзисторами. (номинал не сильно критичен что-нибудь вроде 330-470 микрофарад и 16-25 вольт)
Смысл в том, что частота ШИМ часто попадает в слышимый диапазон и кулеры могут издавать неприятный свист/писк или другой посторонний шум. upd.
Извиняюсь, глянул сейчас, у вас кулеры включаются и работают только на полную мощность, тогда действительно необходимости в конденсаторах нет.
Просто у себя делаю изменение оборотов вентиляторов в зависимости от температуры воды и влажности под крышкой.
Зерко

belkinnn писал(а):Всем здравствуйте. Хочу поделится своим контролером на arduino. Аквариум пресный на 250л с заделом на травник пока пару кустиков. Контролер arduino mega2560 управляет
-светом 4канала
-нагревателем воды и грунта
-кормление
-подлив воды
-автоподмена воды
-подача со2
-подача удобрений 2кагала
-управление фильтром
-компресором
-ночной подсветкой на светодиодах.
Вся настройка пока осуществляется с компьютера по сети мне просто так удобнее могу контролировать все параметры не вставая с места. Управление осуществляется по временив память контролера вшита суточная диаграма по всем необходимым каналам + недельные метки под автоподмегу. Нагревателями и охлождением управление производится по параметрам с двух датчиков ds18b20. Системы уже запущега но еще находится на стадии обкатки если клго заинтересовало отвечу поделюсь и буду рад любой критеке.
У вас светодиодный свет установлен? Или ЛЛ?
belkinnn

Лампы люминисцентные
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение