Загальний опис проєкту
Маючи вдома систему фільтрації води зворотнього осмосу, якось із колегами заговорили за вартість 1 літру фільтрованої води. Щоб порівняти економічну складову із водою з “водних автоматів”. Зрозуміло, що складова зручності переважає все інше, але гроші рахувати також цікаво :)

Старенький ноутбук (2020 року…) в якості сервера для HomeAssistant наштовхнув на думку, що це якось можна використати для вирішення завдання. Знаючи густину води, вирішив це зробити за допомогою вимірювання ваги та інтегрувати це в HomeAssistant.
Вибір комплектуючих
Пошукавши різні варіанти, я зупинився на ESP32, який давно муляв мій розум із форумів HomeAssistant.
Тож, так як треба було вимірювати вагу води разом із бачком, то тензодатчик обрано до 10 кг. У китайців вони йдуть разом із підсилювачем HX711, що доволі зручно.
Як працює тензодатчик та навіщо там підсилювач?
Тензодатчик балкового типу, як в мене, жорстко кріпиться з одного боку (як балка - ваш Кеп), а навантаження дається на інший бік. Тобто, воно працює на згин з одного боку і на розтяг - з іншого (спробуйте стиснути стиральну гумку і зрозумієте, що я маю на увазі).
Без навантаження в балці існує нульовий баланс, при навантаженні, як каже вікіпедію, виникає розбалансування, тензорезистори змінюють свій опір і виникає напруга.
За рахунок того, що деформації незначні (для маленької балки це долі міліметрів), то і напруга виникає дуже маленька. Сигнал є аналоговим і занадто слабким для esp32/arduino інших контролерів, щоб працювати з ним безпосередньо. тому нам потрібен підсилювач, який також відіграє роль АЦП.
На виході з HX711 на esp32 отримуємо цифровий сигнал із яикомсь підсиленим значенням в умовних папугах. Для отримання з цих значень ваги необхідно здійснити калібрування.
Не зовсім хотілось тягнути лінію живлення від розетки під мийку, де у нас і стоїть бачок, тому для живлення використано батарею LiPo на 10000 мА*г.
ESP32 вміє занурюватись у глибокий сон і споживання електроенергії при цьому падає майже до нуля, тому акумулятора буде вистачати надовго (хоча б на тиждень) - такі були роздуми.
Тож, використанні компоненти aka BOM:
- ESP32-C3 XIAO Dev board;
- Estardyn балковий тензодатчик до 10 кг;
- HX711 АЦП модуль;
- LiPo 10000 mAh, 3,7V, 12x60x110мм.
Корпус
Маючи вдома 3д-принтер BambuLab P1S, вирішив спроєктувати під це підставку у FreeCAD з подальшим друком PLA.
Спочатку думав зробити приховані дроти, але потім вирішив просто прокалсти їх зверху і закріпити кліпсами, які було роздруковано іншим кольором.
До цього моменту паяльник для дрібних деталей я не тримав в руках років так 15, тому якість пайки відповідна.
Акумулятор також має своє посадкове місце і місце для Dupont коннекторів, щоб можна було відключати акумулятор за необхідністю (наприклад, коли вдома тривалий час нікого немає).
Програмна складова (ESPhome)
Після того, як все було зібрано та перевірено (через Arduino IDE), корпус надруковано та зібрано, прийшов час розібратись із ESPhome.
Проєкт має шикарну документацію та на сайті HomeAssistant гарну спільноту.
Не буду тут зупинятись на таких моментах, як прошивати devboard через HomeAssistant, як додати загальні налаштування (wi-fi тощо).
Ось початковий сніппет, який фактично взяв з офіційної документації ESPhome
1sensor:
2 - platform: hx711
3 name: "HX711 Value"
4 dout_pin: D0
5 clk_pin: D1
6 gain: 128
7 update_interval: 10sПіни зрозумілі, а підсвічено строку коду з інтервалом. 10 секунд для мети збору інформації про воду занадто часто, проте для початку це гарне рішення, так як дозволить провести калібрування. Деплоїмо цей код на esp32.
калібрування
Перед продовженням переконаємось, що на наш датчик нічого не тисне, окрім верхньої кришки. Відкриваємо журнал з пристрою і ловимо сирі значення, які надсилає датчик. Рекомендую зібрати 3-5 значень та визначити середнє - так буде точніше. Скопіюємо його. Це і буде значення нуля.
Далі беремо будь-яку річ, вага якої вам відома і яка менше максимально довзоленого значення датчика (в моєму випадку це до 10кг). Якщо не маєте контрольних вагів, то можна взяти пляшку відомого об’єму, налити туди води і поставити на верхню платформу. Так як густина води 1 кг на літр, то вага буде відповідати об’єму (вагою пляшки і 5-10 грамами точності наливу води можна знехтувати).
Знов дивимось в журнал - значення має змінитись і мають бути суттєво більші значення. Зберігаємо його, це буде значення-еталон.
Модифікуємо код: