This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:cristiana.tabacaru [2026/05/18 12:50] cristiana.tabacaru [Circuit] |
pm:prj2026:atoader:cristiana.tabacaru [2026/05/21 19:09] (current) cristiana.tabacaru [Resurse hardware] |
||
|---|---|---|---|
| Line 12: | Line 12: | ||
| ===Schema Bloc=== | ===Schema Bloc=== | ||
| - | {{:pm:prj2026:atoader:schema_bloc_monitor_apa.png?600|}} | + | {{:pm:prj2026:atoader:schema_bloc_monitor_apa.png?700|}} |
| **Module si interactiuni:** | **Module si interactiuni:** | ||
| Line 25: | Line 25: | ||
| * **Lab 0 - GPIO** — butoanele de navigare si modulul buzzer sunt conectate prin pini GPIO | * **Lab 0 - GPIO** — butoanele de navigare si modulul buzzer sunt conectate prin pini GPIO | ||
| - | * **Lab 2 - Intreruperi** — apasarea butoanelor este detectata prin intreruperi externe, nu prin polling | + | * **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 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 | * **Lab 6 - I2C** — comunicarea cu display-ul OLED SSD1306 se face prin protocolul I2C | ||
| Line 75: | Line 75: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | In stadiul actual, partea software a proiectului este functionala si integreaza toate componentele principale ale sistemului. | ||
| + | Functionalitatile implementate pana acum sunt: | ||
| - | <note tip> | + | * citirea greutatii de la load cell prin modulul HX711 |
| - | Descrierea codului aplicaţiei (firmware): | + | * calibrarea cantarului folosind o greutate cunoscuta |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * selectarea obiectivului zilnic de hidratare dintr-un meniu initial |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * controlul meniului folosind 3 butoane externe: UP, DOWN si OK |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * afisarea progresului pe display-ul OLED SSD1306 |
| - | * (etapa 3) surse şi funcţii implementate | + | * feedback sonor prin buzzer pasiv |
| - | </note> | + | * 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 | ||
| - | ===== Rezultate Obţinute ===== | + | 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. |
| - | <note tip> | + | ==== Structura codului ==== |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | |
| - | ===== Concluzii ===== | + | Codul este impartit in mai multe zone logice: |
| - | ===== Download ===== | + | * **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. | ||
| - | <note warning> | + | ==== Interactiunea dintre functionalitati ==== |
| - | 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**. | + | Fluxul principal al aplicatiei este urmatorul: |
| - | </note> | + | |
| + | - 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. | ||
| + | |||
| + | |||
| + | |||
| + | <code> | ||
| + | calibration_factor = net_raw / greutate_cunoscuta | ||
| + | </code> | ||
| + | |||
| + | 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: | ||
| + | |||
| + | <code> | ||
| + | apa_din_sticla = greutate_totala - greutate_sticla_goala | ||
| + | </code> | ||
| + | |||
| + | ==== 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 ===== | ||
| + | Demo Video Youtube | ||
| + | https://youtu.be/LuOfukAbKBs?si=kPDH6Ot64mTcDpZE | ||
| + | |||
| + | |||
| + | ===== Download ===== | ||
| + | |||
| + | {{:pm:prj2026:atoader:monitor_hidratare_final_cristiana_tabacaru.zip|}} | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| Line 108: | Line 194: | ||
| * Display-ul OLED este conectat prin I2C, pe pinii SDA si SCL, si a fost testat cu un mesaj simplu pe ecran. | * 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. | * In aceasta etapa am verificat separat ca partea de cantarire comunica prin UART si ca display-ul porneste corect. | ||
| - | {{:pm:prj2026:atoader:monitor_hidratare_jurnal_1.jpeg?500|}} | ||
| - | |||
| - | {{:pm:prj2026:atoader:monitor_hidratare_jurnal_2.jpeg?500|}} | ||
| - | |||
| - | {{:pm:prj2026:atoader:monitor_hidratare_jurnal_3.jpeg?500|}} | ||
| + | {{:pm:prj2026:atoader:monitor_hidratare_final_hw.png?800|}} | ||
| Line 120: | Line 202: | ||
| ==== Resurse hardware ==== | ==== Resurse hardware ==== | ||
| - | * ATmega328PB Xplained Mini - documentatie Microchip: https://www.microchip.com/en-us/development-tool/ATMEGA328PB-XMINI | + | * ATmega328PB Xplained Mini - documentatie Microchip: |
| - | * Load Cell 5kg: https://www.drot.ro/platforma-arduino/1119-senzor-de-greutate-5-kg.html | + | https://ww1.microchip.com/downloads/en/devicedoc/50002659a.pdf |
| - | * Modul HX711: https://sigmanortec.ro/en/weight-reading-module-hx711-24ad-2-channels-3-5v | + | * Load Cell 5kg: |
| - | * Display OLED SSD1306 0.96": https://www.drot.ro/platforma-arduino/1569-ecran-oled-iic-i2c-0-96-alb-128-x-64.html | + | https://www.drot.ro/platforma-arduino/1119-senzor-de-greutate-5-kg.html |
| - | * Modul buzzer pasiv si butoane: https://sigmanortec.ro/en/passive-buzzer-mode | + | * Modul HX711: |
| + | https://sigmanortec.ro/en/weight-reading-module-hx711-24ad-2-channels-3-5v | ||
| + | * Display OLED SSD1306 0.96": | ||
| + | https://www.drot.ro/platforma-arduino/1569-ecran-oled-iic-i2c-0-96-alb-128-x-64.html | ||
| + | * Modul buzzer pasiv si butoane: | ||
| + | https://sigmanortec.ro/en/passive-buzzer-mode | ||
| ==== Resurse software / scheme ==== | ==== Resurse software / scheme ==== | ||
| * EasyEDA - realizare schema electrica: https://easyeda.com/ | * EasyEDA - realizare schema electrica: https://easyeda.com/ | ||
| - | * Cirkit Designer - schema orientativa de conectare pe breadboard: https://www.cirkitdesigner.com/ | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||