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.

SPI интерфейс

В устройстве имеются две дочерние платы, которые подключаются к основной через SPI интерфейс. Благодаря тому, что в некоторых контроллерах Atmega USART умеет работать в режиме SPI Master, можно использовать SPI не привлекая интерфейс программирования. К сожалению, SPI Slave реализован только в AVR SPI и используется совместно в интерфейсом внутрисхемного программирования, что несколько усложняет отладку ПО. Для простоты, протокол обмена данными для обеих плат унифицирован. С точки зрения мастера, подчиненные устройства представляют собой память с максимальным объемом 256 байт, в котором расположены регистры, через которые и происходит управление. В регисты могут быть только для чтения, только для записи (и тогда из них читаются только FFh) и для чтения/записи одновременно.

Протокол SPI интерфейса

В процессе разработки прошивки для платы сенсоров выяснилась одна неприятная деталь: опрос сенсоров (в особенности датчиков DS18B20) приводило к пропускам приема по SPI, даже если использовались прерывания. Причина так и осталась непонятной: то ли сбой в процессе передачи, то ли библиотека 1Wire блокировала прерывания (хотя в коде я этого не нашел). Время от времени пропадали 1-2 байта, но в целом, данные по SPI как-то передавались. Однако, пропуски вели к срыву statе-машин приемника и передатчика, из-за чего гораздо больше данных передавалось неверно. Было решено разработать протокол передачи данных по SPI таким образом, чтобы как можно раньше обнаружить пропуск, заново синхронизировать автоматы master'а и slave'а и повторить передачу.

Изначально, протокол был очень простым и состоял из двух фаз: адрес и данные. Master передавал адрес, в котором (установкой старшего бита) кодировалась команда: чтение/запись. Далее, второй фазой, в зависимости от команды, либо master передавал байт данных при записи, либо slave - в случае чтения. Между фазами обязательно нужно было делать паузу, чтобы slave успевал подготовить данные для отправки. Если одна из сторон должна принимать данные, то в этот момент она передавала пустой байт FFh. Естественно, что в случае пропуска байта slave'ом, происходил рассинхрон и вместо адреса, получался адрес и наоборот.

В новом протоколе было решено:

  • увеличить количество фаз до 4-х: добавлена фаза команды в начале и фаза подтверждения в конце.
  • master или slave, в случае, когда они должны принять данные, то в этот момент передается не пустой байт FFh, а текущее состояние автомата в закодированном виде.
  • добавить период ожидания для slave'а, по истечении которого, если master не инициировал передачу, автомат возвращается в фазу 1 - прием команды.

Подробности можно увидеть в таблице ниже.

Чтение
 Фаза 1Фаза 2Фаза 3Фаза 4
Master52hадрес22h23h
Slave80h81hданные83h
Запись
Master57hадресданные26h
Slave80h84h85h86h

Благодаря этим двум решениям, у обоих автоматов: master'а и slave'а появляется возможность оперативно выявить рассинхронизацию: однозначно - в начале и конце передачи, и, иногда, в середине. Если ошибку обнаружил master, то он переходит в фазу 1 и делает паузу, равную периоду сброса у slave'а. После этого, передача повторяется. Если передачу не удалось осуществить 10 раз, то передача считается не успешной. Если ошибку обнаружил slave, то он переводи автомат в состояние ошибки, из которой можно выйти только с помощью процедуры сброса, описанной выше.

Порядок передачи бит, полярность тактового сигнала и т.д. значения особого не имеют: важно чтобы они совпадали у master'а и slave'а.

Испытания подтвердили эффективность данного решения. Количество повторных передач не превышало 3. Этот протокол был реализован в обоих модулях, подключаемых по SPI: в плате светодиодов и клавиш и в плате сенсоров.

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

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

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

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

SPI интерфейс блока UI: светодиоды и кнопки

Карта памяти

Все значения хранятся в формате Little Endian.

