Pull to refresh

Comments 55

Скажите, пожалуйста, этот аквариумный контроллер разрабатывался «Для себя» или как коммерческий проект?
Просто очень уж подход основательный для личного использования. Если коммерческий — то Возможно ли приобрести готовый контроллер? (в личку, например)
Если «для себя» то была бы интересна короткая статистика по стоимости комплектующих и времезатратам.
Правда радиус кривизны рук все равно не позволит произвести сборку этого чуда :)
Написал вам ответ в личку.
Однако, монументально. А можно фото счастливых «пользователей» устройства?
Стараюсь подходить к решению любого вопроса максимально ответственно!) Возможно не всегда это получается, но все же стараюсь продумывать наперед. Прикрепляю фото обитателей аквариума:

image
Пара десятка неонок, меченосец, петушок...., а сомика вижу. 450л говорите? Я аквариумист чуть больше чем никакой, но знаю точно, что поддерживать экосистему в маленьком аквариуме значительно сложнее чем в большом. Начиная от 160-200 литров для такой мелочи вообще ничего делать не нужно, ни аэрации ни света, разве что испарившуюся воду доливать. Можно даже не кормить.
Или это тестовая группа товарищей?

По существу: получилось красиво. Разве, что резистор МЛТ-1 вызывает когнитивный диссонанс.

Если серьезно:
— расстояние между силовыми дорожками 220V и земляным полигоном недостаточное, а по хорошему надо бы плату прорубить в этом месте
— размещение в крышке — очень сомнительно, ввиду высокой влажности
Какое отношение имеют обитатели аквариума к управляющему контроллеру? Сегодня это маленькие неприхотливые рыбки, завтра — дискусы или другие товарищи. Текущее фото прямого отношения в теме не имеет!) Попросили — я выложил. Кстати, там порядка 100 рыбок, если их не видно фото, это не занчит что их там нет.

По поводу расстояний между силовыми дорожками 220В и земляным полигоном — согласен, что больше расстояние тем лучше. Но и коммутировать кВт нагрузки я им не собирался. Если будет таковая надобность, в следующем устройстве это тоже будет учтено. По поводу влажности — 2 кулера, периодически выгоняющих воздух из крышки, вполне достаточно.
Какое отношение имеют обитатели аквариума к управляющему контроллеру?

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

По поводу влажности — 2 кулера, периодически выгоняющих воздух из крышки, вполне достаточно.

Только время покажет насколько эффективна такая продувка (пыль, зоны застоя). Опять же — шум.
При том, что аквариум такого объема однозначно подразумевает усиленную тумбу (полтонны воды — не шутка) в которой полно места.
Ну это Вы зря так всё упрощаете. Дело далеко не в количестве рыбок. Да и вообще не в рыбках. Контроллер необходим что-бы поддерживать параметры воды. В первую очередь концентрацию СО2. А это в свою очередь завязано на режим освещения и подачу (пусть пока и вручную) удобрений. Без этого не получить красивой растительности.
Бдыщщщь. В точку. Диагноз по интернету. Рыбки живут, а цветочки (растения) дохнут. Давно уже… Если не затруднит ссылок или ключевых слов накидайте. Ну, или в личку, спасибо.
Начать можно с этого: aquascape-promotion.com

Гугл в помощь: [акваскейп, травник, голландский аквариум, PH, CO2, kH, dH, спектр, ватт на литр, питательный грунт, удобрения, макро, микро, калий… ]
Подход определенно заслуживает уважения, мне как любителю «сляпать чо-нть на ардуйне и эпоксидке» даже по-хорошему завидно.
Про рН-метрию можно подробностей?
Более подробная информация есть в «Техническом описании», выложенном на github. Там же приведена схема платы усиления. Для замеров используется самый обычный стеклянный pH-электрод, предназначенный для измерения и контроля уровня концентрации свободных ионов водорода в воде в бытовых и промышленных установках, оснащенный BNC штекером. К примеру электрод-pH E201-C-9. Каллибровка коэффициентов программного обеспечения производится по 2 растворам, чаще всего со значениями 7 и 4 ph.
Что бы не скапливался конденсат в крышке установлено 2 кулера, и организован программный режим продувки. Через заданный интервал времени они включаются и продувают курышку. Как показала практика — этого вполне достаточно даже для высокой температуры воды и большого кол-ва испарений.
>>Стоимость одной платы обошлась мне примерно в 20$.
>>Обработка заказа, изготовление и доставка заняли чуть менее 2 недель.
>>Ни один из отечественных производителей мне такое
>>и близко не смог предложить (в рамках адекватной стоимости).

