Простой Arduino-контроллер "чайника" - от макета до готового изделия


Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Простой Arduino-контроллер "чайника" - от макета до готового изделия
В какой-то мере эта тема является продолжением темы уважаемого ZORS, читать тут. По крайней мере, в том, что касается контроллера, который делаю я, пользуясь наработками, схемами и критикой из той темы.
Идея иметь некоторое контролирующее аквариум устройство у меня имелась давно. Устройство, которое обслуживало бы основные потребности аквариума (контроль света, температуры, СО2, возможно рН и подачу УДО) и было бы относительно простым в сборке и гибким для приспособления к своим индивидуальным нуждам.
Про платы Arduino я впервые прочитал пару лет назад точно, но как-то не решался приступить к ее изучению. Причем, если железо и схемы "чаво-куда-воткнуть" для меня еще более менее не страшны (закон Ома не менялся последние лет 150), то вот программная часть, прямо скажу, отталкивала, ибо я боялся не разобраться. По образованию и профессии я весьма далек от программирования. Последний раз году в 1989-90 в школьном кружке работал на Бейские и (могу ошибиться) на Фортране.
Толчком послужила тема, которую я уже указал, где ТС и другие участники все подробно разжевали и в рот положили, ну а проглотить - это уже дело индивидуальное.
Вот о процессе глотания и пойдет речь. Ну, в смысле, что у меня получилось из ардуины.
2014-05-02 добавлено 02/05/2014 22:20:09#1968755
Нравится skitol

Посетитель




93 1
Москва
19 час. назад
Дядька-рыбомор



Ого! Огромное спасибо за работу!)
2014-05-24 добавлено 24/05/2014 16:52:20#1974682

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Небольшие пояснения к схеме, чаво-куды включено
Коммутация входов/выходов ардуины такая:
2 - кнопка вкл/выкл режима СО2
3 - кнопка листания меню на дисплее
4 - реле управление ЭМ-клапаном СО2
5 - ШИМ для канала "утро-вечер"
6 - ШИМ для канала "основной дневной свет"
7 - реле вкл/выкл питания драйверов от 19V AC/DC
8 - управление реле включения кулеров для воды
9 - вход для термодатчика радиаторов
10 - вход для термодатчика воды
12 - управление реле включения кулеров для радиаторов
А0 - вход для АЦП от кнопок "21:00", "подсветка дисплея", "выкл/вкл освещения в ручном режиме"
Можно запросто сэкономить 2 выхода (2 и 3), если повесить на АЦП (к А0) эти две кнопки, подобрав номиналы резисторов. Я не стал этого делать: лень и хотелось попробовать разные схемы управления кнопками.
2014-05-24 добавлено 24/05/2014 17:10:13#1974686

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Когда включается питание, появляется логотипчик, что-то типа "Хэллоуворда".

Потом экран гаснет. Чтобы вообще понимать, работает ли контроллер, я на переднюю панель вывел 3,5 мм зеленый светодиод, включенный к GND и VCC через резистор 1 ком.
После нажатия кнопки "подсветки экрана" включается подсветка экрана (все должно быть логично!), выводится время, дата, день недели (а вдруг пригодится?).

Далее кнопкой "меню" листаем меню. После первого нажатия выводится инфа, чего у нас включено, в авто или ручном режиме. Ну, к примеру

такая запись говорит о том, что свет и СО2 работают в режиме "авто", свет включен, СО2 выключено, а три буквы Evg означают evening, т.е. вечер (основной свет уже погас, но доп. подсветка еще работает). Также возможны варианты Ngt, т.е. night, ночь (весь свет выключен), Mrg, т.е. morning (включено доп.освещение), Day (включено основное освещение). Утром-вечером будут включаться 3 диода теплого белого, а днем в качестве основного света - 8 диодов холодного белого. Все, конечно, через ШИМ для плавности.
Продолжение следует.
2014-05-24 добавлено 24/05/2014 17:30:27#1974691

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
На этой странице меню можно кнопками "СО2" и "свет" включать нужный режим.
Для кнопки "СО2" есть три варианта - полный автомат "AUTO", режим "ON HAND" - вкл в ручном режиме и "OFF HAND" - выкл в ручном режиме. После третьего нажатия цикл повторяется. Я это делал под свои нужны, т.е. подаю СО2 из аппарата Киппа (сода+лимонка) для настройки скорости подачт после перезарядки аппарата.
Для света есть возможность просто выключить его ("OFF HAND") или включитm в автомате ("ON AUTO" и "OFF AUTO"). Для меня это актуально, т.к. когдя лезу в аквас, то откидываю светильник и не хочу, чтобы свет бил в глаза. Примеры скриншотов