АдресРазмерТипОписаниеЗнач. по умолчанию
00h1RСтатутс0
01h1RСобытие клавиатурыFFh
02h1WКоманда для LED Valve1, зеленый0
03h1WКоманда для LED Valve1, красный0
04h1WКоманда для LED Valve2, зеленый0
05h1WКоманда для LED Valve2, красный0
06h1WКоманда для LEВ Valve3, зеленый0
07h1WКоманда для LED Valve3, красный0
08h1WКоманда для LED Valve4, зеленый0
09h1WКоманда для LED Valve4, красный0
0Ah1WКоманда для LED Valve5, зеленый0
0Bh1WКоманда для LED Valve5, красный0
0Ch1WКоманда для LED Valve6, зеленый0
0Dh1WКоманда для LED Valve6, красный0
0Eh1WКоманда для LED Leak1, зеленый0
0Fh1WКоманда для LED Leak1, красный0
10h1WКоманда для LED Leak2, зеленый0
11h1WКоманда для LED Leak2, красный0
12h1WКоманда для LED Leak3, зеленый0
13h1WКоманда для LED Leak3, красный0
14h1WКоманда для LED Leak4, зеленый0
15h1WКоманда для LED Leak4, красный0
16h1WКоманда для LED FlowCounter1, зеленый0
17h1WКоманда для LED FlowCounter2, зеленый0
18h1WКоманда для LED Power, зеленый0
19h1WКоманда для LED Power, красный0
1Ch1RBoardID"U\x01"
1Eh1RVersionFWLLMMh

Статус

Флаговый регистр "Статус" показывает текущий статус модуля. К сожалению, у модуля отсутствует отдельная линия прерываний, поэтому необходимо периодически опрашивать состояние этого регистра. Значение регистра автоматически сбрасывается при чтении.

БитОписание
7INIT - модуль перезагрузился и требует инициализации
6-
5-
4-
3-
2-
1-
0Имеется событие от клавиш в очереди событий клавиатуры

События от клавиатуры

Команды светодиодов

Меню настройки и управления

Структура

  • Главный экран
    • Управление
      • Открыть/Закрыть/Авто для каждого вентиля
      • Включить/Выключить датчик протечки
      • Включить/Выключить датчик расхода
      • Включить/Выключить датчик температуры
      • Включить/Выключить датчик давления
      • - Опросить шину 1-WIRE на наличие датчиков температуры -
    • Информация
      • Текущие значения счетчиков расхода
      • Значения датчиков температуры
      • Значения датчиков давления
      • Статус питания: от сети или от батареи
      • Напряжения линии питания от сети
      • Заряд батареи
      • Статус подключения к Mesh сети: подключено/не подключено, адрес узла
      • Версия прошивки
    • Настройка
      • Группы вентилей
      • Тип вентиля: двух/пяти проводные
      • Задержка срабатывания датчиков протечки
      • Калибровка счетчиков расхода: кол-во литров на один импульс
      • Текущее значение счетчиков расхода
      • Соответствие кода ROM датчика DS18B20 с каналом температуры
      • Калибровка датчиков давления

Информация на главном экране

  • Загрузка
    • Приветственное сообщение: "Plumbing Cоntroller"
    • Установка вентилей в закрытое состояние
    • Тестирование датчиков протечки
    • Количество обнаруженных датчиков температуры
  • Основное состояние
    • дисплей выключен
    • обнаружен/потерян датчик температуры
    • работа от батареи - остаточный заряд батареи
  • Переключение групп вентилей
    • Цель переключения, прогресс
  • Авария от датчиков протечки
    • Датчик протечки неисправен: просто сообщение о неисправности, подробности - на дополнительном дисплее
    • Сработал датчик протечки
      • Таймер до перехода в аварийный режим
      • Сообщение о том, что устройство находится в аварийном режиме

Плата сенсоров

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

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

  • Импульсные выходы счетчиков воды, работающие на размыкание. Существуют несколько видов интерфейсов для счетчиков воды, в том числе и с резисторами, но я таких в глаза никогда не видел, и мне всегда попадались только действующие на размыкание. Чтобы не усложнять схему и не затягивать проект, решил реализовать только его.
  • Датчики температуры на DS18B20. Изначально я сглупил и при разводке платы использовал один вывод микроконтроллера для шины 1-Wire, к которому подключил оба датчика. В результате, пришлось усложнить прошивку, и выбор того, какой датчик будет считаться первым, а какой - вторым, выбирается не порядком подключения в разъемам, а значением ROM этих датчиков, которые придется указывать при конфигурировании.
  • Датчики давления: распространенные аналоговые датчики, у которых выходное напряжение линейно зависит от давления. В прошивке заложена возможность калибровки датчиков.