Ну, не надо обижать отечественных производителей. Вы не там искали.
Для примера, вот только что заказывал изготовление прототипа, 17 февраля сделал заказ, а сегодня — 24 февраля, уже держу их в руках.
Это стандартный срок изготовления — 7 дней, есть быстрее.

По цене, 2 печатные платы размера 150*100 мм, с маской с обеих сторон и со слоем шелкографии с 1 стороны обошлись 3 425 руб 89 копеек.
Качество изготовления очень хорошее, а не как у китайских seeedstudio где слой с шелкографией может гулять…
Поделитесь где нужно искать таких производителей?
Уже пятый год заказываю ПП тут
pselectro.ru/calc/

Это непосредственно завод, они сами производят.
Дорого у них очень. Ну и есть подозрение, что они тоже многое делают в Китае.
Что конкретно у них дорого?
В Китае они ПП точно не делают.
И подготовка и изготовление. Про штучные еще ладно, прототип пофиг сколько стоит, а вот серийно, хотя бы от 600дм получается сильно дороже чем у того же пацифика. Раза так в три. Правда нынешние цены я еще не смотрел.
не, давайте конкретно посчитаем, по параметрам — размер платы, кол-во, маска, шелкография. какая получается разница?
Ну давайте сравним по тем ценам по которым я делал несколько месяцев назад.

Размер платы 18 на 13см. Обрезка фрезеровкой. Класс 4й вроде бы. Впрочем у них такого понятия вообще нет. Видимо идет по наивысшему.

Две стороны, с обеих сторон маска и шелкография. Цвет маски/шелка любой из 5 чтоль вариантов, на стоимость не влияет. Можно партии под настроение делать :)
Всего плат было 243шт. И обошлось мне это в 969usd
Ну вот и выходит, что в PS моя плата станет в 336р, а в Пацифик 239 и это после подорожания бакса, а когда бакс был 30р, то плата выходила вдвое дешевле и в три раза дешевле чем в ПС.
Бакс по 30 рублей — это было аж в 2013 году.

Если у вас в городе есть представительство китайского завода и у них налажена логистика — это понятно, получается дешевле, но возможно по срокам больше.

А для всех остальных регионов, в сегодняшней реальности, большого смысла заказывать мелкосерийные партии в Китае (Пацифик и т.п.) нету. Стоимость доставки разницу снивелируют, плюс большие сроки.
Проще немножко больше заплатить и быть уверенным в отличном качестве и быстром производстве. Нежели сидеть и гадать, как получится по качеству и по срокам.
Тут 2 недели и готово.

В Китае имеет смысл, когда партии идут на тысячи, десятки тысяч.
Ну даже по 60 дешевле выходит :)

Представительство у них в Москве и Екатеринбурге. Доставка до города через ТК и за их счет, таможня их геморрой. Оплата безналом со всеми документами (документов у них пожалуй даже черезчур. Договор, спецификация, акты сверки, акты получения, счета… бюрократы жуткие).

Качество — реально я круче еще не видел. И дороги и маска держатся просто железно и бывало я корпус TQFP48 перепаивал раз по 10 (попалась партия глючных микросхем) и маска и дорожки держались.

Сроки вот да, больше. 4 недели.
В качестве датчика уровня воды я думал использовать трубку стеклянную в аквариуме и датчик абсолютного далвения. Получается очень точно и никакой механики. Им же можно увидеть потерю воды аварийную — скажем, потекло уплотнение.
Сколько не гуглил — не нашел хорошего способа определять содержание нитратов и кислорода в воде. Были случаи, когда ночью отказывала помпа воздушная. Можно поставить датчик потока… но это опять же механика.
Вообще-то в стиральных машинах именно так и измеряется уровень воды в баке.
Заменяем механический прессостат датчиком давления — и да, оно. Только не абсолютное давление нужно, а относительно атмосферного.
А какой датчик давления использовать, так что-бы не боялся влажности? Или сразу использовать в промышленном исполнении.
Двухвходовая MAP, один вход оставляем открытым, а второй силиконовым шлангом от вазов к трубке, стекляной, а лучше нержавеющей. На ней по идее всякое не будет наростать. Влажности они не боятся, главное датчик ставить входами вниз и всё будет хорошо. В машине в коллекторах тоже очень влажно по утрам и всё нормально.

image

cache.freescale.com/files/sensors/doc/data_sheet/MPX5100.pdf
Спасибо, за наводку и саму методику.

