Botella de agua inteligente con Arduino: Monitorización en tiempo real y alertas
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino Pro Mini 328 5V/16MHz (SparkFun) | 1 |
| Sensor ultrasónico resistente al agua | 1 |
| Reloj en tiempo real (RTC) | 1 |
| Display 7 segmentos 4 dígitos cátodo común (SparkFun) | 1 |
| Zumbador | 1 |
| Pulsador 12mm (SparkFun) | 1 |
| Transistor NPN uso general | 1 |
| Batería Li-Ion 1000 mAh | 1 |
| Cargador USB Li-Ion (Adafruit) | 1 |
| Resistencia 221 Ω | 8 |
| Resistencia 1 kΩ | 4 |
| Resistencia 4.75 kΩ | 2 |
Herramientas necesarias
- Soldador
- Pistola de silicona caliente
Aplicaciones y servicios en línea
- Arduino IDE
Sobre el proyecto
Introducción
Beber suficiente agua es vital para la salud: piel más clara, mejor salud general, mayor productividad y función cerebral, más energía, incluso pérdida de peso. En nuestra vida ajetreada cuesta recordar beber agua; ~75% de estadounidenses están crónicamente deshidratados. Para crear un hábito saludable, hay que registrar la ingesta diaria. Hice mi botella inteligente con Arduino para:
- Registrar ingesta diaria.
- Promedio semanal.
- Recordar beber.
- Registrar última vez que bebí.
- Autonomía > 1 mes con una carga.
Fabricar módulo RTC
Para registrar ingesta con fecha/hora se necesita un RTC. El DS1307 con pila de respaldo es ideal. Programación sencilla, soportado en la mayoría de entornos.
Diseño compacto basado en DS1307: reloj/calendario BCD completo + 56 bytes NV SRAM. Bus I2C bidireccional. Formato 12/24h con segundos, minutos, horas, día, fecha, mes, año (incluye año bisiesto).
Construye el módulo según esquemático: DS1307 requiere cristal externo. Dos pull-ups en SCL/SDA (2k–10k, usé 4.7k). Soldé lo más compacto posible por espacio. Alternativa: DS3231 (cristal interno). O compra módulo RTC listo. Al ser todo a batería, conecté VBAT a GND sin pila moneda.
Pines clave DS1307: 5V (alto = envía datos, bajo = pila respaldo), GND, SCL (I2C clock → Arduino SCL), SDA (I2C data → Arduino SDA), VBAT (entrada pila 3V, a GND si no se usa).
Fabricar placa display 7 segmentos
Módulo compacto auto-contenido: 4 displays 7 segmentos cátodo común. Multiplexado: segmentos comparten ánodos; cada dígito tiene su cátodo común → control independiente. Reduce pines de 32 a 11-12.
Segmentos necesitan resistencias limitadoras (330–470 Ω a 5V; 220 Ω con Li-Ion). Transistores driver (2N2222) recomendados: pines MCU dan ~40 mA; al encender 7 segmentos (dígito 8) se supera. Esquema: 4 transistores 2N2222, resistencias 1K base, 220R segmentos. Arduino: D10–D17 → segmentos (a–g, dp); D6–D9 → dígitos (D0–D3). Pulsador en D2 (INT0) para opciones y wake-up por interrupción hardware.
Conectar display con Arduino Pro Mini
Suelda pines segmentos a Arduino Mini según esquemático. 4 cátodos comunes → colectores de transistores. Bases → pines Arduino. Pulsador → D2 (INT0). ¡Importante: D2 para wake-up por interrupción externa!
Conectar módulo RTC y zumbador
RTC: SDA → A4, SCL → A5. Zumbador → D3.
Fijar sensor ultrasónico en tapón
Haz agujero en tapón. Pasa 4 hilos del sensor y fíjalo en centro, cara interior.
Conexiones: VCC→VCC, GND→GND, Trigger→D4, Echo→D5.
Subir programa y testear
Librerías necesarias: OneButton (pulsador), LowPower (sleep), DS1307RTC (RTC). Implementé sleep mode: watchdog timer + interrupción externa (pulsador) para wake-up. Arduino toma 3 lecturas, promedia, calcula, muestra 10 s y duerme 1 min. Despierta al pulsar botón (INT0). Sin pulsación, lectura cada 1 min.
Algoritmo de cálculo (resumen): media de 5 lecturas para precisión. Reinicio diario a las 24h. Promedio semanal = media de 7 días previos. Si pasan 2h sin beber → doble pitido cada 15 min; cesa 2h tras beber.
Fijar Arduino al tapón
Pega Arduino Pro Mini en cara superior del tapón con silicona caliente. Todo debe caber dentro del tapón.
Montar batería y cargador
Batería Li-Ion sobre Arduino (evita cortocircuitos con pines al aire). Conecta módulo cargador; deja puerto USB accesible desde fuera.
Impermeabilizar toda la electrónica
¡Crítico! Es una botella de agua. Cubre toda la electrónica exterior con silicona (menos puerto USB). Da forma redondeada al tapón original.
No sumerjas el tapón en agua.
¡Disfrútalo!
Código
Sketch Arduino
#include <Time.h> #include <TimeLib.h> #include <Wire.h> #include <DS1307RTC.h> #include "LowPower.h" #include "OneButton.h"
OneButton button(2, true);
const byte interruptPin = 2;
volatile int state = 0;
const int trigPin = 4;
const int echoPin = 5;
int piezoPin = 3;
const int digit[4] = {9,6,7,8};
int digit_value[4], digit_value1[4];
int button_press_count = 1;
const int segment[8] = {16,10,12,14,15,17,11,13};
const byte number[10][8] = {
{1,1,1,1,1,1,0,0}, //0
{0,1,1,0,0,0,0,0}, //1
{1,1,0,1,1,0,1,0}, //2
{1,1,1,1,0,0,1,0}, //3
{0,1,1,0,0,1,1,0}, //4
{1,0,1,1,0,1,1,0}, //5
{1,0,1,1,1,1,1,0}, //6
{1,1,1,0,0,0,0,0}, //7
{1,1,1,1,1,1,1,0}, //8
{1,1,1,1,0,1,1,0} //9
};
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 seconds, minutes, hours;
int water_in_ounch[15], water_intake_ounch[15], water_intake_days[7];
int water_intake_times = 0, previous_water_amount = 0, total_water_intake_today = 0;
int average_intake_last_week = 0, inatke_day = 1;
float average_water_level = 0, water_amount_in_ounce = 0;
int idle_time = 0, intake_day = 1, previous_value = 0;
void setup() {
Serial.begin(9600);
pinMode(interruptPin, 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);
}
long previous_state = millis();
int count = 1, daily_intake = 0, weekly_intake = 0;
long sleep_time = millis();
void loop() {
read_time(); button.tick(); calculation();
daily_intake = total_water_intake_in_day();
weekly_intake = average_water_intake_last_week();
if(button_press_count == 1) { display_d(); display_number(daily_intake); }
else if(button_press_count == 2) { display_a(); display_number(weekly_intake); }
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(); }
if((millis() - sleep_time) >= 15000) {
display_off();
attachInterrupt(digitalPinToInterrupt(interruptPin), blank, FALLING);
for(int i=0;i<6;i++) LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
detachInterrupt(digitalPinToInterrupt(interruptPin));
sleep_time = millis();
}
}
// Funciones de display, cálculo, sensor ultrasónico, alertas, botones... (ver código original completo)
Esquemáticos
Esquemas del circuito RTC, display, conexiones principales (imágenes referenciadas).
Proceso de manufactura
- Cómo Funcionan los Aspersores de Césped: Diseño, Historia y Fabricación Moderna
- Tecnología del lavavajillas: historia, diseño e innovaciones futuras
- La Evolución de las Pistolas de Agua de Acción de Bombeo: De la Invención al Liderazgo Global
- La Evolución, Materiales y Fabricación de los Inodoros Modernos
- Hidrantes contra Incendios: Diseño, Fabricación y Papel en la Seguridad Urbana
- Evolución y Ciencia detrás de las Botellas Térmicas Modernas
- Agua: Historia, Tipos y Procesos Modernos de Tratamiento
- La ciencia detrás del champú: ingredientes, fabricación y tendencias futuras
- Dinamita: historia, usos y seguridad en demolición y minería
- Circuitos integrados (CI): chips compactos y potentes que impulsan la electrónica moderna
- Kit MOSMusic: Control de Iluminación de Alta Potencia Sincronizada con Música vía MOSFET y Arduino