Пользователь
0,0
рейтинг
24 февраля 2015 в 12:29

Реализация универсального аквариумного контроллера из песочницы

image

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

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

Вступительная часть


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

1. Управление 8 каналами (+1 ШИМ канал):
— 4 канала освещения;
— компрессор;
— нагреватель;
— электроклапан системы CO2;
— помпа/электроклапан автодолива;
— кулера 12В (ШИМ).
2. Подключение 3-х температурных датчиков DS18B20.
3. Подключение электродов PH и Redox-потенциала.
4. Подключение датчика уровня воды (аналоговый датчик).
5. В качестве коммутирующего элемента использовать электромеханические реле.
6. Подключение 4-х строчного ЖКИ на контроллере HD44780.
7. Наличие часов реального времени DS1307Z.
8. Связь с ПК организовать 2 способами:
— радиомодуль, использующий Bluetooth HC-05 (основной канал);
— подключение по USB (резервный канал).
9. Номинальная мощность коммутируемой нагрузки 650 Вт.
10. Наличие электрических фильтров питающих напряжений и защитных элементов основных цепей устройства.
11. Промаркировать все разъемы и выводы подключений.
Возможности программного обеспечения для ПК:
— ручной режим управления нагрузкой;
— 4 автоматических режима (температурный режим, режим PH/CO2, режим вентиляции крышки, режим автодолива воды);
— использование 3-х таймеров на каждый канал, с возможностью по секундной установки интервалов;
— калибровка электродов;
— ограничивающие временные интервалы подсветки ЖКИ, работы кулеров и системы СО2;
— запись данных в энергонезависимую память контроллера и всевозможная индикация текущих параметров системы.

С некоторыми поправками данный функционал может быть отнесен к категории универсальных устройств. Это конечно не совсем корректно, т.к. аквариумные контроллеры можно разделить на 2 подгруппы – для пресноводных и морских обитателей. Различаются в данном случае и режимы освещения, и наличие различных электродов, определяющих параметры воды, и программные режимы, стабилизирующие эти параметры, и др. Аппаратная составляющая аквариумов так же весьма отличается. Освещение может быть организовано люминесцентными лампами, а могут быть использованы светодиоды или светодиодные ленты. IMHO – использование светодиодов более привлекательный подход, как с точки зрения получения необходимого спектрального состава, так и при организации управляющих режимов. Однако, использование качественных комплектующих, стабилизаторов тока, источников питания и вопрос отвода тепла делает этот подход более дорогостоящим. Ввиду чего, большое количество аквариумистов все еще использует люминесцентное освещение, и менять его пока не собираются. Различий может быть великое множество, ибо готовые решения приобретаются крайне редко, и большая часть аквариумов собраны под индивидуальные вкусы их владельцев. В данном случае рассматривались 3 аквариума, и были объединены/усреднены требования по оным. В итоге, получилась система для пресноводного аквариума (либо травника), с люминесцентным освещением, объемом до 500 л., автономным режимом работы, выводом необходимой информации на ЖКИ и подключением к ПК для конфигурации.

Аппаратная реализация


Исходя из личного опыта, опыта других разработчиков и вредности своего IMHO – конструкции типа «бутерброд», построенных на базе Arduino и иже с ним, стараюсь не использовать. Вообще и никогда. Это же касается и программного обеспечения (низкого или высокого уровня). Исключения составляют внешние библиотеки, собственноручно переработанные и прошедшие не одну сотню часов тестирования. Ну и разумеется стандартные либы, блокнот, компилятор, программатор/отладчик и осциллограф.

Аппаратная часть основана на микроконтроллере фирмы Atmel — ATmega32A, работающего от внешнего кварцевого резонатора 11.0592 MHz. Выбор обоснован наличием большого кол-ва флеш- и оперативной памяти, необходимым кол-вом выводов, дабы не чувствовать себя стесненным в средствах (в итоге было использовано ~80% ресурсов МК). Коммутация нагрузки реализована посредством электромеханического реле. В устройстве использовались реле герметичного исполнения фирмы OMRON, серия – G5LA. Получение текущего времени организовано посредством микросхемы DS1307Z + прецизионный термостабильный резонатор, заблаговременно снятый со швейцарского промышленного оборудования. Выбор был обусловлен наличием этой микросхемы и качественного резонатора. В другом случае предпочтительно использовать DS3231. Для управления кулерами используется ШИМ-сигнал. В качестве ключевого элемента используется полевой транзистор LR3714Z. Для вывода данных на ЖКИ используется 4-х битная шина, для коммутации подсветки используется транзистор FMMT717TA. Связь с ПК организована посредством радиоканала (RS232-Bluetooth HC05), либо преобразователя RS232-USB CP2102. Скорость передачи данных 9600 kbit/s. Фильтрация сетевого напряжения рассчитана на номинальную мощность ~650 Вт. Терминирование температурных датчиков DS18B20 необходимо производить в непосредственной близости от датчика. Для повышения надежности устройства использовался внешний супервайзер ADM690ANZ, отслеживающий тактирование МК и уровень питающего напряжения. Радиоканал реализован отдельным модулем, подключаемым на плату контроллера через 4 пиновый разъем. Присутствует всевозможная индикация (активность каналов, наличие питающих напряжений, тактирование МК, передача пакета данных).

