Recent Changes - Search:

Главная страница

Проекты

Статьи

Домашний WiFi роутер

Архив проектов

Загрузки

GitHub

SourceForge

edit SideBar

PlumbingController

Контроллер водопровода

За основу буду брать систему защиты от протечки для стиральной машины.

Задачи модуля:

  • перекрытие подачи воды по команде;
  • защита от протечки: перекрыть ввод и полотенцесушитель в случае срабатывания датчиков;
  • переключение источника горячей воды: центральное водоснабжение или водонагреватель;
  • учет расхода воды;
  • опционально: контроль за температурой воды и давлением.

Характеристики:

  • Количество управляемых вентилей: 6
    • 2шт - ввод холодной и горячей воды;
    • 2шт - вход и выход водонагревателя;
    • 2шт - полотенцесушитель.
  • Количество входов для датчиков протечки: 4
  • Дополнительные датчики:
    • Количество входов для счетчиков расхода воды: 2
    • Количество входов для датчиков температуры: 2
    • Количество входов для датчиков давления: 2
  • Автономное питание от батареи в случае отключения электричества.

Структурная схема

Структурно, устройство состоит из 3-х модулей:

  • основной модуль, который: управляет вентилями, следит за протечками, общается с Mеsh сетью через коммуникационный модуль и к которому подключаются остальные модули;
  • модуль управления и индикации с LCD/LED дисплеем;
  • модуль сенсоров, который обслуживает дополнительные сенсоры: счетчики расхода, датчики температуры и датчики давления.

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

Необходимое количество GPIO портов

НазначениеВыводов на единицуКол-во кдиницОбщее кол-во
модуль управления (ATmega8515)
светодиоды двухцветные21122
светодиоды одноцветные122
кнопки122
энкодер313
SPI414
итого33
модуль сенсоров (ATmega1284P)
счетчики расхода (INT)122
датчики температуры122
датчики давления (АЦП)122
EEPROM (I2C)212
SPI515
итого13
главный контроллер
вентили4624
датчики протечки248
модуль управления (SPI)111
LCD/LED дисплей717
модуль сенсоров (SPI)212
SPI313
BLE Mesh модуль (RS232)214
контроллер питания414
итого??

Выбор микроконтроллеров

  • Главный контроллер: ATmega2560-16A
  • Модуль управления: ATmega8515 (*)
  • Модуль сенсоров: ATmega1284P (**)

* Atmega8515 не имеет контроллера I2C, поэтому для связи будет использована шина SPI.
** ATmega1284P имеет контроллер I2C, но для унификации с модулем управления, также будет использована шина SPI, но с дополнительным выходом прерывания

Конфигурация узлов и моделей BLE Mesh

Чем мы хотим управлять и что хотим контролировать.

Управлять, разумеется, мы может только вентилями. Для этого подойдет простой On/Off сервер. Но существует ряд ограничений:

  1. В случае протечки (аварии), все вентили закрываются. Открыть их потом с помощью команды BLE Mesh будет нельзя.
  2. Существуют запрещенные комбинации открытия вентилей (TODO: расписать эти комбинации), которые нельзя будет настроить с помощью BLE Mesh.

TODO: предусмотреть возможность отключения датчиков протечки.
Для датчиков протечки можно сделать отдельную ноду с моделями серверов: OnOff и Sensor.

Контролировать нужно будет следующие параметры:

  • неисправность вентилей (вентиль не открылся/закрылся за определенное время) - 6шт;
  • состояние датчиков протечки: нормально, авария, неисправность - 4шт;
  • значения счетчиков расхода воды: текущий расход (л/с), общее потребление (M3) - 2шт.

Всвязи с этим появляются следующие проблемы:

  1. Вентили, счетчики и датчики протечки практически никак друг с другом не связаны логически. Разве что, счетчики воды можно совместить с первыми двумя вентилями (вентили ввода). Датчики же вообще никак не связаны ни с вентилями, ни со счетчиками. Поскольку, одинаковые модели не должны располагаться на одном узле, нам придется, либо создавать 12 от дельных узлов, либо группировать модели сенсоров с моделями OnOff как получится, и ограничется 6-ю узлами.
  2. В стандартах GATT Specification отсуствуют такие параметры, как: неисправность вентиля, состояние датчика протечки, расход и потребление жидкостей (TODO: хотя, два последних еще могут быть). Поэтому, придется колхозить свои кастомные значения и отходить от спецификации. Хотя, состояние несиправности вентилей и датчиков протечки можно будет попробовать запихнуть в модель Health.

Модуль индикации и управления

Состоит из трех частей: алфавитно-цифрового LED дисплея (одна строка, 20 символов), дополнительного модуля светодиодной индикации и модуля управления с энкодером и тремя кнопками: Select, Ок и Cancel.

Элементы управления и индикации

  1. Алфавитно-цифровой индикатор. Отображает элементы меню и различную информацию.
  2. Индикаторы состояния вентилей.
    Красный - вентиль закрыт.
    Мигающий красный - вентиль в процессе закрывания.
    Зеленый - вентиль открыт.
    Мигающий зеленый - вентиль в процессе открывания.
    Мигающий попеременно красный и зеленый - неисправность вентиля.
  3. Индикаторы датчиков протечки.
  4. Индикаторы счетчиков расхода.
  5. Индикатор состояния питания.
  6. Кнопка "Ок".
  7. Кнопка "Cancel".
  8. Ручка энкодера и кнопка "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.

АдресРазмерТипОписаниеЗнач. по умолчанию
001RСтатутс прерывания0
014RWFlow Sensor 1 - текущее значение0
 1RWFlow Sensor 1 - счет запрещен/разрешен1
 4RWFlow Sensor 2 - текущее значение0
 1RWFlow Sensor 2 - счет запрещен/разрешен1
 2RTemperature Sensor 1 - текущее значение0
 8RWTemperature Sensor 1 - 1-Wire ROM0x0000000000000000
 1RWTemperature Sensor 1 - запрещен/разрешен1
 2RWTemperature Sensor 1 - период обновления, мс1000
 2RTemperature Sensor 2 - текущее значение0
 8RWTemperature Sensor 2 - 1-Wire ROM0x0000000000000000
 1RWTemperature Sensor 2 - запрещен/разрешен1
 2RWTemperature Sensor 2 - период обновления, мс1000
 1RPressure Sensor 1 - текущее значение0
 1RWPressure Sensor 1 - запрещен/разрешен1
 2RWPressure Sensor 1 - период обновления, мс1000
 2RWPressure Sensor 1 - V00
 1RWPressure Sensor 1 - PMAX10
 1RPressure Sensor 2 - текущее значение0
 1RWPressure Sensor 2 - запрещен/разрешен1
 2RWPressure Sensor 2 - период обновления, мс1000
 2RWPressure Sensor 2 - V00
 1RWPressure Sensor 2 - PMAX10
 8R1-Wire Device 1 ROM0x0000000000000000
 8R1-Wire Device 2 ROM0x0000000000000000

Статус прерывания

Флаговый регистр "Статус прерывания" показывает причину, по которой была поднята линия прерывания.

БитОписание
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

Ссылки

Edit - History - Print - Recent Changes - Search
Page last modified on March 19, 2026, at 09:58 am