Следующее нажатие кнопки "меню" выводит на экран температуру воды и ридиаторов, тут все понятно

Значок "*" обозначает, что температура превысила установленный порог+гистерезис и включились соответствующие кулеры (в последнем варианте скетча для радиаторов установлено 40 градусов). После падения температуры ниже установленного порога-гистерезис кулеры отключаются. Работает терморегуляция в период 9:00 - 22:00, т.к. аквас стоит в спальном помещении, слушать ночью джаз кулеров я и жена не хотели бы.
Третье нажатие на кнопку "меню" возвращает нас к часам, и так по кругу.
Выключается подсветка экрана повторным нажатием на кнопку "подсветка экрана". Была мысль сделать автоматом выключение экрана через заданное время, но мне так показалось неудобным.
2014-05-24 добавлено 24/05/2014 17:56:58#1974699

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Кнопка "21:00" на задней панели устанавливает часы на 21:00 по сигналам программы "Время". Часы программно корригируются, у меня установлена коррекция минус 1 секунда каждые 38 мин. Этот показатель индивидуальный для разных RTC.
2014-05-24 добавлено 24/05/2014 17:59:37#1974700

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Еще добавлю, что несмотря на обилие соединений на схеме, внутри корпуса проводов относительно мало, т.к. вся коммутация выполнена на самодельном шилде к ардуине, и все компоненты подключены шлейфами через разъемы типа "мама-папа".
2014-05-24 добавлено 24/05/2014 18:20:05#1974703
Нравится Bwzs

Посетитель




93 1
Москва
19 час. назад
Спасибо Вам огромное за данную тему. Собрал почти все как у Вас, только проще. У меня нет требований ставить датчики температуры и кулеров, в связи с этим поставил 2 реле вместо 4, так же у меня всего одна линейка СД поэтому поставил только один драйвер, в связи с этим возникает вопрос как можно переделать скетч под эти требования? Вырезал из скетча все что связано с Ldd2 и и температурой, теперь вообще все работает криво косо, подскажите как решить?
2014-07-11 добавлено 11/07/2014 08:13:19#1984711

Посетитель




232 11
Курчатов
2 мес. назад
Bwzs

нужен оригинальный скетч и тот, что получился, искать, где затронули основную логику
выкладывайте
2014-07-14 добавлено 14/07/2014 14:13:55#1985361

Посетитель




93 1
Москва
19 час. назад
Оригинальный в данной теме
http://www.aqa.ru/fo...


мой http://my-files.ru/u...

с шимом вроде работает только теперь включает СД на полную. Пробовал менять значения на 180 вместо 255, все равно палит на всю.


//Установки параметров ШИМ
#define PWM_MIN 0 //минимальное значение ШИМ
#define PWM_MAX 180//максимальное значение ШИМ
2014-07-16 добавлено 16/07/2014 16:06:43#1985885

Новичок




13
Kazakhstan Kostanay
2 г. назад
Дядька-рыбомор


Помогите пожалуйста с кодом в этой теме.У меня четырёх канальное реле включается в off а выключается в On.Где и что нужно поменять в скетче?

/*Скетч с использованием UNIX-времени
По материалам www.aqa.ru и благодаря стараниям ZORS
Версия от 03 мая 2014
Управление 4-мя реле (СО2, термореле воды и радиаторов ЛЭД, вкл/выкл драйверов ЛЭД)
ШИМ ЛЭД по 2-м каналам
Вывод на экран температуры, времени, даты, состояния включенных функций
Коррекция неточных RTC
Работа с 5-ю кнопками: вкл/выкл подсветки дисплея меню дисплея, время на 21:00,
управление СО2, светом.
*/

//Загрузка библиотек
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>

//Установка экрана
LiquidCrystal_I2C lcd(0x27,16,2);


