Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:atoader:aureliu.antonie [2026/05/20 23:51]
aureliu.antonie [Software Design]
pm:prj2026:atoader:aureliu.antonie [2026/05/22 23:33] (current)
aureliu.antonie [Jurnal]
Line 34: Line 34:
 Laboratoare folosite: Laboratoare folosite:
  
-Intreruperi ​(butoanele care: pornesc aparatul, ​schimba ​modul de afisaj ​etc.)+Întreruperi ​(butoanele care: pornesc aparatul, ​schimbă ​modul de afișaj ​etc.)
  
-- PWM (intensitatea LED-urilor de progres ​creste ​treptat)+- PWM (intensitatea LED-urilor de progres ​crește ​treptat)
  
-- I2C (Afisajul ​LCD si modulul RTC)+- I2C (Afișajul ​LCD și modulul RTC
 + 
 +- UART (Pentru calibrarea senzorului de greutate)
  
 Module externe: ​ Module externe: ​
Line 44: Line 46:
 -  Timere (RTC)  -  Timere (RTC) 
  
--  ADC (modulul HX711, care transforma ​semnalul analogic primit de la senzor ​intr-unul digital)+-  ADC (modulul HX711, care transformă ​semnalul analogic primit de la senzor ​într-unul digital)
 ===== Hardware Design ===== ===== Hardware Design =====
  
Line 106: Line 108:
  
 ===== Software Design ===== ===== Software Design =====
-Am terminat partea de software design, integrând toate funcționalitățile menționate mai sus. + 
 +Am terminat partea de software design, integrând toate funcționalitățile menționate mai sus.
  
 Am folosit bibliotecile:​ Am folosit bibliotecile:​
  
-HX711 pentru a putea conecta senzorul de greutate la breadboard, ​cat si pentru a putea interpreta datele primite+HX711 pentru a putea conecta senzorul de greutate la breadboard, ​cât și pentru a putea interpreta datele primite
  
-LiquidCrystal_I2C pentru a afisa diferite mesaje pe ecranul LCD+LiquidCrystal_I2C pentru a afișa ​diferite mesaje pe ecranul LCD
  
-RTClib pentru a putea realiza statisticile ​mentionate, spre exemplu ​cata apa am baut in ziua respectiva+RTClib pentru a putea realiza statisticile ​menționate, spre exemplu ​câtă apă am băut în ziua respectivă
  
-* EEPROM ​pentru a putea salva statisticile si daca dozatorul nu mai este alimentat+- SoftPWM ​pentru a varia intensitatea ledurilor
  
-* Wire pentru ​comunicarea I2C+- EEPROM ​pentru ​a putea salva statisticile chiar și dacă dozatorul nu mai este alimentat
  
-Elementele de noutate ale proiectului sunt reprezentate de functionalitatile diverse:+- Wire pentru comunicarea I2C
  
-- utilizatorul poate seta la inceput volumul sticlei folosite (de la 50ml la 1000ml, increment ​de 50ml)+Elementele ​de noutate ale proiectului sunt reprezentate ​de funcționalitățile diverse:
  
-dupa ce se aseaza sticla cu apa initialasenzorul detecteaza exact masa, luand in calcul masa sticlei goale si a furtunului+utilizatorul poate seta la început volumul sticlei folosite (de la 50 ml la 1000 mlincrement de 50 ml)
  
-la pornirea dozatorului,​ progresul este afisat atat pe baza ledurilor (acestea ​se aprind alternativvariand intensitatea pe masura trecerii timpului)cat si prin intermediul ecranului LCD (afiseaza timpul ramas)+după ce se așază sticla cu apa inițialăsenzorul detectează exact masaluând în calcul masa sticlei goale
  
-exista mai multe moduri de afisaj ​(timpul ramas sau cantitatea de apa consumata in ziua respectivaacest lucru fiind foarte important in nutritie)+la pornirea dozatorului,​ progresul este afișat atât pe baza LED-urilor ​(acestea se aprind alternativvariind intensitatea pe baza volumului rămas), cât și prin intermediul ecranului LCD (afișează volumul rămas)
  
-dupa ce sticla se umplese poate pune o noua sticla, fara a fi necesara repornirea aparatului+există mai multe moduri de afișaj (volumul rămas sau cantitatea de apă consumată în ziua respectivăacest lucru fiind foarte important în nutriție)
  
-Senzorul de greutate a fost calibrat pe baza unui cod software. Acesta ​poate fi vizualizat ​pe [[https://​github.com/​AntonieValentin/​Dozator-de-apa-inteligent/​commit/​44f2458279bb0449c95a98473be8f0663289ac63|git]]. Am pus pe cantar o sticla cu masa cunoscuta (250 ml)iar apoi am reglat software factorul de calibrare, prin usart.+- dozatorul se poate pune pe pauză în orice momentrespectiv se poate relua activitatea rămasă
  
-Ca mediu de dezvoltare am folosit VS Code cu extensia ​ Platformioframework Arduino.+- după ce sticla se umplese poate pune o nouă sticlă, fără a fi necesară repornirea aparatului
  
-<note tip> +Codul propriu-zis se bazează pe un automat de stări circular, astfel:
-Descrierea codului aplicaţiei (firmware):​ +
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) DONE +
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) DONE +
-  * algoritmi şi structuri ​pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate +
-</​note>​+
  
 +- starea 0 (selecția) - se citește starea butoanelor. În această etapă, butoanele sunt utilizate pentru selectarea volumului sticlei
 +
 +- starea 1 (așteptare) - se așteaptă punerea sticlei pe cântar și calcularea masei
 +
 +- starea 2 (umplere) - microcontrolerul acționează releul, pornind pompa
 +
 +- starea 3 (pauză) - pompa este oprită, iar totul (LCD, releul etc.) este pus pe pauză, în standby
 +
 +- starea 4 (finalizarea) - pompa s-a oprit, se salvează statisticile în EEPROM și se așteaptă ca sticla să fie ridicată. După ce se ridică sticla, se pornește din nou din starea 0
 +
 +Senzorul de greutate a fost calibrat pe baza unui cod software. Acesta poate fi vizualizat pe [[https://​github.com/​AntonieValentin/​Dozator-de-apa-inteligent/​commit/​44f2458279bb0449c95a98473be8f0663289ac63|git]]. Am pus pe cântar o sticlă cu masă cunoscută (250 ml), iar apoi am reglat, prin UART, factorul de calibrare din software.
 +
 +Optimizări:​
 +
 +- întreruperi externe (ca să nu facem polling) - proiectul este destul de complex. Fără întreruperi nu puteam detecta simultan și masa sticlei, și starea butonului etc.
 +
 +- debouncing (software) - pentru a se înregistra o singură apăsare
 +
 +- variabile volatile - pentru a nu fi optimizat accesul de către compilator
 +
 +- timere în loc de delay - pentru a nu bloca execuția inutil
 +
 +- accesul EEPROM - modificăm cantitatea de apă băută numai după ce sticla s-a umplut complet, pentru a proteja memoria sensibilă EEPROM
 +
 +Ca mediu de dezvoltare am folosit VS Code cu extensia PlatformIO, framework Arduino.
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-[[https://​www.youtube.com/​shorts/​JMbjXX_uIwk|Demonstrație Video]]+[[https://​www.youtube.com/​shorts/​JMbjXX_uIwk|Demonstrație Video Prima Versiune]] 
 + 
 +[[https://​youtube.com/​shorts/​HjKurvxfl2s|Demonstrație Video A Doua Versiune]]
  
 [[https://​github.com/​AntonieValentin/​Dozator-de-ap-inteligent|Link github]] [[https://​github.com/​AntonieValentin/​Dozator-de-ap-inteligent|Link github]]
Line 160: Line 184:
  
 ===== Jurnal ===== ===== Jurnal =====
-Am terminat ​montajul hardware, iar partea de software este aproape finalizată.+Am terminat ​proiectul
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
Line 195: Line 219:
  
 [[https://​github.com/​adafruit/​RTClib|RTClib]] [[https://​github.com/​adafruit/​RTClib|RTClib]]
 +
 +[[https://​github.com/​bhagman/​SoftPWM|SoftPWM]]
  
 [[https://​docs.arduino.cc/​learn/​built-in-libraries/​eeprom/​|EEPROM]] [[https://​docs.arduino.cc/​learn/​built-in-libraries/​eeprom/​|EEPROM]]
pm/prj2026/atoader/aureliu.antonie.1779310297.txt.gz · Last modified: 2026/05/20 23:51 by aureliu.antonie
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0