Итак, вроде не было такой темы. Предлагаю тут обсуждать различные варианты автоматизации при уходе за аквариумом. В частности на системе Arduino. Для примера подобных систем
морякам должно особо понравится
Ещё большим стимулом для нас всех должно стать, что среди нас есть люди которые уже собирали подобные системы и могут если что подсказать нам.
магкой тряпочкой. сложно это делать просто да и после этого перекалибровывать его приходится.... Ну и зелёные водоросли зачастую только в кислоте отлипают...
А вообще если он ни ни к какой автоматике не привязан то нафиг нафиг нафиг. Лучше обычный индикационный раствор. Хлопот меньше.
ну это понятно, в планах аква комп на arduino, но это, с учётом написания софта, скорее ближе к осени.
Если не в лом ткни пальцем. У тебя работает такая система?
Да работает. На радуине крутится общий таймер отвечающий за освещение, со2, компрессор и автоматическую регулировку скорости вращения кулеров, контроль за температурой воды с отключением основного света при перегреве. + отключение подачи со2 при его сильном изменении. Датчик PH купил на ебее за 15 зелёных, усилитель к нему собирал сам из того что валялось дома. Блок реле тоже собирал из того что нашлось дома. ps есть только одна проблема которую не смог победить часы на базе ds1307 переодически останавливаются при отключении ЭМ клапана хоть симисторное управление из-за этого на него ставь(
To do: * if lights are turned out for one reason or another, extend the photo-period by that amount * adjust time for daylight savings
Analog Pin 1 = PH Probe Analog Pin 2 = **ORP Probe? Analog Pin 3 = Analog Pin 4 = SDA for I2C Analog Pin 5 = SCL for I2C
Digital Pin 0 = RX Digital Pin 1 = TX Digital Pin 2 = Temp Sensor Digital Pin 3 = Relay day light Digital Pin 4 = Relay moon light Digital Pin 5 = PWM fan 1 Digital Pin 6 = PWM fan 2 Digital Pin 7 = Relay co2 solenoid Digital Pin 8 = Relay heater Digital Pin 9 = Relay air pump Digital Pin 10 = Digital Pin 11 = Digital Pin 12 = Digital Pin 13 = Alarm?
*/
LiquidCrystal_I2C lcd(0x27,20,4); //[# of lines on LCD],[address of serial LCD controller on I2C]
int ph_probe = 1; //PH probe on analog 1 OneWire ds(2); // Temp Sensor on pin 2 int day_light = 3; int moon_light = 4; int fan_1 = 6; int fan_2 = 5; int CO2 = 7; int heater = 8; //нагреватель int air = 9; int alarm = 13;
int heater_on_temp = 2400; //Температура включения нагревателя 25,5С = 2550 int heater_off_temp = 2600; //Температура отключения нагревателя
int fan_1_min = 2850; //Температура включения 1 кулера int fan_1_max = 3050; //Температура выхода на максимальные обороты 1 кулера
int fan_2_min = 3000; //Температура включения 2 кулера int fan_2_max = 4000; //Температура выхода на максимальные обороты 2 кулера
int lights_off_temp = 3200; //При такой темпераатуре основной свет выключится
int lights_on_time = 1000; //Время ключения основного света 13:20 = 1320 int lights_off_time = 2200; //Время отключения основного света int wait_time = 5; //время задержки включения ламп в случае перегрева int lights_out = -100;
int moonl_on_time = 2200; //Время включения ночной подсветки int moonl_off_time = 700; //Время выключения ночной подсветки
int air_on_time = 2200; //Время включения аэратора int air_off_time =700; //Время выключения аэратора
int CO2_on_time = 930; //Время включения подачи CO2 int CO2_off_time =2130; //Время выключения подачи CO2 int wait_time_CO2 = 5; //Dремя задержки включения клапана в случае избыточной подачи int CO2_out = -100; int CO2_off_PH = 5; //Значение PH при котором будет прекращена подача газа
#define NUMREADINGS 10 int readings[NUMREADINGS]; // Чтение с аналового входа int index = 0; // текущее количество чтений int total = 0; // tвсего чтений int average = 0; // в среднем
//разкоментить для установки времени RTC.stop(); RTC.set(DS1307_SEC,01); RTC.set(DS1307_MIN,40); RTC.set(DS1307_HR,8); RTC.set(DS1307_DOW,2); RTC.set(DS1307_DATE,14); RTC.set(DS1307_MTH,8); RTC.set(DS1307_YR,12); RTC.start();
//****** Инициализация входов/выходов************************************/ pinMode(heater, OUTPUT); // Цифровой выход для нагревателя pinMode(day_light, OUTPUT); // Цифровой выход для основного света pinMode(moon_light, OUTPUT); // Цифровой выход для ночной подсветки pinMode(fan_1, OUTPUT); // Цифровой выход для 1-го кулера pinMode(fan_2, OUTPUT); // Цифровой выход для 2-го кулера pinMode(air, OUTPUT); // Цифровой выход для компрессора pinMode(CO2, OUTPUT); // Цифровой выход для клапана CO2 pinMode(alarm, OUTPUT); // Цифровой выход для звукового сигнала
digitalWrite(day_light, LOW);
for (int i = 0; i < NUMREADINGS; i++) readings[i] = 0;
}
int High = 0; int Low = 10000; int on_minute = 1;
void loop(void){ byte i; byte present = 0; byte data[12]; byte addr[8]; long ph_val; int HighByte, LowByte, TReading, SignBit, Tc_100, Tc2_100, Whole, Fract, Whole2, Fract2, minute, hour, second, date, month, year, mil_time, ph_read; char buf[12]; //используется для перевода int в string для отображения на дисплее
//Получение времени из DS1307************************************************************************** ********************
hour = RTC.get(DS1307_HR,true); minute = RTC.get(DS1307_MIN,false); second = RTC.get(DS1307_SEC,false); date = RTC.get(DS1307_DATE,false); month = RTC.get(DS1307_MTH,false); year = RTC.get(DS1307_YR,false); mil_time = (hour * 100) + minute;
//получение температуры из DS18B20 ******************************************************************************** ******* if ( !ds.search(addr)) { ds.reset_search(); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 12; i++) { // we need 9 bytes data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
if ( !ds.search(addr)) { ds.reset_search(); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc2_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
float g = (Tc2_100 - fan_2_min); float f = (fan_2_max - fan_2_min); int w = (g/f)*100; int fgh = w*2.55; if(Tc2_100 < fan_2_min){ analogWrite(fan_2, 0); } if (Tc2_100 > fan_2_max){ analogWrite(fan_2,254); } if (Tc2_100 > fan_2_min && Tc2_100 < fan_2_max) { analogWrite(fan_2,fgh); }
//*********** PH ******************************************************************************** ************** // Для калибровки электрода опустить электрод в раствор 7ph, установить напряжение 2В. В растворе 10PH выставить напряжение 1В.
total -= readings[index]; // subtract the last reading readings[index] = analogRead(ph_probe); // read from the sensor total += readings[index]; // add the reading to the total index = (index + 1); // advance to the next index
if (index >= NUMREADINGS) // if we're at the end of the array... index = 0; // ...wrap around to the beginning
average = total / NUMREADINGS; // calculate the average
ph_val = (-1.47 * average + 1300); //ph is stored 100 times value
Whole = (ph_val / 100); // separate off the whole and fractional portions Fract = (ph_val % 100);
lcd.setCursor (12,2); if (w > 99) {lcd.print ("Fan2 MAX");} if (w < 1) {lcd.print ("Fan2 OFF");} if (w < 100 && w > 9) { lcd.print ("Fan2 "); lcd.print (w); lcd.print ("%"); } if (w < 10 && w > 0) { lcd.print ("Fan2 0"); lcd.print (w); lcd.print ("%"); }
//******************** Сколько осталось до нормального функционирования ***********************************************************
Да работает. На радуине крутится общий таймер отвечающий за освещение, со2, компрессор и автоматическую регулировку скорости вращения кулеров, контроль за температурой воды с отключением основного света при перегреве. + отключение подачи со2 при его сильном изменении. Датчик PH купил на ебее за 15 зелёных, усилитель к нему собирал сам из того что валялось дома. Блок реле тоже собирал из того что нашлось дома. ps есть только одна проблема которую не смог победить часы на базе ds1307 переодически останавливаются при отключении ЭМ клапана хоть симисторное управление из-за этого на него ставь(
Искать в ломы но вот исходник.
Спасибо. Плюсанул. Сразу пару вопросов, а для датчика зачем усилитель? Я в этом не сильно силён, знакомый обещал помочь, разве нельзя датчик к аналоговому входу прикрутить и всё? Как решал вопрос с вентиляторами? Ну в смысле как регулировал скорость? Желательно подробно, я по прикидкам думал разделить вентиляторы на 3 разных блока и включать каждый из них в зависимости от температуры, но теоретически можно же PWM вентиляторы использовать, но я не разбирался как там реально управление происходит, да и дороже они. В общем подробнее про них. А не хочешь тему отдельную создать, с подробным описанием как у тебя всё устроено? Я думаю тебя бы плюсами закидали, я бы кстати за реальную помощь в наладке системы готов даже денЮшку тебе подкинуть , я думаю и ещё желающие будут не самим ковыряться, а деньгами тебя отблагодарить, морякам так вообще сам бог велел, я смотрел там народ полный цикл освещения собирал из ардуино и светодиодов, вплоть до фаз луны во фанатики
Спасибо. Плюсанул. Сразу пару вопросов, а для датчика зачем усилитель? Я в этом не сильно силён, знакомый обещал помочь, разве нельзя датчик к аналоговому входу прикрутить и всё? Как решал вопрос с вентиляторами? Ну в смысле как регулировал скорость? Желательно подробно, я по прикидкам думал разделить вентиляторы на 3 разных блока и включать каждый из них в зависимости от температуры, но теоретически можно же PWM вентиляторы использовать, но я не разбирался как там реально управление происходит, да и дороже они. В общем подробнее про них. А не хочешь тему отдельную создать, с подробным описанием как у тебя всё устроено? Я думаю тебя бы плюсами закидали, я бы кстати за реальную помощь в наладке системы готов даже денЮшку тебе подкинуть , я думаю и ещё желающие будут не самим ковыряться, а деньгами тебя отблагодарить, морякам так вообще сам бог велел, я смотрел там народ полный цикл освещения собирал из ардуино и светодиодов, вплоть до фаз луны во фанатики
DS1307 I2C RTC DS1307 24C32 Real Time Clock Module for Arduino - Blue USD$ 4.80
DIY DS18B20 Stainless Steel Temperature Sensor Probe - Black USD$ 5.90
Mega 2560 R3 Development Board w/ USB Cable for Arduino USD$ 28.70
5V 4 Channel High Level Trigger Relay Module for Arduino - Red USD$ 7.70
Датчик РН пока не заказывал. Не подскажешь что ещё заказать нужно? Может что то не учтено мною?
Сразу лучше закажи блок реле на 8 каналов т.к. штука увлекающая и со временем может не хватить.
Дальше зря ты экран шилдовый заказал надо было i2c иначе пинов остаётся очень мало свободных или ардуину мегу только заказывать придётся. Да и 2 строки в 16 символов чертовски мало....
усилитель для электрода жизнено необходим т.к. сигнал с электрода очень слабы и ардуина его не распознаёт.
PWM регулировку я сделал топорным способом на транзисторе кт819б на 3 кулера в крышку. И кт815а на 1 кулер обдувающий воду. На кулера идёт уже отрегулированное напряжение.
Температурных датчика у меня 2. 1-й мерит температуру воды второй воздуха под крышкой. соответсвенно при включении света раскручиваются сначала кулера в крышке держа температуру в крышке 35 градусов. При достижении температуры воды в 27,5 включается кулер обдувающий воду. при 28 градусах в воде кулера в крышке включаются на полную. при температуре воды больше 30 градусов отключается основной свет + подача со2.
ps в версии кода которую выложил нет последних 4-х фичей)
pss вот такое безобразие твориться у меня на экране 20*4 psss H1 нагреватель включён L1 общий свет включён М0 ночная подсветка выключена А0 компрессор отключен С1 подача со2 включена 2 пустых места в конце это под время оставшегося до включения со2 и основного света в случае если 1 из параметров выходит из под контроля.
Сообщение отредактировал Excentro_24 - Mar 2 2013, 16:24
Что касается меня. Задумался об ардуино, не столько для реального упрощения жизни, сколько для того что люблю я это дело (автоматизация, электроника и т.п.). Ну и для пресноводной банки с растениями у меня получился примерно такой план. 1)Включение основного света по таймеру, возможно постепенное включение, ну и ночная подсветка. 2)Контроль температуры в аквариуме если ниже заданной то включается обогреватель если выше то вентиляторы, желательно чтобы вентиляторы работали с регулировкой мощности в зависимости от температуры. 3)Подача СО2 в зависимости от показаний датчика РН. Это основное пока Еще можно задуматься 4)Авто система подмены воды при ручном режиме включения данной опции, ну например сначала помпа сливает воду с банки, потом заливает из резервуара для отстаивания, ну и заливает в резервуар из крана, это не продуманно, просто мысли. 5)Авто подача удобрений т.к. таймер позволяет делать задержки в секундах, а не только в минутах то проблем со специальными помпами быть не должно, пока отпугивает только цена подобных помп. Ну и т.д. и т.п.
Сразу лучше закажи блок реле на 8 каналов т.к. штука увлекающая и со временем может не хватить.
Дальше зря ты экран шилдовый заказал надо было i2c иначе пинов остаётся очень мало свободных или ардуину мегу только заказывать придётся. Да и 2 строки в 16 символов чертовски мало....
Да там толком не написано сколько строк, да и я руководствовался тем что на этом дисплее кнопки управления есть, а ты получается ничего поменять не можешь? Только через перепрошивку? Или как параметры меняешь?
По реле я сначала хотел 8 взять, а потом посмотрел а там двойные реле (2 канала пока один работает второй отключён, как сработает меняется местами), подумал что таких для начала и 4-х хватит :-)
после всего увиденного чет тоже такую штукенцию замутить захотелось... но самому все это я думаю мне не осилить... а все оборудование ну примерно естественно какой обьем занимает? чет по количеству плат, там целый короб под все это надо чтоб спрятать..
после всего увиденного чет тоже такую штукенцию замутить захотелось... но самому все это я думаю мне не осилить... а все оборудование ну примерно естественно какой обьем занимает? чет по количеству плат, там целый короб под все это надо чтоб спрятать..
да не платы мелкие, контролер допустим примерно 5х10 см, всё остальное меньших размеров, там ещё куча проводов будет и как это аккуратно сделать, это будет целая история :-)
Да там толком не написано сколько строк, да и я руководствовался тем что на этом дисплее кнопки управления есть, а ты получается ничего поменять не можешь? Только через перепрошивку? Или как параметры меняешь?
По реле я сначала хотел 8 взять, а потом посмотрел а там двойные реле (2 канала пока один работает второй отключён, как сработает меняется местами), подумал что таких для начала и 4-х хватит :-)
С клавиатурой мне проще. Мне её только подключить к i2c шине и всё. Но придётся очень сильно перелопачивать код...