//Подключение выходов
const int RelCO2 = 4; //реле СО2 на выходе 4
const int RelLdd = 7;//выход 7 реле DC для драйверов LDD
const int Led1 = 5; //ШИМ утро-вечер выходе 5
const int Led2 = 6; //ШИМ день на выходе 6
const int TermRel1 = 8;//выход 8 для реле термодатчика воды
const int TermRel2 = 12; //выход 12 для реле термодатчика радиаторов

//Установки параметров ШИМ
#define PWM_MIN 0 //минимальное значение ШИМ
#define PWM_MAX 255//максимальное значение ШИМ

//Значения минут и часов в секундах
#define mn 60UL
#define hr 3600UL

//Установки времени вклвыкл ШИМ-сигнала на 5 и 6 выходах (время в секундах UNIX)
const long Led1On = 13*hr;//включение ШИМ на 5 выходе в 13:00
const long Led1Off = 21*hr+30*mn;//выключение (начало заката) в 21:30
const long Led1Dur = 30*mn;//длительность восхода-заката 30 мин

const long Led2On = 15*hr;//включение ШИМ на 6 выходе в 15:00
const long Led2Off = 20*hr+30*mn;//выключение (начало заката) в 20:30
const long Led2Dur = 30*mn;//длительность восхода-заката
const long CO2On = 14*hr+30*mn;//включение СО2
const long CO2Off = 20*hr+30*mn;//выключение СО2

//Установка RTC и их коррекция
RTC_DS1307 RTC;
uint32_t TimeAdjustPeriod = 38*mn; //корректирровка времени на -1 сек за 38 мин
uint32_t TimeCorrection = 1;
unsigned long nextAdjustTime = 0;

//Установки для печати месяцев на экране
const char* months[] = {
"Jan", "Feb", "Mar",
"Apr", "May", "Jun",
"Jul","Aug", "Sep",
"Oct", "Nov", "Dec"};

//Установки для термодатчика
int TSensorPin1 = 10;
int TSensorPin2 = 9;
OneWire ds1(TSensorPin1);// создаем объект температурного датчика
OneWire ds2(TSensorPin2);
float t1 = 27.0;//установка температуры
float tGist1 = 0.2;//установка гистерезиса

float t2 = 40.0;//установка температуры
float tGist2 = 0.5;//установка гистерезиса

//Установки для кнопки СО2 на выходе 2
const int ButtonCO2 = 2;
boolean flagCO2 = false;
int regimCO2 = 1;

//Установки для кнопок "Время 21:00", "Свет" и "Подсветка LCD на аналоговом входе А0
const int ButtonA0 = A0;
int analogA0 = 0;
boolean flagA0 = false;
int regimA0 = 1;
boolean flagA0LCD = false;
int regimA0LCD = 1;

//Установки для кнопки "Меню экрана" на выходе 3
const int ButtonMenu = 3;
boolean flagMenu = false;
int regimMenu = 1;


//*********************************************************
void setup () {
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__)); // строка только для первой компиляции!!!
DateTime myTime = RTC.now();
//RTC.adjust(DateTime(myTime.unixtime()+15)); //строка только для первой компиляции!!!
RTC.adjust(DateTime(myTime.unixtime()+3));//для второй компиляции, коррекция при перезагрузках Arduino на 3 сек.

//Первоначальные установки выходов
pinMode (RelCO2, OUTPUT);
pinMode (RelLdd, OUTPUT);
pinMode (TermRel1, OUTPUT);
pinMode (TermRel2, OUTPUT);
digitalWrite (RelCO2, LOW);
digitalWrite (RelLdd, LOW);
digitalWrite (TermRel1, LOW);
digitalWrite (TermRel2, LOW);

analogWrite(Led1, PWM_MIN);
analogWrite(Led2, PWM_MIN);