Хотелось бы, конечно, использовать Wi-Fi подключение, с HTTP сервером. Но для этого необходимо иметь в распоряжении Ethernet MAC модуль, что тянет за собой также необходимость и DMA интерфейса, — а это уже задача не для AVR. Да и стоимость адекватного Wi-Fi модуля довольно высока. Не будем рассматривать цепочку из нескольких плат (об этом я писал вначале параграфа), или же дешевых китайских модулей, способных на все, но при этом отваливающихся каждые полчаса. И с ARM7TDMI на более свежую архитектуру все никак не осилю себя перейти. Да и смысл использовать ARM для такой задачи, где с лихвой хватает AVR. Только для Ethernet/Wi-Fi — не вижу смысла. В общем, это уже задача другого уровня. Для текущего автономного контроллера было принято решение ограничиться USB/Bluetooth и внешним супервайзером.

Для разработки устройства использовался программный продукт P-CAD 2006 SP2. Ниже приведена принципиальная схема устройства (кликабельно):
image
Печатная плата устройства была разработана под SMD-монтаж. Класс точности – 4. Используются корпуса TQFP44, QFN28, SOT23, TAN-A, TAN-B, SMA, 0805, 0603 и др. Плата имеет двухстороннюю реализацию. Общий вид печатной платы устройства приведен ниже (кликабельно):
image
Изготовление печатной платы было доверено китайским специалистам, ибо качество местных изготовителей оставляет желать лучшего. Какая именно фирма занималась производством платы уже сказать не смогу, т.к. заказывал я ее через товарища, к которому я просто «упал на хвост» во время его заказа, и отправил ему все необходимые файлы. Качеством «поднебесной» я был весьма впечатлен. Стоимость одной платы обошлась мне примерно в 20$. Так же очень порадовал предоставляемый сервис. Стоимость платы зависела от ее класса точности, размеров, и прочих заданных требований. В течение одного рабочего дня мой заказ был обработан, рассчитан и указана точная дата прибытия в мой город. В тот же день средства были уже переведены на их счет. И именно в указанный день мне пришло сообщение о доставки моей посылки. Обработка заказа, изготовление и доставка заняли чуть менее 2 недель. Ни один из отечественных производителей мне такое и близко не смог предложить (в рамках адекватной стоимости). Ниже приведено фото одной из полученных плат:

image

После напайки всех компонентов, прочистки ультразвуком от флюса и прошивки контроллера устройство приобрело следующий вид:

image

Для установки супервайзера предусмотрена 8-пиновая панелька. ADM690ANZ весьма чувствителен к флуктуациям питающего напряжения, и если у вас нет возможности установить качественный стабилизированный источник питания на 5В – лучше супервайзер не использовать. Иначе получите больше проблем, нежели пользы от его использования. Для переключения между USB и Bluetooth используется соответствующая перемычка.

image

Изначально, устройство планировалось устанавливать в крышку аквариума. Поэтому организация корпуса не предусмотрена. Однако, в дальнейшем, возможно, надобность в оном появится. Для отображения информации использовался 4-х строчный ЖКИ WH2004L-TMI-CTW, устанавливаемый на переднюю часть алюминиевой крышки. Во избежание наводок на индикатор, во время коммутации силовой нагрузки, сам индикатор необходимо изолировать от соприкасающихся металлических частей крышки, а шлейф, идущий от контроллера к экрану, — экранировать.

image

Ну и в завершении описания аппаратной составляющей ниже представлена фотография крышки аквариума. В ней установлен сам контроллер с ЖКИ, источник бесперебойного питания на 5В с аккумулятором, импульсный источник питания на 12В, 6 ЭПРА, плата усилителя для PH-электрода (основана на CA3140E), 2 80мм кулера и разъем для сетевого питания с простеньким входным фильтром.

image

Реализация связи с устройством


Основным каналом связи предусмотрен радиоканал Bluetooth (HC-05), USB-подключение – резервное. Устройство не имеет гальванической развязки между микроконтроллером и преобразователем уровней CP2102 (USART-USB). При подключении посредством USB необходимо убедиться, что источник электропитания, используемый для получения +5В, и питающее напряжение ПК включены в один узел электросети (розетку). В ином случае возможна некорректная работа устройства, выход из строя определенных элементов конструкции. Ниже приведена схема и печатная плата радиомодуля:

image

Программная реализация


