Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умная бутылка для воды на 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% американцев хронически обезвожены. Эта умная бутылка помогает выработать привычку:

Модуль 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

Подключение RTC и зуммера

Ультразвуковой датчик в крышке

В крышке бутылки просверлено отверстие под датчик (центрирован). Датчик смотрит вниз в бутылку. Провода: VCC, GND, Trig → D4, Echo → D5.

Прошивка и тестирование

Необходимые библиотеки: OneButton (кнопка), LowPower (сон), DS1307RTC + Time/TimeLib.

Алгоритм:

Монтаж в крышку

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
// (полный код во вложении)

Схемы

Умная бутылка для воды на Arduino: мониторинг и напоминания в реальном времени

Умная бутылка для воды на Arduino: мониторинг и напоминания в реальном времени

Производственный процесс

  1. Как работают садовые поливальные установки: дизайн, история и современное производство
  2. Технология посудомоечных машин: история, дизайн и будущие инновации
  3. Эволюция насосных водяных пистолетов: от изобретения к мировому лидеру рынка
  4. Эволюция, материалы и производство современных унитазов
  5. Пожарные гидранты: конструкция, производство и роль в городской безопасности
  6. Эволюция и наука современных термосов
  7. Вода: история, виды и современные методы очистки
  8. Наука шампуня: ингредиенты, производство и будущие тренды
  9. Динамит: история, применение и безопасность в демолиции и горном деле
  10. Набор MOSMusic: MOSFET, Arduino и управление светом по музыке