Умная бутылка для воды на Arduino: мониторинг и напоминания в реальном времени
Компоненты и расходники
| Arduino Pro Mini 328 (5V/16MHz) | ×1 |
| Водонепроницаемый ультразвуковой датчик (например, JSN-SR04T) | ×1 |
| Модуль реального времени RTC (DS1307 или DS3231) | ×1 |
| 4-разрядный 7-сегментный индикатор (общий катод, SparkFun) | ×1 |
| Пьезо-зуммер | ×1 |
| Таковая кнопка 12 мм | ×1 |
| Транзистор NPN (2N2222 или аналогичный) | ×4 (по одному на разряд) |
| Li-Ion аккумулятор 1000 мАч | ×1 |
| Зарядный модуль USB Li-Ion (Adafruit или TP4056) | ×1 |
| Резисторы: 220 Ом (×8, сегменты), 1 кОм (×4, базы транзисторов), 4,75 кОм (×2, pull-up I²C) | — |
Инструменты
- Паяльник, клей-пистолет.
О проекте
Введение
Вода жизненно важна: улучшает кожу, работу мозга, энергию, помогает похудеть. Но в суете забываем пить — 75% американцев хронически обезвожены. Эта умная бутылка помогает выработать привычку:
- Учёт ежедневного потребления.
- Среднее за неделю.
- Напоминания (звуковые) если не пил 2 часа.
- Время последнего глотка.
- Работает > месяца от одного заряда.
Модуль RTC (DS1307)
Для временных меток нужен RTC. DS1307 требует внешний кварц 32,768 кГц, два pull-up резистора (2–10 кОм, я использовал 4,7 кОм) на SDA/SCL. Питание 5В — основное, VBAT — на резервную батарейку (я заземлил, так как всё работает от Li-Ion). Можно взять готовый Tiny RTC или использовать DS3231 (встроенный кварц, точнее).
Ключевые выводы DS1307: 5V (питание), GND, SCL (→ A5), SDA (→ A4), VBAT (заземлить, если нет батарейки).
Плата 7-сегментного индикатора
Использован компактный модуль 4 разряда с общим катодом. Сегменты мультиплексируются: 7 общих анодов (a–g, dp) + 4 отдельных катода (разряды). Ток сегментов ограничен резисторами 220 Ом (для Li-Ion). Для разрядов используются 4 транзистора 2N2222 (базы через 1 кОм на D6–D9). Сегменты подключены к D10–D17. Кнопка на D2 (INT0) — пробуждение из сна и переключение режимов.
Подключение к Arduino Pro Mini
- Сегменты a–g, dp → D10–D17.
- Разряды D0–D3 (катоды) → коллекторы транзисторов, базы → D6–D9 через 1 кОм.
- Кнопка → D2 (INT0) + pull-up.
Подключение RTC и зуммера
- RTC SDA → A4, SCL → A5.
- Зуммер → D3.
Ультразвуковой датчик в крышке
В крышке бутылки просверлено отверстие под датчик (центрирован). Датчик смотрит вниз в бутылку. Провода: VCC, GND, Trig → D4, Echo → D5.
Прошивка и тестирование
Необходимые библиотеки: OneButton (кнопка), LowPower (сон), DS1307RTC + Time/TimeLib.
Алгоритм:
- Каждую минуту (Watchdog 8с × 7,5 ≈ 60с) просыпается, делает 5 замеров расстояния до воды, усредняет.
- Высота бутылки 17 см → уровень воды = 17 − среднее_расстояние.
- 1 см уровня ≈ 1,87 унции (30 унций = 16 см).
- Если уровень упал более чем на 1 унцию — фиксируем приём воды, сбрасываем таймер бездействия.
- Если уровень вырос — считаем дозаправку.
- Если 2 часа нет приёма — двойной бип каждые 15 мин (до следующего приёма).
- В 23:59 суточный счётчик сбрасывается, данные уходят в недельный массив.
- Кнопка: 1 нажатие — суточный итог (префикс «d»), 2 — недельный средний («a»), 3 — текущий уровень («r»), 4 — время последнего приёма (часы:минуты). Длительное нажатие — игнорировать последний замер.
- Дисплей горит 10 сек, потом уходит в сон.
Монтаж в крышку
Arduino Pro Mini клеится термоклеем на внутреннюю сторону крышки. Батарея сверху, зарядный модуль — с USB-разъёмом наружу. Всё обильно заливаем клеем (кроме USB) для полной водонепроницаемости. Не погружайте крышку в воду!
Код (основные фрагменты)
#include
#include
#include
#include
#include "LowPower.h"
#include "OneButton.h"
OneButton button(2, true);
const int trigPin = 4, echoPin = 5, piezoPin = 3;
const int digit[4] = {9,6,7,8}; // D9,D6,D7,D8 - разряды
const int segment[8] = {16,10,12,14,15,17,11,13}; // D10-D17 - сегменты a-g,dp
// Коды сегментов для 0-9 и букв d, a, r, t
const byte number[10][8] = { ... };
const byte d[8] = {0,1,1,1,1,0,1,1};
const byte a[8] = {1,1,1,0,1,1,1,1};
const byte r[8] = {0,0,0,0,1,0,1,1};
const byte t[8] = {0,0,0,1,1,1,1,1};
int water_intake_ounch[15], water_intake_days[7];
int water_intake_times = 0, previous_water_amount = 0;
int total_water_intake_today = 0, average_intake_last_week = 0;
int intake_day = 1, idle_time = 0;
float average_water_level = 0;
int water_amount_in_ounce = 0;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
for (int i=6; i<=17; i++) pinMode(i, OUTPUT);
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
button.attachClick(pressed);
button.attachDoubleClick(doubleclick);
button.attachLongPressStart(longPressStart);
button.attachDuringLongPress(longPress);
}
void loop() {
read_time(); button.tick(); calculation();
int daily = total_water_intake_in_day();
int weekly = average_water_intake_last_week();
if (button_press_count == 1) { display_d(); display_number(daily); }
else if (button_press_count == 2) { display_a(); display_number(weekly); }
else if (button_press_count == 3) { display_r(); display_number(water_amount_in_ounce); }
else if (button_press_count == 4) { display_first_2(hours); display_last_2(minutes); }
if (idle_time >= 120) { alert(); alert(); } // 2 часа = 120 минут
if (millis() - sleep_time >= 15000) { // 15 сек показа
display_off();
attachInterrupt(digitalPinToInterrupt(2), blank, FALLING);
for (int i=0; i<7; i++) LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // ~56 сек
detachInterrupt(digitalPinToInterrupt(2));
sleep_time = millis();
}
}
// ... функции display_digit, display_number, display_d/a/r/t, display_off,
// read_time, distance_in_cm, microsecondsToCentimeters, alert, blank,
// pressed, doubleclick, longPressStart, longPress,
// calculation, total_water_intake_in_day, average_water_intake_last_week
// (полный код во вложении)
Схемы


Производственный процесс
- Как работают садовые поливальные установки: дизайн, история и современное производство
- Технология посудомоечных машин: история, дизайн и будущие инновации
- Эволюция насосных водяных пистолетов: от изобретения к мировому лидеру рынка
- Эволюция, материалы и производство современных унитазов
- Пожарные гидранты: конструкция, производство и роль в городской безопасности
- Эволюция и наука современных термосов
- Вода: история, виды и современные методы очистки
- Наука шампуня: ингредиенты, производство и будущие тренды
- Динамит: история, применение и безопасность в демолиции и горном деле
- Набор MOSMusic: MOSFET, Arduino и управление светом по музыке