Хочу поделиться опытом создания устройства, которое было не только интересно реализовать, но и может причинить пользу. Возможно кто-то скажет, что можно было поступить как-то попроще, но это не наш путь…
Началось всё с того, что после ремонта квартиры обнаружилась потенциальная проблема. В случае протечки где либо, добраться до кранов на ввод в квартиру без определенных физический усилий и сноровки не получится, так как люк, закрывающий краны установлен не совсем удачно. Поэтому в случае экстренной необходимости (аварии) перекрыть краны быстро не получится. Нужно что-то было с этим делать, и решение появилось — реализовать возможность дистанционно, т.е. не открывая люк, остановить подачу воды. А в качестве бонуса реализовать и всё остальное, что можно доверить электронике.
Так выглядит устройство.
Основные возможности:
- Самостоятельно перекрыть подачу воды в случае обнаружения ей протечки
- Перекрыть подачу воды «в ручном» режиме — на передней панели для этого имеются «красная кнопка» и двухпозиционный тумблер
- Отображать на собственный дисплей показания приборов учет
- Отображать на дисплей другую полезную информацию
Не может, но в планах:
- Работать от резервного источника питания. Сейчас в случае отключения электроэнергии — устройство бесполезно
- Работать с беспроводными датчиками протечек
- Самостоятельно очищать краны. Чтобы не «закисли», один раз в месяц их желательно открывать/закрывать
- Оповещать о произошедших событиях на смартфон и управляться по «воздуху»
Не может (и как бы не очень нужно):
- Иметь несколько каналов для чтения разных проводных датчиков протечки, сейчас все датчики (5 шт.) подключены параллельно
- По отдельности управлять кранами. Их два (один на горячей, второй на холодной воде), и подключены они параллельно
- Контроль обрыва проводов до датчиков
Далее описание компонентов и их назначение (цены по состоянию на июль 2015 г).
- Шаровой кран с электроприводом 1/2 " DN15 DC5V (модификация CR02, обратите внимание, продавец предлагает несколько вариантов управления) — 3080 руб за пару
- Maple Mini (на борту stm32f103c8t6) микроконтроллер с обвязкой — 233 руб
- SPI TFT LCD дисплей ILI9341 — 302 руб
- модуль Ds3231 + AT24C32 часы реального времени, держатель батарейки, второй чип — 4 Кбайта EEPROM — 38 руб
- ULN2003 DIP-16 — сборка силовых ключей — 123 руб/10 шт (нужна одна)
- Модуль измерения уровня влажности взят из комплекта — 239 руб/10 шт (нужен был один)
- Энкодер для навигации по меню — 164 руб/5 шт (понадобился один)
- Ну и так, по мелочи: провода, корпус (как обычно из распределительной коробки), кнопка, двухпозиционный тумблер, светодиоды
Ещё конечно же понадобился программатор/эмулятор, я использовал вот такой: ARM Emulator,supports ARM7, ARM9, ARM11, Cortex-M3 core, ADS, IAR,STM32,JTAG interface,Double buffered V8 version. Из особенностей можно упомянуть то, что кроме стандартных для SW программирования проводов, пришлось на него подать ещё и текущее напряжение питания с программируемого чипа, 3.3 вольта в моем случае. Нужно для того, чтобы программатор понимал уровни напряжений логических значений. Без этого программируемый чип не хотел определялся. Так же данный программатор имеет возможность питать программируемое устройство, для этого предусмотрен пин, напряжение включается/выключается утилитой JLink.exe.
Подробнее о железе
Микроконтроллер
проект скорее мертв, чем жив
Но ничто не мешает использовать эту плату как «болванку» с любыми другими средствами разработки, было бы чем шить…
Имеет 48 выводов. Ядро работает на 72MHz, имеет интегрированные SRAM — 20Кбайт и Flash — 128Кбайт. Подробнее здесь. Такие параметры определенно подталкивают использовать высокоуровневые средства и инструменты, т.е. это FreeRTOS, графический цветной дисплей, С++ и т.д. (а не два светодиода и ассемблер). В общем ни в чем себе не отказывать… кроме C++, но это не проблема чипа.
Дисплей
За отображение информации отвечает модуль с TFT дисплеем 320х240 точек построенным на совместимом с ILI9341 контроллере, работает по SPI на максимально возможной для данной связки частоте (18MHz). SPI подключен к микроконтроллеру только в одну сторону, вывод для чтения данных из модуля дисплея остался висеть в воздухе, т.к. применение данному функционалу не придумал, зато сэкономил на свободных ножках микроконтроллера. Передача данных работает по DMA.
На модуле с тыльной стороны распаян разъем для подключения SD-карты, работу с SD картой я не тестировал и в данном проекте разъем не участвует.
Модуль RTC и EEPROM
Часы на модуле реализованы чипом DS3231. Особых проблем не вызвал, единственное неудобство, заключалось в том, что все значения (дата, время) хранятся в регистрах в BCD формате, когда два десятичных разряда отражены в одном байте (в старших четырех битах — старший разряд, в младших — младший разряд). Например значение «38 минут» хранится как десятичное значение 56 (это «38» в шестнадцатеричной системе счисления). Можно ли переключиться на бинарный формат, выяснить не удалось.
Модуль имеет свою собственную батарейку, поэтому каждый раз, при потере питания настраивать время и дату не придется. Также на плате модуля распаяна микросхема AT24C32, имеющая аж 32768 бита EEPROM! Проще говоря это 4 Кбайта энергонезависимой памяти. И часы, и память сидят на одной шине I2C. На данный момент память используется только для хранения настроек устройства, текущего значения показаний счетчиков и кое чего ещё. в итоге занято… 25 байт. Позже будет использоваться для ведения логов разных событий, и возможно для ведения статистики расхода (не знаю зачем, зато будет повод запрограммировать отображение графиков).
Кроме контактов шины I2C и питания, на плате присутствуют ещё два. «SQW» — сигнал от будильника, который можно запрограммировать через регистры и «32K» — частота, генерируемая DS3231 для других устройств. В данном проекте не применяются.
Модуль с датчиком уровня влажности
Применяется как буфер между внешним миром и микроконтроллером. Провода, идущие до зондов в сумме, имеют длину около 10 метров, без экрана. Обычные двухжильные телефонные провода. В случае удара статикой, надеюсь умрет только этот модуль, но не микроконтроллер. Умеет измерять сопротивление между двумя электродами и отдавать эту информацию в аналоговом виде (напряжение от 0 до напряжения питания) и в цифровом (0/1, на модуле есть переменный резистор, который можно настроить на границу срабатывания).
С этим модулем были небольшие проблемы. При подаче и снятии питающего напряжения модуль на цифровом выходе сигнализировал о срабатывании, это можно было увидеть и по вспыхивающему на доли секунды светодиоду (на плате модуля, параллельно с цифровым выходом установлен светодиод). Микроконтроллер успевал считывать аномальный сигнал при подаче/сбросе питания системы (проблема №1). Решение было реализовано за счет пропуска коротких импульсов срабатывания, в ожидании зафиксированного на некоторое время состояния.
Переменный резистор имеет очень малый угол регулировки, при котором найти границу между отсутствием ложных срабатываний и хорошей чувствительностью у меня не получилось (проблема №2). Позже было реализовано чтение аналогового сигнала через ADC микроконтроллера. При этом появилась возможность устанавливать границу срабатывания в настройках устройства в виде параметра. Возможность корректировать уровень срабатывания сейчас считаю лишним, и возможно пограничное значение лучше захардкодить.
Был замечен факт, что после нескольких минут работы (прогрев?) модуль вдруг начинал сигнализировать о срабатывании самопроизвольно (проблема №3, да сколько же их?!).
На границе аномальных срабатываний, интенсивность свечения светодиода (на модуле) плавно повышалась или понижалась, как будто управляется от генератора ШИМ, ясно, что это шум и он высокочастотный, то же самое можно было ожидать и на «цифровом» выходе модуля (проблема №4).
Уточню, все эти проблемы устранились, когда было реализовано чтение аналогового сигнала с модуля.
Зонды (части датчиков, которые располагаются непосредственно в местах скопления воды) изготовлены из подручных средств. Это жесть (сталь) и небольшая круглая распределительная коробка, доработанная механическим способом до нужного вида и с припаянными внутри проводами. При попадании воды между парами электродов уменьшается сопротивление и расценивается контроллером как «протечка».
Тестирование в лабораторных условиях показало, что изделие хорошо выполняет свою функцию и не является слабым звеном в системе.
Питание
Вся система работает от зарядки для телефона — 5 вольт, 2А (здесь с запасом). На плате Maple Mini установлен стабилизатор напряжения на 3.3 вольта, напряжение на входе может быть вплоть до 12 вольт, характеристики стабилизатора позволяют, но такое большое напряжение использовать не удобно, об этом ниже.
Со стабилизатор 3.3 вольта также идут на питание модулей RTC, TFT и на модуль измерения уровня влажности. Краны подключены через сборку силовых ключей ULN2003AN, напрямую от блока питания, т.е. работают от 5 вольт, минус падение на ключах. У ULN2003AN используются только два канала из семи.
Конечно желательно заменить блок питания на другой, с напряжением чуть больше, т.к. иногда, при закрытии кранов один из них, при почти крайнем положении из-за срабатывания собственного концевика (в корпусе крана их установлено два штуки, для отработки крайних положений) останавливается на доли секунды, затем происходит «отскок» (за счет люфта в шестеренках редуктора), затем повторная попытка докрутить шаровую задвижку и так повторяется до тех пор пока контроллер не снимет напряжения питания с сервопривода.
У продавца на сайте есть информация, что краны должны работают от 5 вольт, в данном случае напряжение подается меньше. Программно сделано так, что для открытия и закрытия кранов напряжение подается только определенное время (6 секунд), за это время краны должны успеть открыться или закрыться. Стоит заметить, что подобный эффект не влияет на неполное закрытие крана, т.к. этот момент наступает уже после того как кран полностью перекрыл ток воды. Так же можно упомянуть о том, что слишком большое напряжение на сервоприводы (подавал 9 вольт для эксперимента) заставляет их по инерции двигаться дальше (уже после срабатывания концевика) и упираться в крайнее положение с характерным звуком удара.
Шаровые краны с сервоприводом
Запорная арматура выглядит надежной, но электронную часть пришлось доработать.
Если посмотреть на схему управления кранами, то можно заметить, что они управляются положительным напряжением. Общий «минус» и два сигнально-силовых «плюсовых» провода, один для закрытия, другой для открытия. Но ULN2003AN работать в таком режиме не может, в ней при открытии ключа происходит подключение управляемого вывода к «минусу». Решение — сменить полярность управления самого крана. Для этого пришлось поменять местами и сигналы «концевиков», т.к. из-за смены полярности электромотор вращался в другую сторону (по сравнению со стоковой схемой), при этом крайние положения теперь находятся в противоположных сторонах. В итоге имеем кран с общим «плюсом» и двумя управляющими «минусами». То, что нужно!
Краны с сервоприводами в «боевых» условиях.
Показания приборов учета
Конечно, же в самом счетчике не хранятся никакие данный, которые можно было бы считать по двум выведенным из него проводам. Это всего лишь цепь с герконом и магнитом, расположенным на вращающейся шестеренке. Замеры мультиметром не показали наличия каких-либо сопротивлений или электрических емкостей в цепи. В моих счетчиках замыкание (с последующим размыканием) геркона происходит при расходе одного литра воды. Где-то встречалась информация о счетчиках, сигнал с которых формируется каждые 10 литров. Т.е. они бывают разные.
От микроконтроллера требуется считать эти импульсы. Пользовательский интерфейс устройства конечно же предусматривает указать начальные значение.
Из существующих проблем: при отсутствии электроэнергии, расход воды не будет учтен. Аппаратный недочет, нужно исправлять — делать резервное питание на батарейках, это же нужно и для основных функций устройства, иначе перекрыть краны в случае необходимости устройство не сможет.
Отсюда возникают следующие две задачи:
- Снизить уровень потребления во всех режимах работы. Сейчас, например, когда с устройством «не общаются», у дисплея просто отключается подсветка, хотя наверняка есть способ (команды) усыпить/отключить его полностью для снижения потребления. Возможность усыплять микроконтроллер изначально не планировалась, поэтому могут быть проблемы с занятыми в данный момент ногами (чем будем будить), пока плохо себе представляю как правильно «усыплять», в какой режим, чем именно будить (периодически, таймер или событиями с датчиков протечки и счетчиков), причем не забываем, что всё это работает на FreeRTOS.
- Нужно будет реализовать возможность считывать уровень напряжения резервного источника, в случае снижения до определенного уровня напомнить о необходимость заменить их, а в случае критически низкого уровня устройство должно предпринять «последнее действие».
Перекрыть краны?Представьте, забыл поменять батарейки, которые, предположим, приходится менять всего лишь раз в год, 11 часов ночи, тут неожиданно отключили электричество, а «умное» устройство, дабы не допустить потенциальной возможности аварии перекрыло еще и воду, к тому же включить её «вручную» не получится, супер!
Элементы управления
Энкодер
Расположен рядом с дисплеем и предназначен для навигации по меню. Вращение — переход на следующий/предыдущий пункт меню, нажатие — выбор/активация пункта меню.
«Красная кнопка»
Самый простой способ перекрыть краны — нажать красную кнопку. Хотя она не должна пригодиться, т.к. за некоторое время до этого устройство должно было само всё сделать. Но на всякий случай кнопка существует. Повторное нажатие, долгое удержание, двойной клик и т.д. не учитываются, только первое нажатие и всё. Активируется режим «авария», отключить его можно только через специальный пункт меню.
Двухпозиционный тумблер
Им также можно перекрыть краны, но можно и открыть, конечно же если при этом система не находится в режиме «аварии». Может пригодиться для временного отключения водоснабжения.
Трехцветный светодиод
Здесь тоже всё просто. Для индикации текущего режима: зеленый — всё в порядке, красный — не всё в порядке, синий — краны перекрыты при помощи тумблера (см.пункт выше). Смешение цветов не используется, трёх хватило. Но и здесь образовалась проблема. Свечение настолько сильное, что ослепляет, если смотреть на дисплей. 470 Ом на каждый цвет оказалось мало. Исправил программно. Когда дисплей в активном состоянии (а он активен пока пользуешься элементами управление и ещё некоторое время), данный светодиод отключен.
Заключение
Устройство работает, периодическое тестирование показывает, что работает исправно. Не зависает, не глючит. Хотя я знаю, где есть потенциальные, но некритичные ошибки в коде, но об этом не в этой статье.
Исходники, проект Keil uVision 5, файл проекта для STM32CubeMX
Автор: r_a_v