//Первоначальные надписи на дисплее
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("iAQUA");//Слава мне, любимому
lcd.setCursor(3, 1);
lcd.print("v.3.05.14");
delay (3000);
lcd.clear();
lcd.noBacklight();
}
//***************************************************
void loop () {
//Работа часов с коррекцией
DateTime myTime = RTC.now();
uint32_t UTime = myTime.unixtime();
if (UTime > nextAdjustTime){
nextAdjustTime = UTime+TimeAdjustPeriod;
RTC.adjust(DateTime(UTime-TimeCorrection));
}
UTime %=86400;
analogA0=analogRead(A0);
if (analogA0>685 && analogA0<710)//коррекция времени нажатием кнопки (21:00)
{
DateTime myTime = RTC.now();
uint32_t UTime = myTime.unixtime();
UTime = 75600 + (UTime-UTime%86400);
RTC.adjust(DateTime(UTime));
}
if (analogA0>810 && analogA0<840 && !flagA0)//ручное и автоматическое управление светом
{
regimA0++;
flagA0 = true;
if (regimA0>2)
{
regimA0=1;
}
}
else if (analogA0<810 && flagA0)
{
flagA0=false;
}
if (regimA0==1)
{
if ((UTime>=(Led1On-1*mn)) && (UTime<(Led1Off+Led1Dur+1*mn)))//время вкл/выкл драйверов в авто-режиме
{
digitalWrite(RelLdd, HIGH);
}
else
{
digitalWrite(RelLdd, LOW);
}
}
if (regimA0 !=1)
{
digitalWrite(RelLdd, LOW);
}

if (analogA0>580 && analogA0<610 && !flagA0LCD)//управление подсветкой экрана
{
regimA0LCD++;
flagA0LCD = true;
if (regimA0LCD > 2)
{
regimA0LCD = 1;
}}
else if(analogA0 < 580 && flagA0LCD)
{
flagA0LCD = false;
}
if (regimA0LCD==1)
{
lcd.noBacklight();
}
if (regimA0LCD !=1)
{
lcd.backlight();
}


//Управление СО2
if (digitalRead(ButtonCO2)==HIGH && !flagCO2)
{
regimCO2++;
flagCO2=true;
if(regimCO2>3)
{
regimCO2=1;
}
}
else if (digitalRead(ButtonCO2)==LOW && flagCO2)
{
flagCO2=false;
}
if(regimCO2==1)

{
if (UTime>=CO2On && UTime<CO2Off)
{
digitalWrite (RelCO2, HIGH);
}
else
{
digitalWrite (RelCO2, LOW);
}
}
else if(regimCO2==2)
{
digitalWrite(RelCO2, HIGH);
}
else if(regimCO2==3)
{
digitalWrite(RelCO2, LOW);

}

//управление термореле воды в период 9:00-22:00
float temp1 = getTemp1();
//lcd.setCursor(9,1);
if((temp1 > (t1 + tGist1)) && (UTime >= 9*hr) && (UTime < 22*hr))
{
digitalWrite(TermRel1,HIGH);
}
else if ((temp1 < (t1 - tGist1)) || UTime <9*hr || UTime >= 22*hr)
{
digitalWrite(TermRel1,LOW);
}

float temp2 = getTemp2();//управление термореле радиаторов
if (temp2>(t2+tGist1) && UTime>=9*hr && UTime<22*hr)
{
digitalWrite(TermRel2, HIGH);
}
else if (temp2<(t2-tGist2) || UTime<9*hr || UTime>=22*hr)
{
digitalWrite(TermRel2, LOW);
}

//Управление кнопкой "Меню экрана"
if (digitalRead(ButtonMenu)==HIGH && !flagMenu)
{
lcd.clear();
flagMenu = true;
regimMenu ++;
if (regimMenu>3)
{
regimMenu=1;
}
}
else if (digitalRead(ButtonMenu)==LOW && flagMenu)
{
flagMenu=false;
}
if (regimMenu==1) //меню "1" вывод на экран времени и календаря
{
lcd.setCursor(4, 0);
if (myTime.hour() < 10) lcd.print ("0");
lcd.print(myTime.hour());
lcd.print(':');
if (myTime.minute() < 10) lcd.print ("0");
lcd.print(myTime.minute());
lcd.print(':');
if (myTime.second() < 10) lcd.print ("0");
lcd.print(myTime.second());
lcd.setCursor(0, 1);
if (myTime.day() < 10) lcd.print ("0");
lcd.print(myTime.day());
lcd.setCursor(3, 1);
lcd.print (months[myTime.month()-1]);
lcd.setCursor(7,1);
lcd.print(myTime.year());
lcd.setCursor(13,1);
int dow = (myTime.dayOfWeek());
switch (dow){
case 0:
lcd.print("Sun");
break;
case 1:
lcd.print("Mon");
break;
case 2:
lcd.print("Tue");
break;
case 3:
lcd.print("Wed");
break;
case 4:
lcd.print("Thu");
break;
case 5:
lcd.print("Fri");
break;
case 6:
lcd.print("Sat");
break;
}
}
else if (regimMenu==2)//меню "2" вывод на экран CO2, T, режима работы диодов
{
lcd.setCursor(0,0);
lcd.print("CO2");
lcd.setCursor(4,0);
if (digitalRead(RelCO2)==HIGH)
{
lcd.print("On ");
}
else
{
lcd.print("Off");
}
lcd.setCursor(8,0);
if (regimCO2 == 1)
{
lcd.print("Auto");
}
else if (regimCO2 !=1)
{
lcd.print("Hand");
}

lcd.setCursor(13,1);
if(UTime<Led1On || UTime >=(Led1Off+Led1Dur))
{
lcd.print("Ngt");
}
else if (UTime>=(Led1On) && UTime < Led2On)
{
lcd.print("Mrg");
}
else if(UTime >= Led2On && UTime < Led2Off)
{
lcd.print("Day");
}
else if (UTime >= Led2Off && UTime < (Led1Off+Led1Dur))
{
lcd.print("Evg");
}
lcd.setCursor(0,1);
if (digitalRead(RelLdd)==HIGH && regimA0 ==1)
{
lcd.print("LED On Auto");
}
else if (digitalRead(RelLdd) == LOW && regimA0 ==1)
{
lcd.print("LED Off Auto");
}
else
{
lcd.print("LED Off Hand");
}

}
else if(regimMenu==3)// меню "3" вывод на экран температуры
{
lcd.setCursor(0,0);
lcd.print("Water t=");
lcd.print(temp1,1);
lcd.setCursor(13,0);
if (digitalRead(TermRel1)==HIGH)
{
lcd.print("*");
}
else
{
lcd.print(" ");
}
lcd.setCursor(0,1);
lcd.print("LED t=");
lcd.print(temp2,1);
lcd.setCursor(13,1);
if(digitalRead(TermRel2)==HIGH)
{

lcd.print("*");
}
else
{
lcd.print(" ");
}
}


//Управление ШИМ
//для выхода 5 (утро и вечер)
long pwm;
if ((UTime<Led1On) || (UTime>=Led1Off + Led1Dur))
{
pwm=PWM_MIN;
}
else if((UTime>=Led1On) && (UTime<(Led1On + Led1Dur)))
{
pwm = ((UTime - Led1On)*(PWM_MAX-PWM_MIN)) / Led1Dur;
}
else if((UTime>=Led1Off) && (UTime<Led1Off + Led1Dur))
{
pwm=((Led1Off + Led1Dur - UTime)*(PWM_MAX-PWM_MIN))/Led1Dur;
}
else
{
pwm=PWM_MAX;
}
analogWrite(Led1, pwm);

//для выхода 6 (день)
if ((UTime<Led2On) || (UTime>=Led2Off + Led2Dur))
{
pwm=PWM_MIN;
}
else if((UTime>=Led2On) && (UTime<(Led2On + Led2Dur)))
{
pwm = ((UTime - Led2On)*(PWM_MAX-PWM_MIN)) / Led2Dur;
}

else if((UTime>=Led2Off) && (UTime<Led2Off + Led2Dur))
{
pwm=((Led2Off + Led2Dur - UTime)*(PWM_MAX-PWM_MIN))/Led2Dur;
}
else
{
pwm=PWM_MAX;
}
analogWrite(Led2, pwm);


}
//*****************************************************
//Функции чтения с датчиков температуры
float getTemp1(){
byte data[12];
byte addr[8];
if ( !ds1.search(addr)) {
//no more sensors on chain, reset search
ds1.reset_search();
return -1001;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {

return -1002;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {

return -1003;
}

ds1.reset();
ds1.select(addr);
ds1.write(0x44,1);

byte present = ds1.reset();
ds1.select(addr);
ds1.write(0xBE);


for (int i = 0; i < 9; i++) {
data[i] = ds1.read();
}

ds1.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;

return Temperature;
}
float getTemp2(){
byte data[12];
byte addr[8];
if ( !ds2.search(addr)) {
//no more sensors on chain, reset search
ds2.reset_search();
return -1001;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {

return -1002;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {

return -1003;
}

ds2.reset();
ds2.select(addr);
ds2.write(0x44,1);

byte present = ds2.reset();
ds2.select(addr);
ds2.write(0xBE);


for (int i = 0; i < 9; i++) {
data[i] = ds2.read();
}

ds2.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float TRead = ((MSB<<8) | LSB);
float Temperature = TRead / 16;

return Temperature;
}
2014-10-16 добавлено 16/10/2014 19:38:16#2008340

Новичок




13
Kazakhstan Kostanay
2 г. назад
Дядька-рыбомор

Добавил фото -где на дисплее видно что при off реле включено.А при On наоборот выключается.Где искать?У меня реле видать отличается от реле (Дядька-рыбомор)?
Как это исправить в коде?
2014-10-16 добавлено 16/10/2014 21:18:58#2008383

Новичок




13
Kazakhstan Kostanay
2 г. назад
Всё разобрался.В реле с нормально-разомкнутых контактов переставил на - нормально-замкнутые контакты.А мучился искал причину несколько дней в скетче.
2014-10-19 добавлено 19/10/2014 13:12:27#2009156

Новичок




13
Kazakhstan Kostanay
2 г. назад
Дядька-рыбомор
Сбивается время на контролёре, после отключения питания, батарейка живая.В чём может быть причина? Подскажите пожалуйста.
2014-10-27 добавлено 27/10/2014 11:16:26#2012006

Новичок




13
Kazakhstan Kostanay
2 г. назад
Выдёргиваю питание из USB, затем жду минуты 3-5, потом вставляю USB, -время показывает то что было 3-5 минут назад.Для чего тогда батарейка?
2014-10-27 добавлено 27/10/2014 12:37:37#2012025

Новичок




13
Kazakhstan Kostanay
2 г. назад
Прочитал внимательно тему уважаемого ZORS и понял свою ошибку.Мне надо было раскомментировать и загрузить а второй раз закомментировать и ещё раз загрузить вот это RTC.adjust(DateTime(__DATE__, __TIME__));
2014-10-27 добавлено 27/10/2014 19:31:20#2012176

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Давненько не был в теме и вообще на форуме, работа замучала. Да и со светильником еще вожусь, пока собрал рабочий макет, времени не хватает.
Полугодовые ходовые испытания показали полную надежность контроллера. Время сильно не убегает, релешки щелкают, светодиоды горят. Несколько изменил скетч,он тут Основное отличие: добавилась функция включения диодов вручную вне зависимости от времени суток, иногда это необходимо, что бы посмотреть, что там в банке делается.
2014-11-06 добавлено 06/11/2014 22:21:28#2015765

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Настало время завершать проект, начатый весной. Мешало отсутствие свободного времени, а то бы закончил все еще летом.
расскажу все по-порядку.
последний вариант скетча выложен здесь. Главное отличие - доработка управления кулерами. Теперь кулер, охлаждающий драйверы, включается одновременно с подачей напряжение на драйверы (раньше включался в зависимости от температуры), а датчик показывает температуру воздуха в комнате.

Изменено 30.11.14 автор Дядька-рыбомор
2014-11-30 добавлено 30/11/2014 20:26:14#2025734

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Теперь перейду непосредственно к светильнику, который должен управляться контроллером. В качестве диодов выбраны Сree XML, 3 штуки нейтральный белый, 8 штук холодный белый, если кому надо бины - поищу. Диоды расположил на радиаторах (купены на развале радиорынка), а радиаторы закрепил на раме из алюминиевого профиля, купленного в кастораме. Это так сказать остов всего светильника.

Питание осуществляется тремя драйверами MW LDD-1000H, отдельно на холодные и нейтральный диоды. Эти драйверы диммируемые. Драйвера расположил в отдельном корпусе, вместе с преобразователем напряжения на микросхеме LM-317 (он нужен для кулеров).

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


Изменено 30.11.14 автор Дядька-рыбомор
2014-11-30 добавлено 30/11/2014 20:51:32#2025749

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Теперь про корпус светильника. Он сделан из фанеры и бруса, а сама рама с радиаторами крепится уже к этому ящику.


Все в сборе: контроллер, драйвера и корпус.

Остался последний штрих: обклеить корпус пленкой под цвет окружающей мебели и поставить на аквариум.

Вот и все. Этот проект завершен. Остались мелкие поправки и доработки.
Но на очереди еще один проект - "iAQUA NANO" для моих наноаквариумов (10 и 20 литров). Этот контроллер планируется однокорпусным (плата ардуино и диммируемый драйвер в одном корпусе) на плате arduino nano. Так что продолжение следует...

Изменено 30.11.14 автор Дядька-рыбомор
2014-11-30 добавлено 30/11/2014 21:10:04#2025772

Новичок




13
Kazakhstan Aktobe
2 г. назад
Молодец. А я всё светильник никак не зделаю.Уже собираю другой контролёр на мега 2560 с цветным дисплеем TFT32.
2014-12-23 добавлено 23/12/2014 23:45:31#2033782

Новичок




13
Kazakhstan Aktobe
2 г. назад
Последний скетч не открывается.
2014-12-23 добавлено 23/12/2014 23:51:13#2033785

Новичок




21 1
Москва
2 г. назад
какова стоимость контроллера?
2015-01-27 добавлено 27/01/2015 11:08:13#2044924

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Сергей.Б

Ссылка пропала Выкладываю еще раз
За 2 месяца аквариум просто зарос и регулярно пропалывается.

Несколько уменьшил максимальное значение PWM_MAX для основного света и назвал его PWM_LOW, чтобы приглушить интенсивность света, а то на анубиасах по краю листа черная бородка пошла. Подобрал интенсивность света просто "на глазок". Динамика растений покажет.



Изменено 3.2.15 автор Дядька-рыбомор
2015-02-03 добавлено 03/02/2015 19:58:52#2047850

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
Не останавливаясь на достигнутом, решил сделать совсем ужо простенький контроллер для нано-аквариумов и обозвал его iAQUA-nano. Умеет-то он немного: только включать/выключать диоды с диммированием (и то одну линейку), работать в ручном и автоматическом режимах, а также служит часами. Делать температурный контроллер я не стал за ненадобностью. Зато поместил все комплектующие на одну плату: Arduino-nano, часики DS3231, релешку с развязкой на n-p-n транзисторе, LED-драйвер и стабилизатор на 5 вольт, зробленный на преобразователе L7805 (для питания самой ардуины). Вся конструкция питается от импульсного ИП на 12 В 30 Вт (какой нашел в хозяйстве).

Плата размером 10*8 см, но можно было еще меньше сделать, достаточно много свободного места на ней неиспользовано.
Плюсы:
1. Все в одном флаконе, т.е. в одной коробке.
2. Часы ds3231 просто сказка, за два месяца не убежали ни на секунду (по крайней мере по данным доступных мне измерений).
3. Ну и вообще - зело просто повторить. Кто читал все мою тему (а также тему уважаемого ZORS'а) - сделают то же самое без труда. Скетч во многом повторяет таковой от предыдущей конструкции, но только очень упрощенный.
Минусы, а как же без них:
1. Больше не буду связываться с L7805, греется, собака!!! Пришлось радиатор нехилый присобачить, что повлияло на выбор размеров корпуса. Субъективно, LM317 греется меньше.
2. Больше не придумал. а они есть
К концу недели "упакую" все это в корпус и покажу.

Изменено 3.2.15 автор Дядька-рыбомор
2015-02-03 добавлено 03/02/2015 21:23:46#2047892

Свой на Aqa.ru




1149 188
Ростов-на-Дону
4 дн. назад
А теперь самое главное! Я тут задумался, а нельзя ли еще более уменьшить в размере и удешивить наши конструкции? А что если вместо ардуины использовать микроконтроллер, к примеру Atmega? Только так, чтобы не изучать тонкости программирования, просто - залил скетч, как в ардуину - и работает. Покопался в инете и вот что нашел.
Оказывается, Ардуину саму можно использовать в качестве программатора для микроконтроллеров через программы Arduino IDE! Может и невелико открытие, но не забываем, что я - чайник и гуманитарий-ботаник, а слова типа "фьюз" или "аппаратное прерывание" вводят меня в кратковременный транс.
Сказано - сделано. Запасся я простенькими контроллерами Atmega8-16PU (один уже спалил), а arduino-nano у меня была. Залил скечт часов на контроллер - и ура! Все работает!
2015-02-03 добавлено 03/02/2015 21:37:39#2047898

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