This shows you the differences between two versions of the page.
|
pm:prj2026:vlad.radulescu2901:amarinescu0804 [2026/05/23 14:14] amarinescu0804 [Descrierea codului aplicației (firmware)] |
pm:prj2026:vlad.radulescu2901:amarinescu0804 [2026/05/24 21:34] (current) amarinescu0804 [Hardware Design] |
||
|---|---|---|---|
| Line 40: | Line 40: | ||
| **Module hardware**: | **Module hardware**: | ||
| + | |||
| + | * **Placă de dezvoltare (Microcontroler ATmega328P):** „Creierul” sistemului. Preia datele analogice și digitale, procesează logica automatului finit (State Machine) folosind timere hardware interne și comandă atât interfața, cât și elementele de execuție. | ||
| * **Senzor umiditate sol** – utilizat pentru a măsura în timp real nivelul de hidratare al substratului plantei și pentru a trimite datele către convertorul ADC. | * **Senzor umiditate sol** – utilizat pentru a măsura în timp real nivelul de hidratare al substratului plantei și pentru a trimite datele către convertorul ADC. | ||
| Line 51: | Line 53: | ||
| * **Butoane de control** – folosite pentru interacțiunea cu utilizatorul, permițând schimbarea regimului de funcționare (Automat/Cronometrat/Hibrid) și setarea pragurilor. | * **Butoane de control** – folosite pentru interacțiunea cu utilizatorul, permițând schimbarea regimului de funcționare (Automat/Cronometrat/Hibrid) și setarea pragurilor. | ||
| - | {{ :pm:prj2026:vlad.radulescu2901:schema_electrica_aquabuddy.png?600 |}} | + | {{ :pm:prj2026:vlad.radulescu2901:aquabuddy_schema_electrica.png?600 |}} |
| ==== Descrierea conexiunilor și a pinilor utilizați ==== | ==== Descrierea conexiunilor și a pinilor utilizați ==== | ||
| Line 82: | Line 84: | ||
| **Librării și surse 3rd-party:** | **Librării și surse 3rd-party:** | ||
| - | * S-au folosit librăriile standard din ''avr-libc'': ''<avr/io.h>'' (pentru regiștri), ''<util/delay.h>'' (pentru temporizări), ''<avr/interrupt.h>'' (pentru vectorii de întreruperi) și ''<stdlib.h>''. | + | * S-au folosit librăriile standard din ''avr-libc'': ''<avr/io.h>'' (pentru regiștri), ''<avr/interrupt.h>'' (pentru vectorii de întreruperi) și ''<stdlib.h>''. |
| * Comunicarea I2C (TWI) și protocolul de trimitere a pachetelor de 4 biți către display-ul LCD au fost implementate direct pe regiștri. | * Comunicarea I2C (TWI) și protocolul de trimitere a pachetelor de 4 biți către display-ul LCD au fost implementate direct pe regiștri. | ||
| + | * S-a eliminat complet utilizarea funcțiilor blocante din ''<util/delay.h>'', trecându-se la o arhitectură 100% Non-Blocking bazată pe timere hardware. | ||
| **Algoritmi și structuri implementate:** | **Algoritmi și structuri implementate:** | ||
| - | * **Arhitectură bazată pe Întreruperi și Steaguri (Flags):** Citirea butoanelor se face prin întreruperi externe (''INT0'', ''INT1'', ''PCINT2''). Pentru a nu bloca procesorul, rutinele de tratare (ISR) doar setează variabile de tip ''volatile'', acțiunile propriu-zise fiind executate asincron în bucla principală ''while(1)''. | + | * **Arhitectură Non-Blocking (10ms System Tick):** „Inima” sistemului este **Timer1**, configurat în modul CTC pentru a genera o întrerupere la exact 10 milisecunde. Această variabilă globală acționează ca un ceas al sistemului de operare, permițând rularea multitasking-ului cooperativ fără a opri procesorul. |
| - | * **State Machine (Automat cu stări finite):** Logica principală este structurată pentru a comuta între cele 3 stări/moduri de operare (Automat, Cronometrat, Hibrid) și pentru a actualiza interfața (meniul LCD) în funcție de modul curent. | + | * **Debounce Software Asincron:** Citirea butoanelor se face prin întreruperi externe (''INT0'', ''INT1'', ''PCINT2''), care doar setează niște flaguri. Tratarea lor se face în bucla principală folosind un filtru de timp (20 de ticks = 200ms) raportat la ceasul sistemului, ignorând vibrațiile mecanice fără a utiliza funcții de delay. |
| + | * **Control Volumetric și Soft-Start (PWM):** Udarea nu se face pe bază de timp brut, ci volumetric (ex: 50 ml). S-a implementat o constantă a debitului pompei, iar sistemul calculează dinamic fracțiunile de 10ms necesare pentru cantitatea dorită. Suplimentar, s-a utilizat Timer0 pe pinul PD6 (Fast PWM) pentru a crea o rampă de accelerare a motorului (Soft-Start), eliminând presiunea bruscă de pe furtun. | ||
| + | * **State Machine (UI & Operare):** Logica principală este structurată pentru a comuta între 4 ecrane de interfață (**Monitorizare Acasă**, **Setare Prag Sol**, **Setare Timp Udare**, **Setare Volum Apă**) și 3 moduri operaționale (**Auto**, **Timed**, **Hybrid**), garantând că display-ul este actualizat (refresh) doar atunci când apar modificări sau o dată pe secundă, economisind timp de procesare pe magistrala lentă I2C. | ||
| + | * **Monitorizare și Debugging (USART):** Pe parcursul dezvoltării, s-a implementat comunicarea serială prin interfața USART. Aceasta a fost esențială pentru diagnosticarea în timp real a sistemului (monitorizarea valorilor brute citite de convertorul ADC de la senzorul de sol, verificarea stărilor din automatul finit și validarea calculelor matematice pentru dozajul volumetric), permițând o separare clară și rapidă a problemelor de tip hardware de cele software. | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | + | {{ :pm:prj2026:vlad.radulescu2901:aquabuddy_cutie.jpeg?600 |}} |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
| - | </note> | + | |
| + | Rezultatul final este un sistem de irigații automatizat stabil și complet portabil, fiind alimentat independent de la o baterie externă. Sistemul monitorizează precis umiditatea solului, livrează volumetric cantitatea exactă de apă prin accelerarea treptată a pompei (Soft-Start), rulează o arhitectură non-blocking ce previne înghețarea codului și oferă utilizatorului o interfață fluidă, cu feedback instantaneu pe ecranul LCD. | ||
| + | |||
| + | Un video demonstrativ se poate găsi în secțiunea de jurnal, unde este demonstrată întreaga funcționalitate a proiectului (în afara cutiei). | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | ===== Download ===== | + | Dezvoltarea acestui proiect a reprezentat o oportunitate excelentă de a transpune conceptele teoretice de microprocesoare într-o aplicație practică de utilitate reală. Cea mai importantă reușită a proiectului a fost implementarea unei arhitecturi software complet non-blocking (multitasking cooperativ bazat pe timere hardware), care oferă sistemului un timp de răspuns instantaneu la interacțiunea cu utilizatorul. |
| - | <note warning> | + | **Provocări întâmpinate și rezolvate:** |
| - | 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ă ;-). | + | Pe parcursul dezvoltării, interfațarea motorului de curent continuu al pompei cu partea logică a ridicat două probleme majore, ambele rezolvate prin decizii tehnice specifice: |
| - | 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**. | + | * **Izolarea alimentării:** Inițial, alimentarea pompei direct din linia de 5V a microcontrolerului cauza căderi bruște de tensiune la pornirea motorului (din cauza curentului mare de start), ceea ce destabiliza complet funcționarea sistemului. Soluția a fost separarea planurilor de putere: pompa este acum alimentată dintr-un pachet dedicat de baterii externe, păstrând doar masa (GND) comună cu placa logică pentru referința semnalului PWM. |
| - | </note> | + | |
| + | * **Gestionarea interferențelor:** La oprirea bruscă a pompei se genera tensiune de autoinducție, iar paraziții electromagnetici corupeau memoria RAM a ecranului. Problema a fost mascată din software: s-a implementat o rutină asincronă de Auto-Recovery care detectează oprirea pompei și forțează o reinițializare rapidă a ecranului (sub 60ms), restabilind interfața fără blocaje perceptibile. | ||
| + | ===== Download ===== | ||
| + | [[https://github.com/andrei-48/Aquabuddy-PM|Github Proiect]] | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| - | 16.05.2026 | + | 16.05.2026 |
| - | * Pentru etapa de hardware am facut un cod prvizoriu ca sa demonstrez ca toate componentele sunt functionale: Cele 3 butoane afiseaza pe LCD cand sunt apasate. Senzorul trimite o valoare citita la USART odata la 30 de secunde, iar pompa poate fi activata din USART prin comanda "on". | + | |
| + | * Pentru etapa de hardware am făcut un cod provizoriu ca să demonstrez că toate componentele sunt funcționale: Cele 3 butoane afișează pe LCD când sunt apăsate. Senzorul trimite o valoare citită la USART odată la 30 de secunde, iar pompa poate fi activată din USART prin comanda "on". | ||
| {{:pm:prj2026:vlad.radulescu2901:poza_jurnal_aquabuddy1.jpeg?400|}} {{:pm:prj2026:vlad.radulescu2901:poza_jurnal_aquabuddy2.jpeg?400|}} | {{:pm:prj2026:vlad.radulescu2901:poza_jurnal_aquabuddy1.jpeg?400|}} {{:pm:prj2026:vlad.radulescu2901:poza_jurnal_aquabuddy2.jpeg?400|}} | ||
| - | |||
| https://youtu.be/5-j5lsSoZKQ | https://youtu.be/5-j5lsSoZKQ | ||
| - | Video pentru demonstrarea functionalitatii pompei si a senzorului (vizibil pe USART - 1022/1023 senzorul fiind lasat liber) | ||
| + | Video pentru demonstrarea funcționalității pompei și a senzorului (vizibil pe USART - 1022/1023 senzorul fiind lăsat liber) | ||
| + | 23.05.2026 | ||
| + | |||
| + | * Pentru etapa software am implementat codul final (mai prezintă mici bug-uri ce vor fi rezolvate). Am schimbat alimentarea pompei trecând la o sursă separată de curent pe 4 baterii (6V). Am schimbat VCC-ul senzorului la pinul PD7 pentru a reduce consumul de curent și pentru a evita efectul de electroliză care poate degrada senzorul. | ||
| + | {{:pm:prj2026:vlad.radulescu2901:poza_jurnal_aquabuddy3.jpeg?600|}} | ||
| + | |||
| + | https://youtu.be/iVb_wFHDsnE | ||
| + | |||
| + | Video care demonstrează toate funcționalitățile implementate în sistem. În clip sunt prezentate: navigarea prin interfață pentru selectarea modului de funcționare, configurarea pragurilor (timp și umiditate) și setarea volumului de apă dorit. De asemenea, este surprinsă declanșarea pompei (evidențiind efectul de accelerare treptată prin Soft-Start), inițiată atât pe baza temporizatorului, cât și a atingerii pragului critic de umiditate (pentru a simula un sol uscat și a forța declanșarea sistemului, senzorul a fost extras intenționat din pământ în timpul demonstrației). | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| - | <note> | + | 1. Documentație Hardware (Datasheets): |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | |
| - | </note> | + | * **Microchip ATmega328P Datasheet** – Pentru configurarea la nivel de regiștri a Timerelor (0 și 1), a convertorului analog-digital (ADC), a magistralei I2C (TWI) si pentru a utiliza pinii corecți. |
| + | |||
| + | * **Hitachi HD44780 LCD Controller** – Utilizat pentru a înțelege timpii de execuție (delay-urile necesare la inițializare) și setul de comenzi pe 4-biți. | ||
| + | |||
| + | * **NXP PCF8574 I2C Expander** – Documentația modulului de pe LCD, necesară pentru implementarea protocolului de comunicare. | ||
| + | |||
| + | * **Vishay IRF520 MOSFET** – Specificațiile tranzistorului de putere folosit pentru controlul pompei de apă. | ||
| + | |||
| + | 2. Documentație Software și Mediu de Dezvoltare: | ||
| + | |||
| + | * **AVR C Runtime Library (avr-libc)** – Documentația oficială pentru bibliotecile folosite în proiect (<avr/io.h>, <avr/interrupt.h>, <avr/wdt.h>). | ||
| + | |||
| + | 3. Resurse Academice: | ||
| + | |||
| + | * **OCW UPB** - Proiectare cu Microprocesoare – Suportul de curs și laboratoare (în special laboratoarele de Timere, ADC și I2C) care au stat la baza dezvoltării arhitecturii acestui proiect. | ||
| <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> | ||