Значения счетчиков хранятся в отдельной энергонезависимой памяти и автоматически восстанавливаются при перезагрузки платы. Значения счетчиков можно изменить через SPI интерфейс. Остальные параметры, передаваемые через SPI интерфейс в энергонезависимой памяти не сохраняются и нуждаются в восстановлении основной платой. Имеется механизм, позволяющий основной плате определить нештатную перезагрузку платы сенсоров.

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 микроконтроллера, так как изменяются не часто и быстрая деградация ему не грозит.

  • разрешение/запрещение каждого канала сенсорного блока
  • периоды обновления для каждого канала температуры и давления
  • калибровка счетчиков расхода: кол-во литров на один импульс (на каждый счетчик)
  • калибровка датчиков давления:
    • напряжение, соответствующее нулевому (атмосферному) давлению
    • референсное напряжение
    • давление, соответствующее референсному напояжению
  • соответствие кода ROM DS18B20 с каналом температуры (на каждый канал)

SPI интерфейс

Карта памяти

Все значения хранятся в формате Little Endian.

АдресРазмерТипОписаниеЗнач. по умолчанию
001RСтатутс прерывания0
014RWFlow Sensor 1 - текущее значение0
051RWFlow Sensor 1 - счет запрещен/разрешен1
062RWFlow Sensor 1 - объем на один импульс, м3*10001
084RWFlow Sensor 2 - текущее значение0
0c1RWFlow Sensor 2 - счет запрещен/разрешен1
0d2RWFlow Sensor 2 - объем на один импульс, м3*10001
0f2RTemperature Sensor 1 - текущее значение0
118RWTemperature Sensor 1 - 1-Wire ROM0x0000000000000000
191RWTemperature Sensor 1 - запрещен/разрешен1
1a2RWTemperature Sensor 1 - период обновления, с10
1c2RTemperature Sensor 2 - текущее значение0
1e8RWTemperature Sensor 2 - 1-Wire ROM0x0000000000000000
281RWTemperature Sensor 2 - запрещен/разрешен1
272RWTemperature Sensor 2 - период обновления, с10
292RPressure Sensor 1 - текущее значение, Бар*1280
2b1RWPressure Sensor 1 - запрещен/разрешен1
2c2RWPressure Sensor 1 - период обновления, с10
2e2RWPressure Sensor 1 - V0, В*640.00
302RWPressure Sensor 1 - VREF, В*645.00
322RWPressure Sensor 1 - PREF, Бар*12810.00
342RPressure Sensor 2 - текущее значение, Бар*1280
361RWPressure Sensor 2 - запрещен/разрешен1
372RWPressure Sensor 2 - период обновления, с10
392RWPressure Sensor 2 - V0, В*640.00
3b2RWPressure Sensor 2 - VREF, В*645.00
3d2RWPressure Sensor 2 - PREF10.00
3e8R1-Wire Device 1 ROM0x0000000000000000
478R1-Wire Device 2 ROM0x0000000000000000
4f8R1-Wire Device 3 ROM0x0000000000000000
578R1-Wire Device 4 ROM0x0000000000000000
7Ch1RBoardID"S\x01"
7Eh1RVersionFWLLMMh

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

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

БитОписание
7INIT - модуль перезагрузился и требует инициализации
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

Формат значений.

  • Значение потребленной воды представлено в виде 1/1000 м3. Размера в 32 бита хватит, чтобы представить число: 4'294'967.296, или 999'999.999 - то есть 9-ти разрядный счетчик, что более, чем достаточно, так как бытовые счетчики обычно имеют 8 разрядов.
  • Количество количество потребленной воды на один счетный импульс также представляется в виде литров.
  • Значения потребленного объема в GATT не представлены, есть только расход: литры/секунду. В GATT вообще нет значения объема. Как буду выходить их этой ситуации - не знаю.
  • Значения напряжения представлены в виде 1/64 Вольта. Такое представление напряжения представлено в спецификации GATT.
  • Значение давления в GATT представляется в десятых долях Паскаля и занимает 32 бита. В данном проекте, такое представление избыточно, поэтому давление представлено в виде 1/128 Бара. В случае необходимости, бары легко пересчитываются в паскали.

Калибровочные значения датчиков давления:

Модель: XIDIBEI SENSOR XDB401 SERIES Выход: 0.5-4.5В Диапазон измерения: 1МПа (10Бар)

Датчик!V0!VREF!PREF
Холодная вода (синий)0.495.011.11
Горячая вода (красный)0.504.510

Основная плата

Ссылки

Edit - History - Print - Recent Changes - Search
Page last modified on April 27, 2026, at 06:51 pm