Раз уж начал оффтопить. То спрошу, что думаете о насосе омывателя стекол в качестве дозатора УДО?
очень большой пусковой ток. очень большой. и шум сильный. Но 5 литров от Нивы под два насоса очень бюджетно. и обратный клапан обязательно
У меня как раз «вазовский», ток 1,5...2А (пусковой в пике, думаю, и до 10А). Для релюшки фигня, а вот блок питания нужен соответствующий.
Если лить порциями от 100мл, оперируя только временем работы, можно дозировать с точностью ± 10мл.

А главное, что после работы годами с «омывашкой», УДО ему точно не страшны :)
После уже более 10 лет тюнинга авто, поделюсь следующим:
В качестве бака для спирта использовали как раз бачок омывашки, чтобы электронике сильно не мучаться, питание моторов подавали через конденсаторы, так что обходились транзисторами попроще.
Если организовывать слив/подлив воды, лучше брать бесколлекторные насосы, например от мерседеса помпа печки
0 392 023 004
Новая, конечно, стоит много, но их полно на ебеях и разборках. Служат вечно. от Газели не берите -0 рассыпаются мгновенно.

Чтобы омываечной системой точно дозировать подачу спирта воды, лучше делать замкнутую систему с перепускным клапаном, например от той же омывайки, такие много где стоят — например в омывателях фар, чтобыф давление поддерживать. У вас будет постоянное давление, останется лишь тайминги расчитать.
Отказ помпы можно по пузырькам отследить, точнее по их отсутствию. Ловить оптикой.
До кучи не хватает возможности подключения электронной кормушки в которой вечно дохнут батарейки.
Прекрасная реализация. Хотя и немного непонятно, почему Bluetooth модуль некошерным бутербродом приделан, когда под него можно было сделать контакты и напаять на основную плату. Место можно сэкономить за счет вертикального расположения батарейки или ионистора…
Если говорить честно, даже не знаю, почему Bluetooth был реализован отдельным модулем. Почему-то изначально была принята подобная концепция. Хотя, конечно, расположение всех составляющих компонентов предпочтительно на одной плате. Да и свободного места на плате достаточно, — нет нужды ставить что-либо вертикально, нарушая эстетичность вида!) Нужно лишь немного поиграться расположением проводников. Тоже самое я уже осмыслил и на счет усилителя электродов. Будет учтено в будущих конструкциях.
Хотелось бы обсудить контроль целостности данных в EEPROM. На сколько я рассмотрел, «флажок», что данные записались устанавливается самым первым и нет никакой проверки, что содержимое EEPROM соответствует тому, что туда хотели записать. Считаете это лишним?
Извиняюсь заранее, но сложно уследить за всем, что пытаешься реализовать. Спасибо, что обратили внимание — действительно недочет! Хотя на практике работает без сбоев, но все же! В моей прошивке, конечно же, нужно реализовать немного по-другому. Самое простое — выставлять оба флага: и по началу записи данных в EEPROM, и по ее завершению. Если выставлен один из двух флагов — значит запись была прервана, необходимо повторить запись и/или вывести соответствующую индикацию об ошибке. Чуть более сложный вариант — делать несколько флагов, через определенное кол-во ячеек памяти, дабы повысить вероятность проверки целостности данных. Это как вижу я… Если Вы предложите что-то более рациональное — буду весьма благодарен! Что же касается целостности данных в EEPROM — вопрос весьма неоднозначный. За все время эксплуатации контроллеров AVR не встречался с подобным. Единственное, с чем приходилось сталкиваться — это с ошибками записи в первые ячейки памяти EEPROM, вроде как даже в Errata было описано подобное, но ручаться не буду, нужно перепроверить. Если же во время записи данных в EEPROM пропало питающее напряжение, то этот случай можно отследить при помощи стартового и завершающего флагов. Поэтому при соблюдении требований по питанию и помехоподавлению несанкционированных изменений данных в EEPROM быть не должно.
Есть вот такое предложение по организации хранения данных в EEPROM — использовать сочетание кольцевого списка и контрольных сумм. И никаких меток.
Ну, это извечная проблема, на сколько нужно перебдеть :) Как я вижу, в вашей концепции работы с EEPROM просится накрыть всю область какой нибудь CRC16. Считать при записи и писать ее последней. При чтении проверять всю область, и если все ок, то уже читать данные в переменные (если нужно чтобы девайс заработал хотя бы на настройках «по умолчанию») и при этом функция чтения должна возвращать «ок/не ок» в зависимости от этого. А по результату «ок/не ок» уже ветвить программу и выводить предупреждение о порче данных. Как то так.
Я Вас понял. Но можно уточнить, зачем такие повышенные требования к проверке EEPROM? Для какого именно случая? Пропадание питающего напряжения во время записи, или искажение данных с течением времени? За много лет использования ни разу не было подобного случая.
Начну с того, что когда увидел вашу статью мне очень понравилась железная реализация (и подход к разработке). Сам по работе занимаюсь разработкой подобного уровня систем, фирма у нас маленькая, поэтому сам себе и схемотехник, и конструктор, и программист с тестировщиком. Да еще и врожденный перфекционизм зашкаливает :) Поэтому всегда с интересом рассматриваю чужие проекты в надежде перенять интересные подходы к решению каких-то задач. Посмотрев же вашу программу, честно говоря, был разочарован (ожидал гораздо более «качественной» (может с моей точки зрения) реализации).