Программное обеспечение состоит из 2 частей – низкого уровня (прошивка) и высокого уровня (программа для ПК). Для разработки низкоуровневой части использовался программный продукт WinAVR, версия компилятора GCC 4.3.3. Для организации управляющих подпрограмм был реализован диспетчера задач, основанный на автомате флагов. Было выделено несколько временных интервалов: 1 — 41ms, 2 — 167ms, 3 — 333ms, 4 — 1.34s, 5 — 2.67s, 6 — 10.6s. В первом временном интервале реализовано построчное отображение информации на ЖКИ. Во втором — опрос температурных датчиков (~ раз в 3 секунды), получение текущего времени, опрос АЦП и расчет значений электродов, с учетом калибровочных коэффициентов. В третьем временном интервале реализованы основные управляющие функции контроллера:

— обработка данных входящих пакетов;
— преобразование текущего времени в числовое значение (для удобства все временные значения в программе представлены в числовом виде HHMMSS);
— управление заданными каналами, в соответствии с выбранными режимами работы (раз в секунду);
— управление каналом PWM;
— обработка данных управляющих режимов (температурный режим, режим PH/CO2, режим вентиляции крышки, режим автодолива воды);
— установка ограничений временных интервалов (подсветка ЖКИ, работа кулеров и системы CO2);
— запись данных в EEPROM;
— анализ текущего состояния каждого из каналов, выбранных режимов с соответствующей индикацией;

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

Проект состоит из нескольких файлов: main.c, hd44780.h, i2c.h, USART.h, Functions.h, ds18b20.c, delay.h, crc8.c. Библиотеки для работы с шиной 1-Wire были позаимствованы с открытого проекта на одном из немецких сайтов и переработаны под собственные нужды (убраны неиспользуемые функции и добавлено указание используемого порта и вывода МК для соответствующего датчика). Все остальные либы написаны с чистого листа.

Для отладки низкоуровневого программного обеспечения использовалось компьютерное моделирование устройства, посредством программного пакета Proteus 7.7 SP2. Ниже приведена собранная схема устройства:

image

Для разработки программного обеспечения высокого уровня использовался программный продукт Microsoft Visual Studio 2007. Основные возможности ПО представлены 4-мя закладками: отображение информации, режимы/события, ежедневные таймеры, калибровка электродов. Данные обновляются раз в 3 секунды. Для передачи данных используется метод транзакций. ПО отправляет пакет данных устройству, которое в свою очередь, после получения, отправляет принятый пакет обратно на ПК. Если отправленный и принятый пакеты совпадают — транзакция прошла успешно. Если же данные различаются, то текущий пакет данных отправляется заново. При многократном не совпадении отправленного и принятого пакета данных отображается ошибка соединения с устройством. Для передачи данных использовался строковый тип, что позволяет безошибочно определить начало/конец пакета, его тип и сами данные. Ниже представлен интерфейс программного обеспечения для ПК:

image

Полное описание работы программного обеспечения AquaController 2014 находится в справочных материалах, доступных через меню Помощь/Справка. Детальное описание устройства находится в файле «Техническое описание».

Примерная стоимость устройства, учитывая доставку комплектующих, ~100$

Это первая реализация проекта аквариумного контроллера. За более чем полгода не выявлено ни единого сбоя в его работе. Некоторые конструктивные и программные недочеты все же имеются, но этого пока недостаточно, для разработки следующего прототипа.

С учетом эксплуатации текущего контроллера, перечень того, что может быть дополнительно воплощено в последующем устройстве:

— аппаратная реализация на ARM Cortex;
— связь по Ethernet/Wi-Fi с организацией HTTP-сервера;
— наличие внешней клавиатуры для аварийного отключения или активации управляемых каналов;
— интеграция усилителя для PH и Redox электродов на плату контроллера;
— наличие управляемых каналов для светодиодной подсветки;
— управление дополнительными агрегатами (автокормушкой, системой подачи удобрения и прочее);
— увеличена номинальная мощность нагрузки;
— замена DS1307 на DS3231;
— возможность установки в один из стандартных корпусов.

Но пока это всего лишь планы на будущее, так как данный контроллер полностью удовлетворяет требованиям моего текущего аквариума.

Ниже загружена на github необходимая документация, программное обеспечение и исходники программ: Акваконтроллер 2014

Спасибо за внимание.
@Stan88
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (55)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        image

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

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

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

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

            Например, «режут глаз» конструкции типа «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). А когда данные уже в памяти (и проверенны) — работаем со структурированными данными для облегчения читаемости программы.
            • 0
              Спасибо Вам, за конструктивный подход к диалогу. Сразу оговорюсь, что в плане разработки программного обеспечения есть над чем работать… и при чем усердно!) В плане аппратаной реализации кстати тоже, но там опыта поболее. Да и работаю я, к сожелению, не по специальности, поэтому электроника и программирование вмещаются в промежутки свободного времени.

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

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

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

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

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.