This is an old revision of the document!
Monitor de Hidratare
Introducere
Monitor de Hidratare este un dispozitiv compact de monitorizare a consumului zilnic de apa.
Ce face: Sistemul functioneaza ca un cantar inteligent pe care utilizatorul asaza sticla de apa. Dispozitivul masoara in timp real greutatea sticlei si calculeaza automat cantitatea de apa consumata, afisand progresul pe un ecran OLED. Un buzzer emite notificari sonore periodice pentru a reaminti utilizatorului sa bea apa.
Scopul proiectului: Hidratarea corecta este esentiala pentru sanatate, dar majoritatea oamenilor uita sau nu stiu exact cat au baut intr-o zi. Dispozitivul automatizeaza acest proces fara ca utilizatorul sa faca nimic altceva decat sa aseze sticla pe platforma.
Ideea de pornire: Proiectul a pornit de la nevoia personala de a monitoriza consumul de apa intr-un mod pasiv, fara aplicatii de telefon sau introducere manuala a datelor.
Utilitate: Dispozitivul este util oricui doreste sa isi formeze obiceiuri sanatoase de hidratare, in special persoanelor care petrec mult timp la birou sau la calculator.
Descriere generală
Schema Bloc
Module si interactiuni:
ATmega328PB: unitatea centrala de procesare. Citeste datele de la HX711, calculeaza consumul de apa, actualizeaza display-ul si gestioneaza butoanele si buzzerul.
Load Cell 5kg + HX711: senzorul de greutate trimite un semnal analogic catre HX711, care il amplifica si il converteste la semnal digital pe 24 biti, transmis catre microcontroller prin 2 fire (CLK + DAT).
Display OLED SSD1306: afiseaza informatii despre greutatea curenta, cantitatea de apa consumata si obiectivul zilnic. Comunicare prin I2C.
Butoane: permit utilizatorului sa seteze obiectivul zilnic de hidratare, sa efectueze functia tare (zero) si sa navigheze in meniu.
Buzzer pasiv: emite semnale sonore la intervale regulate (reminder de hidratare) sau la atingerea obiectivului zilnic. Controlat prin semnal PWM.
Laboratoare utilizate
Lab 0 - GPIO — butoanele de navigare si modulul buzzer sunt conectate prin pini GPIO
Lab 2 - Intreruperi — folosesc intreruperea Timer2 pentru debounce-ul butoanelor si pentru masurarea timpului de stabilizare
Lab 3 - Timere si PWM — buzzerul pasiv este controlat prin semnal PWM, iar reminderele de hidratare sunt generate cu un timer periodic
Lab 6 - I2C — comunicarea cu display-ul OLED SSD1306 se face prin protocolul I2C
Hardware Design
Lista de piese
| Nr. | Componenta | Cantitate | Rol in proiect |
| 1 | Load Cell 5kg | 1 buc. | Senzorul care simte cat cantareste sticla in fiecare moment |
| 2 | Modul HX711 | 1 buc. | Preia semnalul slab de la load cell si il face utilizabil pentru microcontroller |
| 3 | Ecran OLED SSD1306 0.96” | 1 buc. | Afiseaza progresul de hidratare in timp real |
| 4 | ATmega328P Xplained Mini | 1 buc. | Creierul intregului sistem, coordoneaza toate celelalte componente |
| 5 | Modul Buzzer Pasiv 5V | 1 buc. | Reaminteste utilizatorului sa bea apa daca trece prea mult timp fara consum |
| 6 | Butoane PCB Mini 6x6x5mm | 3 buc. | Permit setarea obiectivului zilnic si resetarea cantarului |
| 7 | Kit rezistente | 1 set | Rezistente de pull-up pentru butoane |
| 8 | Fire Dupont M-F | 1 set | Leaga modulele externe la placa fara lipire |
| 9 | Fire breadboard M-M | 1 set | Conexiuni rapide intre componente pe breadboard |
| 10 | Breadboard 830 pini | 1 buc. | Permite testarea circuitului fara lipire permanenta |
| 11 | Cablu Micro-USB | 1 buc. | Alimentare si programare placa de la laptop sau power bank |
Schema electrica
Pini folositi
| Componenta | Pin componenta | Pin ATmega328P Xplained Mini | Explicatie |
| HX711 | VCC | 5V | Modulul este alimentat la 5V de la placa |
| HX711 | GND | GND | Toate componentele trebuie sa aiba masa comuna |
| HX711 | DAT / DOUT | PD2 | Pin digital folosit pentru citirea datelor de la HX711 |
| HX711 | CLK / SCK | PD3 | Pin digital folosit pentru semnalul de clock catre HX711 |
| OLED SSD1306 | VDD / VCC | 5V | Display-ul este alimentat de la placa |
| OLED SSD1306 | GND | GND | Masa comuna |
| OLED SSD1306 | SDA | PC4 / SDA | Pinul standard pentru date I2C |
| OLED SSD1306 | SCL | PC5 / SCL | Pinul standard pentru clock I2C |
| Buton UP | semnal | PD4 | Buton pentru navigare in meniu |
| Buton DOWN | semnal | PD5 | Buton pentru navigare in meniu |
| Buton OK/TARE | semnal | PD6 | Buton pentru confirmare si resetarea cantarului |
| Buzzer pasiv | semnal / + | PB1 / OC1A | Pin potrivit pentru PWM, folosit pentru generarea sunetului |
| Buzzer pasiv | GND / - | GND | Masa comuna |
Schema
Butoanele vor fi citite folosind rezistentele interne de pull-up ale microcontrollerului. Asta inseamna ca un pin al butonului merge la pinul digital, iar celalalt merge la GND. Cand butonul este apasat, pinul este tras la 0 logic.
Am ales pinii PC4 si PC5 pentru OLED deoarece acestia sunt pinii dedicati pentru I2C. Pentru buzzer am ales PB1, deoarece poate fi folosit cu PWM. Pentru HX711 am folosit PD2 si PD3 pentru ca modulul are nevoie doar de doua linii digitale: una pentru date si una pentru clock.
Software Design
In stadiul actual, partea software a proiectului este functionala si integreaza toate componentele principale ale sistemului.
Functionalitatile implementate pana acum sunt:
citirea greutatii de la load cell prin modulul HX711
calibrarea cantarului folosind o greutate cunoscuta
selectarea obiectivului zilnic de hidratare dintr-un meniu initial
controlul meniului folosind 3 butoane externe: UP, DOWN si OK
afisarea progresului pe display-ul OLED SSD1306
feedback sonor prin buzzer pasiv
calcularea cantitatii de apa consumate pe baza diferentei de greutate
detectarea refill-ului, fara a-l adauga la cantitatea consumata
actualizarea progresului doar atunci cand greutatea este stabila
La pornire, utilizatorul alege un goal de apa din 3 variante predefinite. Dupa confirmarea cu butonul OK, sistemul face tare pe platforma goala, apoi asteapta ca utilizatorul sa puna sticla pe cantar. Dupa ce greutatea se stabilizeaza, sistemul salveaza greutatea curenta ca referinta si permite inceperea consumului.
Structura codului
Codul este impartit in mai multe zone logice:
initializare periferice: UART, HX711, butoane, buzzer, I2C, OLED si Timer2
citire butoane: butoanele UP, DOWN si OK sunt citite cu pull-up intern si debounce software
meniu goal: la pornire, utilizatorul alege unul dintre cele 3 obiective predefinite
citire greutate: HX711 este citit prin 24 de biti, apoi valoarea raw este convertita in grame folosind factorul de calibrare
logica de stabilizare: progresul nu este actualizat imediat, ci doar dupa ce greutatea ramane stabila cateva secunde
logica de consum: daca greutatea stabila scade, diferenta este considerata apa bauta
logica de refill: daca greutatea stabila creste, sistemul considera ca sticla a fost reumpluta si actualizeaza referinta
afisare OLED: ecranul afiseaza procentul realizat, cantitatea bauta, cantitatea ramasa si goal-ul curent
feedback sonor: buzzerul confirma evenimente precum startul, stabilizarea sticlei, refill-ul sau atingerea goal-ului.
Interactiunea dintre functionalitati
Fluxul principal al aplicatiei este urmatorul:
utilizatorul porneste sistemul
pe OLED apare meniul de alegere a goal-ului
butoanele UP si DOWN schimba valoarea selectata
butonul OK confirma goal-ul
sistemul face tare pe platforma goala
utilizatorul pune sticla pe platforma
dupa ce greutatea este stabila, buzzerul da semnal ca sistemul este pregatit
utilizatorul bea apa sau reumple sticla
sistemul asteapta din nou stabilizarea greutatii
daca greutatea a scazut, diferenta este adaugata la progres
daca greutatea a crescut, sistemul considera ca este refill si actualizeaza noua referinta
Prin aceasta logica, sistemul evita sa adauge apa consumata in timp ce sticla este miscata, in timp ce se toarna apa sau in timp ce se bea direct din ea.
Calibrarea senzorului de greutate
Pentru calibrarea load cell-ului am folosit o greutate cunoscuta. Mai intai am facut tare cu platforma goala, pentru a salva offset-ul sistemului. Apoi am pus pe cantar o greutate masurata separat si am citit valoarea raw de la HX711.
Factorul de calibrare este calculat cu formula:
unde:
net_raw este diferenta dintre valoarea raw cu greutate si offset
greutate_cunoscuta este greutatea reala, masurata pe un cantar de bucatarie.
calibration_factor = net_raw / greutate_cunoscuta
Dupa calibrare, am testat sistemul cu o sticla cantarita separat. Valorile afisate de sistem au fost apropiate de cele de pe cantarul de bucatarie, deci calibrarea a fost considerata corecta pentru scopul proiectului.
Pentru logica de hidratare, am masurat si greutatea sticlei goale. Sticla goala folosita in teste are 140 g. Aceasta valoare este folosita pentru a estima cata apa se afla in sticla:
apa_din_sticla = greutate_totala - greutate_sticla_goala
Validarea functionalitatilor
Am testat fiecare componenta separat inainte de integrarea finala:
HX711 a fost testat prin UART, verificand valorile raw si greutatea calculata
OLED-ul a fost testat initial cu un mesaj simplu, apoi cu text si bara de progres
buzzerul a fost testat separat cu Timer1, generand un semnal sonor pe PB1
butoanele externe au fost testate individual pe PD4, PD5 si PD6
meniul de goal a fost testat prin schimbarea valorilor cu UP/DOWN si confirmarea cu OK
algoritmul de consum a fost testat prin ridicarea sticlei, scaderea cantitatii de apa si repunerea ei pe cantar.
Pentru debug am folosit UART, unde se afiseaza greutatea totala, apa estimata din sticla, cantitatea consumata, cantitatea ramasa si goal-ul ales.
Optimizari realizate
O prima optimizare a fost sa nu actualizez OLED-ul continuu daca valorile afisate nu s-au schimbat. Display-ul este rescris doar cand se modifica progresul sau goal-ul. Astfel, se reduce timpul petrecut in comunicarea I2C si ecranul nu mai pare ca face refresh inutil.
A doua optimizare a fost introducerea unei logici de stabilizare a greutatii. In loc sa actualizez progresul la fiecare citire, sistemul asteapta ca greutatea sa ramana aproximativ constanta timp de cateva secunde. Aceasta optimizare este importanta pentru ca evita masuratori gresite atunci cand utilizatorul misca sticla sau toarna apa.
A treia optimizare a fost folosirea Timer2 pentru debounce-ul butoanelor, in loc sa folosesc delay-uri mari in bucla principala. Astfel, apasarile sunt detectate mai stabil, iar codul ramane mai usor de controlat.
Element de noutate
Elementul de noutate al proiectului este faptul ca sistemul nu este doar un cantar care afiseaza greutatea, ci interpreteaza schimbarile de greutate pentru a estima consumul de apa. Sistemul diferentiaza intre trei situatii:
sticla a fost pusa pe cantar
sticla a devenit mai usoara, deci utilizatorul a baut apa
sticla a devenit mai grea, deci a fost reumpluta.
In plus, progresul se actualizeaza doar dupa ce greutatea este stabila. Astfel, sistemul nu adauga progres fals in timp ce sticla este miscata sau in timp ce se toarna apa.
Rezultate Obţinute
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
Concluzii
Download
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună

.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Jurnal
Etapa 1 de Hardware
Am conectat pe breadboard primele componente ale proiectului: placa ATmega328P Xplained Mini, modulul HX711 si display-ul OLED.
Modulul HX711 este legat la load cell si la microcontroller prin pinii DAT si CLK, pentru citirea greutatii.
Display-ul OLED este conectat prin I2C, pe pinii SDA si SCL, si a fost testat cu un mesaj simplu pe ecran.
In aceasta etapa am verificat separat ca partea de cantarire comunica prin UART si ca display-ul porneste corect.
Bibliografie/Resurse
Resurse hardware
Resurse software / scheme