Например, «режут глаз» конструкции типа «buffer_ds[3]; // время DS1307N (секунды, минуты, часы) ». Программа получается совсем не
читаемой. Почему не применяете структуры? Что-то типа:

struct sDateTime
{
uchar sec;
uchar min;
uchar hour;
uchar wday;
uchar mday;
uchar mon;
uchar year;
uchar timeFlag;
};

sDateTime now, newTime;


GetDateTimeFromRTC(&now);

if (now.sec == 0)
{

}

void SetDateTimeToRTC(const sDateTime * _time)
{
uchar tmp[9];
tmp[0] = CHIP_RTC; // Set TWI RTC address
tmp[1] = 0; // Set «0» addres in RTC
tmp[2] = (_time->sec & 0x7F);
tmp[3] = (_time->min & 0x7F);
tmp[4] = (_time->hour & 0x3F);
tmp[5] = (_time->wday & 0x07);
tmp[6] = (_time->mday & 0x3F);
tmp[7] = (_time->mon & 0x1F);
tmp[8] = _time->year;

TWIWriteBlock(9, tmp);
}


Имхо гораздо более наглядно и читаемо.

Потом еще, например, реализация событий от времени. Как-то у вас замудренно сделано. Не прикидывал, какая точность вам нужна, но например, если достаточно 10 мин, то можно даже обойтись 1-но байтными числами. Считать текущее количество «10-ти минут» с начала суток (максимум это 144). Если значение таймера не используется, ему присваивать 0xFF. Получается линейное представление времени для работы программы, можно сравнивать текущее значение с установленными таймерами и т.п. а для интерфейса уже делать преобразование этого времени в часы и минуты. Соответственно, если нужна большая точность считать количество минут или секунд или долей секунд с начала суток.

К вопросу «повышенных требований к проверке EEPROM» — в вашей реализации вы можете даже не узнать, что какие то данные там «не те». То что все работает, это не аргумент, вы же не пересчитывает минимальные обороту кулера при работе и можете даже никогда не узнать что ни не те, что вы когда-то программировали. Так же не заметил никакого контроля целостности данных через UART. У вас как бы вообще нигде ничего не контролируется, и пока не произойдет достаточно грубый сбой вы можете и не заметить, что на каком-то этапе произошло искажение данных, с которыми работает программа. Я бы сделал как-то так:

// делаем стрктуру с данными для работы
struct sWorkData
{
ulong k1; // коэффициент 1 для каллибровки PH-электрода

uchar cooler_start_pulse[4]; // отсчет интервалов времени для формирования стартовых импульсов кулеров

uint devSetFlags;
//uint crc16; — не участвует в стркуктуре для экономии ОЗУ но есть во флеш
};

// делаем объединение для возможности работы с блоком памяти как с массивом и структурированными данными
union
{
uchar byte[sizeof(sWorkData)];
sWorkData st;
} WorkDatablock;

// когда нужно, например, считать настройки, обращаемся к блоку памяти как к массиву, пример моего кода:
// читаем таблицу размещения настроек режимов всегда по адресу «0»
if (!GetMemBlock((ulong)WORK_MODE_TABLE_START_ADR, (uint)sizeof(sWorkData), WorkDatablock.byte))
{
// ошибка при чтении блока, аварийный выход
LCD_send(0x0E,'r',0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0,0);
return false;
}

// когда нужно работать со структурированными данными:
WorkDatablock.st.k1 = 1000;

if (WorkDatablock.st.cooler_start_pulse[0] > 0)…


bool GetMemBlock(ulong start, uint dataSize, uchar * data)
{
uchar tmpData;
uint s, memCrc, crc = 0xFFFF;

// записываем команду непрерывного чтения
memStart();
SPIRW(0x03); // непрерывное чтение
memSetAdr(start);

for(s = 0; s < dataSize; s++)
{
// читаем байт из флешки
tmpData = SPIRW(0);
data[s] = tmpData;
// считаем crc
crc = crc16update(tmpData, crc);
}

// читаем значение CRC16
memCrc = SPIRW(0);
memCrc |= (SPIRW(0) << 8);

memStop();

// проверяем
if (crc == memCrc)
{
return true;
}
else
{
return false;
}
}


