Контроллер водопровода
За основу буду брать систему защиты от протечки для стиральной машины.
Задачи контроллера:
- перекрытие подачи воды по команде;
- защита от протечки: перекрыть ввод и полотенцесушитель в случае срабатывания датчиков;
- переключение источника горячей воды: центральное водоснабжение или водонагреватель;
- учет расхода воды;
- опционально: контроль за температурой воды и давлением.
Характеристики:
- Количество управляемых вентилей: 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 |
| главный контроллер (ATmega2560) |
| вентили | 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 |
| итого | 53 |
Выбор микроконтроллеров
- Главный контроллер: ATmega2560-16A
- Модуль управления: ATmega8515 *
- Модуль сенсоров: ATmega1284P **
* Atmega8515 не имеет контроллера I2C, поэтому для связи будет использована шина SPI.
** ATmega1284P имеет контроллер I2C, но для унификации с модулем управления, также будет использована шина SPI, но с дополнительным выходом прерывания
Конфигурация узлов и моделей BLE Mesh
Постановка задачи.
Чтобы не плодить много дополнительных вендоровских моделей, можно все-таки добавить нестандартные Property в Sensor Server. В стандарте, определено не так много значений, в то время как PropertyID имеет размер 16 бит. Можно взять вторую половину, начиная с 0xF000 и добавить свои измеряемые величины, и быть уверенным, что до них стандарт дойдет еще не скоро. В этом случае, узел будет состоять из следующих элементов:
- MAIN, Health Server, Generic Battery Server, Generic OnOff Server, Default Transition Time Server, Sensor Server, Sensor Setup Server, Scene Server, Scene Setup Server
- Generic OnOff Server, Default Transition Time Server, Sensor Server, Sensor Setup Server, Scene Server, Scene Setup Server
- Generic OnOff Server, Default Transition Time Server, Scene Server, Scene Setup Server
- Generic OnOff Server, Default Transition Time Server, Scene Server, Scene Setup Server
- Sensor Server, Sensor Setup Server
- Sensor Server, Sensor Setup Server
- Sensor Server, Sensor Setup Server
- Sensor Server, Sensor Setup Server
Sensor Setup Server элементов 1 и 2 отвечают за измерения ввода холодной и горячей воды: давление, температура, счетчик потребления. А в элементах 5-8 - за датчики утечки 1-4.
Определяемы производителем свойства сенсора
| Ко д | Имя | Тип | Описание |
| 0xF000 | VENDOR_VOLUME_COMSUMPTION | uint32_t | Счетчик потребленной воды, или объема другого всещества. Значение представлено в 0.1литра или 0.0001М2. |
| 0xF001 | VENDOR_LEAK_SENSOR | boolean | Cтатуса датчика протечки: 0 - все хорошо (GOOD), 1 - протечка (LEAK) |
Протокол взаимодействия BLE Mesh модуля и основного микроконтроллера.
В качестве протокола взаимодействия был выбран протокол Tuya, но с немного модифицированными командами для поддержки BLE Mesh сети.
Поддерживаемые команды и ответы
| Тип | CMDID | Имя | Описание |
| | 0x00 | TUYA_CMD_HEARTBEAT | |
| | 0x03 | TUYA_CMD_WIFI_STATE | |
| | 0x04 | TUYA_CMD_WIFI_RESET | |
| | 0x06 | TUYA_CMD_SET_DP | |
| | 0x07 | TUYA_CMD_STATE | |
| | 0x08 | TUYA_CMD_QUERY_STATE | |
| | 0x2b | TUYA_CMD_NETWORK_STATUS | |
Поддерживаемые Data Point IDs
| DPID | Тип | Имя | Доступ | Описание |
| Питание |
| 101 | ENUM | PWR_STATUS | R | Статус линии питания: 0 - напряжение отсутствует, 1 - нормальное напряжение, 2 - низкое напряжение, 3 - высокое напряжение |
| 102 | VALUE | PWR_VAL | R | Напряжение линии питания, 0.1В |
| 103 | ENUM | BAT_STATUS | R | Статус батареи: 0 - не используется, 1 - работа от батареи, 2 - заряжается, 3 - батарея разряжена |
| 104 | VALUE | BAT_VAL | R | Заряд батареи, % |
| Вентили |
| 105-108 | BOOL | VALVE_GROUP1-4 | RW | Статус группы вентилей: 0 - закрыт, 1 - открыт |
| Датчики |
| 109-112 | BOOL | LEAK1-4 | R | Статус датчика протечки: 0 - протечки нет, 1 - протечка |
| 113, 114 | VALUE | TEMP1-2 | R | Температура, 0.1C |
| 115, 116 | VALUE | PRESS1-2 | R | Давление, 0.1Бар |
| 117, 118 | VALUE | VOL_CONS1-2 | R | Счетчик потребления воды, 0.001м3 |
| Дополнительно |
| 119 | FAULT | FAULT | R | Битовый вектор ошибок: 0-5 - неисправность вентиля, 6-9 - неисправность датчика протечки |
| 120 | STRING | DISP | W | Строка на дисплее. Пустая строка - вернуть предыдущее значение. |
| 121 | BOOL | BEEP | W | Включить бипер (для поиска устройства). |
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 |
| Master | 52h | адрес | 22h | 23h |
| Slave | 80h | 81h | данные | 83h |
| Запись |
| Master | 57h | адрес | данные | 26h |
| Slave | 80h | 84h | 85h | 86h |
Благодаря этим двум решениям, у обоих автоматов: master'а и slave'а появляется возможность оперативно выявить рассинхронизацию: однозначно - в начале и конце передачи, и, иногда, в середине. Если ошибку обнаружил master, то он переходит в фазу 1 и делает паузу, равную периоду сброса у slave'а. После этого, передача повторяется. Если передачу не удалось осуществить 10 раз, то передача считается не успешной. Если ошибку обнаружил slave, то он переводи автомат в состояние ошибки, из которой можно выйти только с помощью процедуры сброса, описанной выше.
Порядок передачи бит, полярность тактового сигнала и т.д. значения особого не имеют: важно чтобы они совпадали у master'а и slave'а.
Испытания подтвердили эффективность данного решения. Количество повторных передач не превышало 3. Этот протокол был реализован в обоих модулях, подключаемых по SPI: в плате управления и в плате сенсоров.
Модуль индикации и управления
Состоит из трех частей: алфавитно-цифрового LED дисплея (одна строка, 20 символов), дополнительного модуля светодиодной индикации и модуля управления с энкодером и тремя кнопками: Select, Ок и Cancel.
Элементы управления и индикации
- Алфавитно-цифровой индикатор. Отображает элементы меню и различную информацию.
- Индикаторы состояния вентилей.
Красный - вентиль закрыт.
Мигающий красный - вентиль в процессе закрывания.
Зеленый - вентиль открыт.
Мигающий зеленый - вентиль в процессе открывания.
Мигающий попеременно красный и зеленый - неисправность вентиля.
- Индикаторы датчиков протечки.
- Индикаторы счетчиков расхода.
- Индикатор состояния питания.
- Кнопка "Ок".
- Кнопка "Cancel".
- Ручка энкодера и кнопка "Select".
SPI интерфейс блока UI: светодиоды и кнопки
Карта памяти
Все значения хранятся в формате Little Endian.
| Адрес | Размер | Тип | Описание | Знач. по умолчанию |
| 00h | 1 | R | Статутс | 0 |
| 01h | 1 | R | Событие клавиатуры | FFh |
| 02h | 1 | W | Команда для LED Valve1, зеленый | 0 |
| 03h | 1 | W | Команда для LED Valve1, красный | 0 |
| 04h | 1 | W | Команда для LED Valve2, зеленый | 0 |
| 05h | 1 | W | Команда для LED Valve2, красный | 0 |
| 06h | 1 | W | Команда для LEВ Valve3, зеленый | 0 |
| 07h | 1 | W | Команда для LED Valve3, красный | 0 |
| 08h | 1 | W | Команда для LED Valve4, зеленый | 0 |
| 09h | 1 | W | Команда для LED Valve4, красный | 0 |
| 0Ah | 1 | W | Команда для LED Valve5, зеленый | 0 |
| 0Bh | 1 | W | Команда для LED Valve5, красный | 0 |
| 0Ch | 1 | W | Команда для LED Valve6, зеленый | 0 |
| 0Dh | 1 | W | Команда для LED Valve6, красный | 0 |
| 0Eh | 1 | W | Команда для LED Leak1, зеленый | 0 |
| 0Fh | 1 | W | Команда для LED Leak1, красный | 0 |
| 10h | 1 | W | Команда для LED Leak2, зеленый | 0 |
| 11h | 1 | W | Команда для LED Leak2, красный | 0 |
| 12h | 1 | W | Команда для LED Leak3, зеленый | 0 |
| 13h | 1 | W | Команда для LED Leak3, красный | 0 |
| 14h | 1 | W | Команда для LED Leak4, зеленый | 0 |
| 15h | 1 | W | Команда для LED Leak4, красный | 0 |
| 16h | 1 | W | Команда для LED FlowCounter1, зеленый | 0 |
| 17h | 1 | W | Команда для LED FlowCounter2, зеленый | 0 |
| 18h | 1 | W | Команда для LED Power, зеленый | 0 |
| 19h | 1 | W | Команда для LED Power, красный | 0 |
| 1Ch | 2 | R | BoardID | "U\x01" |
| 1Eh | 2 | R | VersionFW | LLMMh |
Статус
Флаговый регистр "Статус" показывает текущий статус модуля. К сожалению, у модуля отсутствует отдельная линия прерываний, поэтому необходимо периодически опрашивать состояние этого регистра. Значение регистра автоматически сбрасывается при чтении.
| Бит | Описание |
| 7 | INIT - модуль перезагрузился и требует инициализации |
| 6 | - |
| 5 | - |
| 4 | - |
| 3 | - |
| 2 | - |
| 1 | - |
| 0 | Имеется событие от клавиш в очереди событий клавиатуры |
События от клавиатуры
| Код | Имя | Описание |
| 0x00 | ENC_CCW | Поворот энкодера против часовой стрелки |
| 0x01 | ENC_CW | Поворот энкодера по часовой стрелкe |
| 0x02 | ENC_SW_DOWN | Кнопка энкодера нажата |
| 0x03 | ENC_SW_UP | Кнопка энкодера отпущена |
| 0x04 | SW_OK_DOWN | Кнопка OK нажата |
| 0x05 | SW_OK_UP | Кнопка OK отпущена |
| 0x06 | SW_CANCEL_DOWN | Кнопка CANCEL нажата |
| 0x07 | SW_CANCEL_UP | Кнопка CANCEL отпущена |
| 0xff | NONE | Событие клавиатуры отсуствует |
Команды светодиодов
| Код | Имя | Описание |
| 0x00 | OFF | Выключен |
| 0x01 | ON | Включен |
| 0x02 | FLASH | Периодическое мигание |
| 0x03 | FLASH_INV | Инвертированное периодическое мигание * |
| 0x04 | BLINK | Однократное мигание |
* Инвертированное мигание нужно для двухцветных светодиодов, чтобы они по очереди мигали то одним, то другим цветом.
Плата сенсоров
Поскольку на основную плату поместились только разъемы для подключения вентилей и датчиков протечки, все-равно пришлось бы делать дополнительную плату с разъемами остальных датчиков и расположить ее вторым этажом. Исходя из этого, было разумным на этой плате разместить собственный контроллер, опрашивающий эти датчики, чтобы снять нагрузку с контроллера основной платы и упростить физическую шину подключения.
К плате сенсоров возможно подключить следующие датчики:
- Импульсные выходы счетчиков воды, работающие на размыкание. Существуют несколько видов интерфейсов для счетчиков воды, в том числе и с резисторами, но я таких в глаза никогда не видел, и мне всегда попадались только действующие на размыкание. Чтобы не усложнять схему и не затягивать проект, решил реализовать только его.
- Датчики температуры на 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.
| Адрес | Размер | Тип | Описание | Знач. по умолчанию |
| 00 | 1 | R | Статутс прерывания | 0 |
| 01 | 4 | RW | Flow Sensor 1 - текущее значение | 0 |
| 05 | 1 | RW | Flow Sensor 1 - счет запрещен/разрешен | 1 |
| 06 | 2 | RW | Flow Sensor 1 - объем на один импульс, м3*1000 | 1 |
| 08 | 4 | RW | Flow Sensor 2 - текущее значение | 0 |
| 0c | 1 | RW | Flow Sensor 2 - счет запрещен/разрешен | 1 |
| 0d | 2 | RW | Flow Sensor 2 - объем на один импульс, м3*1000 | 1 |
| 0f | 2 | R | Temperature Sensor 1 - текущее значение | 0 |
| 11 | 8 | RW | Temperature Sensor 1 - 1-Wire ROM | 0x0000000000000000 |
| 19 | 1 | RW | Temperature Sensor 1 - запрещен/разрешен | 1 |
| 1a | 2 | RW | Temperature Sensor 1 - период обновления, с | 10 |
| 1c | 2 | R | Temperature Sensor 2 - текущее значение | 0 |
| 1e | 8 | RW | Temperature Sensor 2 - 1-Wire ROM | 0x0000000000000000 |
| 28 | 1 | RW | Temperature Sensor 2 - запрещен/разрешен | 1 |
| 27 | 2 | RW | Temperature Sensor 2 - период обновления, с | 10 |
| 29 | 2 | R | Pressure Sensor 1 - текущее значение, Бар*128 | 0 |
| 2b | 1 | RW | Pressure Sensor 1 - запрещен/разрешен | 1 |
| 2c | 2 | RW | Pressure Sensor 1 - период обновления, с | 10 |
| 2e | 2 | RW | Pressure Sensor 1 - V0, В*64 | 0.00 |
| 30 | 2 | RW | Pressure Sensor 1 - VREF, В*64 | 5.00 |
| 32 | 2 | RW | Pressure Sensor 1 - PREF, Бар*128 | 10.00 |
| 34 | 2 | R | Pressure Sensor 2 - текущее значение, Бар*128 | 0 |
| 36 | 1 | RW | Pressure Sensor 2 - запрещен/разрешен | 1 |
| 37 | 2 | RW | Pressure Sensor 2 - период обновления, с | 10 |
| 39 | 2 | RW | Pressure Sensor 2 - V0, В*64 | 0.00 |
| 3b | 2 | RW | Pressure Sensor 2 - VREF, В*64 | 5.00 |
| 3d | 2 | RW | Pressure Sensor 2 - PREF | 10.00 |
| 3e | 8 | R | 1-Wire Device 1 ROM | 0x0000000000000000 |
| 47 | 8 | R | 1-Wire Device 2 ROM | 0x0000000000000000 |
| 4f | 8 | R | 1-Wire Device 3 ROM | 0x0000000000000000 |
| 57 | 8 | R | 1-Wire Device 4 ROM | 0x0000000000000000 |
| 7Ch | 1 | R | BoardID | "S\x01" |
| 7Eh | 1 | R | VersionFW | LLMMh |
Статус прерывания
Флаговый регистр "Статус прерывания" показывает причину, по которой была поднята линия прерывания. Значение регистра автоматически сбрасывается при чтении.
| Бит | Описание |
| 7 | INIT - модуль перезагрузился и требует инициализации |
| 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.49 | 5.0 | 11.11 |
| Горячая вода (красный) | 0.50 | 4.5 | 10 |
Основная плата
Ошибки версии 1.0
Кроме минорных ошибок, вроде неверных размеров SMD компонентов, была обнаружена только одна ошибка: неверная схема измерения напряжения линии питания. В целях экономии я решил брать его с вывода EN преобразователя напряжения MP1584, так как штатный делитель напряжения прекрасно подходит для этого случая. Я предполагал, что вывод ADC микроконтроллера обладает высоким сопротивлением и никак не повлияет на работу преобразователя. Однако, выяснилось, что высоким сопротивлением он обладает, когда микроконтроллер включен, а когда выключен, этот вывод очень сильно занижал напряжение на делителе и преобразователь не запускался. Пришлось добавлять на плату "дохлого паучка": еще один делитель напряжения специально для измерений.
Еще одно критической ошибкой стало неправильное подключения батареи к выключателю питания, в результате чего батарея запитывала схему через чип зарядки TP4056 даже если выключатель выл выключен.
В версии платы 1.2 все недостатки были исправлены, но плату я решил не перезаказывать, так как количество исправлений допустимо для устройства, которое будет изготовлено в единственном экземпляре.
Еще одно ошибкой можно признать неправильный размер звукового излучателя, но тут ошибка была в заказе, а не в плате: я заказал не тот динамик. Вместо перезаказа или переделки платы я распечатал на 3D принтере переходник и вышло вполне сносно.
21.05.2026г. плата прошла процедуру Poweron'а: все системы были успешно запущены и протестированы. Плата готова к разработке прошивки.
Питание
Для измерения напряжения на линии питания и на батареи можно использовать опорный источник напряжения 1.1В микроконтроллера или напряжение питания микроконтроллера. Первое нужно калибровать, так как реальное значение опорного напряжения ни разу не точное и имеет разброс: 1.0В - 1.2В. Напряжение же питания регулируется DC/DC преобразователем и, в текущей схеме, настраивается подстроечным резистором и дополнительной программной калибровки в этом случае не требуется. Но напряжение может гулять в зависимости от нагрузки (а может и не гулять, если я все спроектировал верно), поэтому, предпочтительней использовать внутренний линейный стабилизатор с программной калибровкой.
Карта памяти EEPROM для конфигурации
Все значения хранятся в формате Little Endian.
| Адрес | Размер | Тип | Имя | Знач. по умолчанию |
| 00h | 2 | uint16_t | EEPROM_ADDR_PWR_AC_VOLTAGE_COEFF | - |
| 02h | 2 | uint16_t | EEPROM_ADDR_PWR_REF_VOLTAGE | 110 |
Спецификация на прошивку основной платы.
Меню настройки и управления
Структура
- Главный экран
- Управление
- Открыть/Закрыть/Авто для каждого вентиля
- Включить/Выключить датчик протечки
- Включить/Выключить датчик расхода
- Включить/Выключить датчик температуры
- Включить/Выключить датчик давления
- Опросить шину 1-WIRE на наличие датчиков температуры -
- Информация
- Текущие значения счетчиков расхода
- Значения датчиков температуры
- Значения датчиков давления
- Статус питания: от сети или от батареи
- Напряжения линии питания от сети
- Заряд батареи
- Статус подключения к Mesh сети: подключено/не подключено, адрес узла
- Версия прошивки
- Настройка
- Группы вентилей
- Тип вентиля: двух/пяти проводные
- Задержка срабатывания датчиков протечки
- Калибровка счетчиков расхода: кол-во литров на один импульс
- Текущее значение счетчиков расхода
- Соответствие кода ROM датчика DS18B20 с каналом температуры
- Калибровка датчиков давления
Информация на главном экране
- Загрузка
- Приветственное сообщение: "Plumbing Cоntroller"
- Установка вентилей в закрытое состояние
- Тестирование датчиков протечки
- Количество обнаруженных датчиков температуры
- Основное состояние
- дисплей выключен
- обнаружен/потерян датчик температуры
- работа от батареи - остаточный заряд батареи
- Переключение групп вентилей
- Цель переключения, прогресс
- Авария от датчиков протечки
- Датчик протечки неисправен: просто сообщение о неисправности, подробности - на дополнительном дисплее
- Сработал датчик протечки
- Таймер до перехода в аварийный режим
- Сообщение о том, что устройство находится в аварийном режиме
Ссылки