Контроллер водопровода
За основу буду брать систему защиты от протечки для стиральной машины.
Задачи модуля:
- перекрытие подачи воды по команде;
- защита от протечки: перекрыть ввод и полотенцесушитель в случае срабатывания датчиков;
- переключение источника горячей воды: центральное водоснабжение или водонагреватель;
- учет расхода воды;
- опционально: контроль за температурой воды и давлением.
Характеристики:
- Количество управляемых вентилей: 6
- 2шт - ввод холодной и горячей воды;
- 2шт - вход и выход водонагревателя;
- 2шт - полотенцесушитель.
- Количество входов для датчиков протечки: 4
- Дополнительные датчики:
- Количество входов для счетчиков расхода воды: 2
- Количество входов для датчиков температуры: 2
- Количество входов для датчиков давления: 2
- Автономное питание от батареи в случае отключения электричества.
Структурная схема
Структурно, устройство состоит из 3-х модулей:
- основной модуль, который: управляет вентилями, следит за протечками, общается с Mеsh сетью через коммуникационный модуль и к которому подключаются остальные модули;
- модуль управления и индикации с LCD/LED дисплеем;
- модуль сенсоров, который обслуживает дополнительные сенсоры: счетчики расхода, датчики температуры и датчики давления.
На самом деле, отдельный модуль сенсоров не нужен, но из-за ограничения размеров корпуса, все необходимые разъемы не помещаются в один ряд, поэтому их нужно размещать в два этажа отдельными платами. Поэтому, конструктивно удобнее разместить на второй плате контроллер и передавать данные со счетчиков по SPI интерфейсу. Одновременно, на модуле сенсоров будет размещена EEPROM для хранения значения счетчиков.
Необходимое количество GPIO портов
| Назначение | Выводов на единицу | Кол-во кдиниц | Общее кол-во |
| модуль управления (ATmega8515) |
| светодиоды двухцветные | 2 | 11 | 22 |
| светодиоды одноцветные | 1 | 2 | 2 |
| кнопки | 1 | 2 | 2 |
| энкодер | 3 | 1 | 3 |
| SPI | 4 | 1 | 4 |
| итого | 33 |
| модуль сенсоров (ATmega1284P) |
| счетчики расхода (INT) | 1 | 2 | 2 |
| датчики температуры | 1 | 2 | 2 |
| датчики давления (АЦП) | 1 | 2 | 2 |
| EEPROM (I2C) | 2 | 1 | 2 |
| SPI | 5 | 1 | 5 |
| итого | 13 |
| главный контроллер |
| вентили | 4 | 6 | 24 |
| датчики протечки | 2 | 4 | 8 |
| модуль управления (SPI) | 1 | 1 | 1 |
| LCD/LED дисплей | 7 | 1 | 7 |
| модуль сенсоров (SPI) | 2 | 1 | 2 |
| SPI | 3 | 1 | 3 |
| BLE Mesh модуль (RS232) | 2 | 1 | 4 |
| контроллер питания | 4 | 1 | 4 |
| итого | ?? |
Выбор микроконтроллеров
- Главный контроллер: ATmega2560-16A
- Модуль управления: ATmega8515 (*)
- Модуль сенсоров: ATmega1284P (**)
* Atmega8515 не имеет контроллера I2C, поэтому для связи будет использована шина SPI.
** ATmega1284P имеет контроллер I2C, но для унификации с модулем управления, также будет использована шина SPI, но с дополнительным выходом прерывания
Конфигурация узлов и моделей BLE Mesh
Чем мы хотим управлять и что хотим контролировать.
Управлять, разумеется, мы может только вентилями. Для этого подойдет простой On/Off сервер. Но существует ряд ограничений:
- В случае протечки (аварии), все вентили закрываются. Открыть их потом с помощью команды BLE Mesh будет нельзя.
- Существуют запрещенные комбинации открытия вентилей (TODO: расписать эти комбинации), которые нельзя будет настроить с помощью BLE Mesh.
TODO: предусмотреть возможность отключения датчиков протечки.
Для датчиков протечки можно сделать отдельную ноду с моделями серверов: OnOff и Sensor.
Контролировать нужно будет следующие параметры:
- неисправность вентилей (вентиль не открылся/закрылся за определенное время) - 6шт;
- состояние датчиков протечки: нормально, авария, неисправность - 4шт;
- значения счетчиков расхода воды: текущий расход (л/с), общее потребление (M3) - 2шт.
Всвязи с этим появляются следующие проблемы:
- Вентили, счетчики и датчики протечки практически никак друг с другом не связаны логически. Разве что, счетчики воды можно совместить с первыми двумя вентилями (вентили ввода). Датчики же вообще никак не связаны ни с вентилями, ни со счетчиками. Поскольку, одинаковые модели не должны располагаться на одном узле, нам придется, либо создавать 12 от дельных узлов, либо группировать модели сенсоров с моделями OnOff как получится, и ограничется 6-ю узлами.
- В стандартах GATT Specification отсуствуют такие параметры, как: неисправность вентиля, состояние датчика протечки, расход и потребление жидкостей (TODO: хотя, два последних еще могут быть). Поэтому, придется колхозить свои кастомные значения и отходить от спецификации. Хотя, состояние несиправности вентилей и датчиков протечки можно будет попробовать запихнуть в модель Health.
Модуль индикации и управления
Состоит из трех частей: алфавитно-цифрового LED дисплея (одна строка, 20 символов), дополнительного модуля светодиодной индикации и модуля управления с энкодером и тремя кнопками: Select, Ок и Cancel.
Элементы управления и индикации
- Алфавитно-цифровой индикатор. Отображает элементы меню и различную информацию.
- Индикаторы состояния вентилей.
Красный - вентиль закрыт.
Мигающий красный - вентиль в процессе закрывания.
Зеленый - вентиль открыт.
Мигающий зеленый - вентиль в процессе открывания.
Мигающий попеременно красный и зеленый - неисправность вентиля.
- Индикаторы датчиков протечки.
- Индикаторы счетчиков расхода.
- Индикатор состояния питания.
- Кнопка "Ок".
- Кнопка "Cancel".
- Ручка энкодера и кнопка "Select".
Меню настройки и управления
Структура
- Главный экран
- Управление
- Открыть/Закрыть/Авто для каждого вентиля
- Включить/Выключить датчик протечки
- Включить/Выключить датчик расхода
- Включить/Выключить датчик температуры
- Включить/Выключить датчик давления
- Опросить шину 1-WIRE на наличие датчиков температуры -
- Информация
- Текущие значения счетчиков расхода
- Значения датчиков температуры
- Значения датчиков давления
- Заряд батареи
- Статус подключения к Mesh сети: подключено/не подключено, адрес узла
- Версия прошивки
- Настройка
- Группы вентилей
- Тип вентиля: двух/пяти проводные
- Задержка срабатывания датчиков протечки
- Калибровка счетчиков расхода: кол-во литров на один импульс
- Текущее значение счетчиков расхода
- Соответствие кода ROM датчика DS18B20 с каналом температуры
- Калибровка датчиков давления
Информация на главном экране
- Загрузка
- Приветственное сообщение: "Plumbing Cоntroller"
- Установка вентилей в закрытое состояние
- Тестирование датчиков протечки
- Количество обнаруженных датчиков температуры
- Основное состояние
- дисплей выключен
- обнаружен/потерян датчик температуры
- работа от батареи - остаточный заряд батареи
- Переключение групп вентилей
- Цель переключения, прогресс
- Авария от датчиков протечки
- Датчик протечки неисправен: просто сообщение о неисправности, подробности - на дополнительном дисплее
- Сработал датчик протечки
- Таймер до перехода в аварийный режим
- Сообщение о том, что устройство находится в аварийном режиме
Модуль сенсоров
EEPROM счетчиков
EEPROM счетчиков расположен на отдельной микросхеме 24C02, которую должно быть легко заменить в случае выхода ее из строя. Он имеет емкость 256 байт и должен хранить текущие значения двух счетчиков расхода воды. Поскольку, обновлять значения счетчиков необходимо на каждый импульс, а ресурс EEPROM ограничен, нужен некий трюк, чтобы этот ресурс увеличить. Предлагается разбить весь EEPROM на 16 блоков по 16 байт в каждом и записывать значения в эти блоки циклически. Чтобы модуль мог определить, какой блок записывался последним, то в сам блок нужно добавить счетчик, который бы увеличивался при каждой записи. Таким образом, блок, у которого это поле будет наибольшим и будет последним. Этим самым, мы увеличим ресурс EEPROM в 16 раз.
Предлагается следующая структура блока:
#define EEPROM_SIGN 0xA500
typedef struct {
uint16_t sign;
uint16_t cnt;
uint32_t val_fs1;
uint32_t val_fs2;
uint8_t rsvd0;
uint8_t rsvd1;
uint8_t rsvd2;
uint8_t rsvd3;
} eeprom_block;
Поле sign должно быть равно: EEPROM_SIGN + block_index, где: block_index - это порядковый номер блока, определяющий его положение в адресном пространстве EEPROM. Таким образом, каждый блок имеет уникальный идентификатор, который показывает, что он инициализирован и его поля имеют валидные значения.
Хранимые параметры
Параметры настройки модуля хранятся во внутреннем EEPROM микроконтроллера, так как изменяются не часто и быстрая деградация ему не грозит.
- калибровка счетчиков расхода: кол-во литров на один импульс (на каждый счетчик)
- калибровка датчиков давления:
- напряжение, соответствующее нулевому давлению
- давление, соответствующее максимальному напряжению 5В
- соответствие кода ROM DS18B20 с каналом температуры (на каждый канал)
SPI интерфейс
Карта памяти
Все значения хранятся в формате Little Endian.
| Адрес | Размер | Тип | Описание | Знач. по умолчанию |
| 00 | 1 | R | Статутс прерывания | 0 |
| 01 | 4 | RW | Flow Sensor 1 - текущее значение | 0 |
| | 1 | RW | Flow Sensor 1 - счет запрещен/разрешен | 1 |
| | 4 | RW | Flow Sensor 2 - текущее значение | 0 |
| | 1 | RW | Flow Sensor 2 - счет запрещен/разрешен | 1 |
| | 2 | R | Temperature Sensor 1 - текущее значение | 0 |
| | 8 | RW | Temperature Sensor 1 - 1-Wire ROM | 0x0000000000000000 |
| | 1 | RW | Temperature Sensor 1 - запрещен/разрешен | 1 |
| | 2 | RW | Temperature Sensor 1 - период обновления, мс | 1000 |
| | 2 | R | Temperature Sensor 2 - текущее значение | 0 |
| | 8 | RW | Temperature Sensor 2 - 1-Wire ROM | 0x0000000000000000 |
| | 1 | RW | Temperature Sensor 2 - запрещен/разрешен | 1 |
| | 2 | RW | Temperature Sensor 2 - период обновления, мс | 1000 |
| | 1 | R | Pressure Sensor 1 - текущее значение | 0 |
| | 1 | RW | Pressure Sensor 1 - запрещен/разрешен | 1 |
| | 2 | RW | Pressure Sensor 1 - период обновления, мс | 1000 |
| | 2 | RW | Pressure Sensor 1 - V0 | 0 |
| | 1 | RW | Pressure Sensor 1 - PMAX | 10 |
| | 1 | R | Pressure Sensor 2 - текущее значение | 0 |
| | 1 | RW | Pressure Sensor 2 - запрещен/разрешен | 1 |
| | 2 | RW | Pressure Sensor 2 - период обновления, мс | 1000 |
| | 2 | RW | Pressure Sensor 2 - V0 | 0 |
| | 1 | RW | Pressure Sensor 2 - PMAX | 10 |
| | 8 | R | 1-Wire Device 1 ROM | 0x0000000000000000 |
| | 8 | R | 1-Wire Device 2 ROM | 0x0000000000000000 |
Статус прерывания
Флаговый регистр "Статус прерывания" показывает причину, по которой была поднята линия прерывания.
| Бит | Описание |
| 7 | - |
| 6 | Обновился список 1-Wire устройств |
| 5 | Изменилось значение Pressure Sensor 2 |
| 4 | Изменилось значение Pressure Sensor 1 |
| 3 | Изменилось значение Temperature Sensor 2 |
| 2 | Изменилось значение Temperature Sensor 1 |
| 1 | Изменилось значение Flow Sensor 2 |
| 0 | Изменилось значение Flow Sensor 1 |
Ссылки