Как с массивом с данными удобно работать при передаче через интерфейсы (сформировал массив, который включает CRC и при передаче уже можно контролировать целостность данных), при чтении/записи EEPROM (организуем цикл от 0 до (sizeof(sWorkData)) считая попутно CRC). А когда данные уже в памяти (и проверенны) — работаем со структурированными данными для облегчения читаемости программы.
Спасибо Вам, за конструктивный подход к диалогу. Сразу оговорюсь, что в плане разработки программного обеспечения есть над чем работать… и при чем усердно!) В плане аппратаной реализации кстати тоже, но там опыта поболее. Да и работаю я, к сожелению, не по специальности, поэтому электроника и программирование вмещаются в промежутки свободного времени.

Структуры стараюсь использовать как можно чаще, но иногда автоматически набиваю куски быдло-кода, а приводить все к «правильному» структурированному виду либо не успеваю, либо просто забываю. Я понимаю, что «правильно» писать код нужно изначально, но все же, не всегда это получается…

По поводу контролля данных — возможно, я просто непридал этому необходимого значения. Данные, которые передаются с программы на ПК в устройство, записываются в буфер, который опять возвращается на ПК и там происходит сравнение отправленных и принятых данных. Возможно, это не лучший вариант реализации. Я думал про CRC16, но видимо желания не хватило довести все до необходимого уровня. Текущие данные, отправляемые на ПК для отображения информации, посчитал излишним контроллировать, т.к. даже если они будут некорректными, то через 3 секунды будет следующий пакет для отображения. Да и более чем для отображения они нигде не фигурируют. Я согласен, что все транзакции, передачи данных в устройстве должны контроллироваться! Все это будет реализовано в последующей доработке ПО.

Сложно самому все предусмотреть и реализовать на достойном уровне. Поэтому я и выложил весь проект с исходниками, и благодарен всем, кто тратит на это свое время.
Очень достойно! Могу придраться только к переходным отверстиям в контактных площадках.
Буду признателен за техническую критику.
А я, собственно, все сказал. Переходные отверстия нельзя располагать в поверхностных контактных площадках, чтобы в них не затекал припой. Особенно важно это при автоматическом монтаже.
Пользуясь случаем спрошу.
У какого конкретно производителя вы заказывали платы? При больших партиях Резонит легко уделывает все китайские сервисы по цене, при достойном качестве.
ADM690 вы используете только как монитор питания или как сторожевой таймер тоже?
Как вы получали такие красивые картинки из P-CAD?
Еще подскажу, что давно уже можно купить специальные логические транзисторы у которых резисторы уже есть внутри. Они отлично подходят для щелканья релюшками. Для мощной нагрузки постоянного тока можно посмотреть в сторону интеллектуальных ключей.
Что касается переходных отверстий, тут я с Вами не согласен. Организация микропереходов на контактных площадках не только увеличивает плотность поверхностного монтажа, но и уменьшает индуктивность соединения, что положительно сказывается на целостности сигнала. Особенно это проявляется в гигагерцовом диапазоне частот. Полное обоснование со всеми вытекающими расчетами можете просмотреть в книжке Л.Н. Кечиева «Проектирование печатных плат для цифровой быстродействующей аппаратуры». Очень хорошая книга, частенько используется как справочная литература в подобного рода расчетах. А для того, чтобы припой не затекал на обратную сторону печатной платы во время монтажа, вы должны это предусмотреть на этапе подготовки платы к производству, — указать, что переходные отверстия так же должны быть покрыты маской.

Производителя узнаю у товарища, через которого заказывал и чуть позднее напишу.
ADM690 работает так же и в режиме сторожевого таймера.
Красивые картинки были получены настройкой цветов в программе и распечатаны через pdfCreator.
Про логические транзисторы слышал, но пока в конструкциях встречал редко. Вещь интересная, возможно в дальнейшем буду их использовать.
Добрый день. С момента запуска не было ни единого сбоя… ни у меня, ни у друзей, ни у повторяющих данный контроллер. Комплектация аквариума так же не менялась. Двух кулеров, включающихся на 5 мин каждый час, оказалось более чем достаточно для уменьшения влажности в крышке. Все работает, а поэтому что-либо менять или дополнять не вижу смысла… все и так устраивает всех!) А заниматься разработкой чего либо просто для того, что бы сделать еще лучше, интереснее и удобнее — просто нет времени! Хотя для меня подобные вещи весьма интересны!
Sign up to leave a comment.

Articles