This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:ema_ioana.banescu [2026/05/22 00:48] ema_ioana.banescu [Software Design] |
pm:prj2026:alexandru.jipa2803:ema_ioana.banescu [2026/05/25 03:15] (current) ema_ioana.banescu [Bibliografie] |
||
|---|---|---|---|
| Line 81: | Line 81: | ||
| ===== Poză cu sistemul ===== | ===== Poză cu sistemul ===== | ||
| - | {{https://i.imgur.com/8D1D1aN.jpeg?700| Fotografie cu sistemul}} | + | {{https://i.imgur.com/kdkKjA9.jpeg?700| Fotografie cu sistemul}} |
| ===== Software Design ===== | ===== Software Design ===== | ||
| Line 88: | Line 88: | ||
| * Sistemul implementează un mecanism inteligent de monitorizare și irigare automată a plantelor, utilizând periferice hardware ale microcontrollerului ATmega328P și o arhitectură software modulară, bazată în principal pe task-uri periodice și întreruperi hardware. | * Sistemul implementează un mecanism inteligent de monitorizare și irigare automată a plantelor, utilizând periferice hardware ale microcontrollerului ATmega328P și o arhitectură software modulară, bazată în principal pe task-uri periodice și întreruperi hardware. | ||
| - | Funcționalitățile principale pe care le-am implementat sunt: | + | Funcționalitățile principale pe care le-am implementat sunt: \\ |
| - | 1) Monitorizarea umidității solului | + | |
| - | 2) Monitorizarea temperaturii ambientale | + | 1) Monitorizarea umidității solului \\ |
| - | 3) Monitorizarea intensității luminii | + | 2) Monitorizarea temperaturii ambientale \\ |
| - | 4) Control automat al pompei de apă | + | 3) Monitorizarea intensității luminii \\ |
| - | 5) Control inteligent al ventilatorului prin PWM hardware | + | 4) Control automat al pompei de apă \\ |
| - | 6) Sistem de profiluri pentru plante | + | 5) Control inteligent al ventilatorului prin PWM hardware \\ |
| - | 7) Mod ECO pentru reducerea consumului de apă | + | 6) Sistem de profiluri pentru plante \\ |
| - | 8) Afișarea informațiilor pe un ecran LCD I2C | + | 7) Mod ECO pentru reducerea consumului de apă \\ |
| - | 9) Comunicație Bluetooth UART cu aplicația Android realizată în Kotlin | + | 8) Afișarea informațiilor pe un ecran LCD I2C \\ |
| - | 10) Control prin buton folosind întreruperi hardware | + | 9) Comunicație Bluetooth UART cu aplicația Android realizată în Kotlin \\ |
| - | 11) Detectarea apăsărilor scurte și lungi (pentru a seta între modul clasic de funcționare și modul economic) | + | 10) Control prin buton folosind întreruperi hardware \\ |
| - | 11) Un sistem de feedback vizual, dar și audio în caz că rezervorul pompei rămâne fără apă, lucru care ar putea perturba funționarea motorului pompei. | + | 11) Detectarea apăsărilor scurte și lungi (pentru a seta între modul clasic de funcționare și modul economic) \\ |
| + | 11) Un sistem de feedback vizual, dar și audio în caz că rezervorul pompei rămâne fără apă, lucru care ar putea perturba funționarea motorului pompei. \\ | ||
| + | \\ | ||
| === Biblioteci utilizate === | === Biblioteci utilizate === | ||
| Line 112: | Line 114: | ||
| === Funcționalități implementate din laboratoare === | === Funcționalități implementate din laboratoare === | ||
| - | === Arhitectura software ===Sistemul utilizează concepte din mai multe laboratoare: | + | Sistemul utilizează concepte din mai multe laboratoare: |
| - GPIO | - GPIO | ||
| Line 121: | Line 123: | ||
| - Întreruperi | - Întreruperi | ||
| - I2C | - I2C | ||
| + | |||
| + | === Arhitectura software === | ||
| * Sistemul utilizează o arhitectură software modulară, construită în jurul unui scheduler, al unor task-uri periodice independente. Spre deosebire de o implementare clasică bazată pe delay(), aplicația folosește o abordare non-blocantă, în care fiecare funcționalitate rulează independent, la intervale regulate de timp, folosind un timer hardware și funcția uptime_ms(). | * Sistemul utilizează o arhitectură software modulară, construită în jurul unui scheduler, al unor task-uri periodice independente. Spre deosebire de o implementare clasică bazată pe delay(), aplicația folosește o abordare non-blocantă, în care fiecare funcționalitate rulează independent, la intervale regulate de timp, folosind un timer hardware și funcția uptime_ms(). | ||
| Line 126: | Line 130: | ||
| * Această abordare mi-a permis să rulez simultan mai multor componente ale sistemului fără blocarea microcontrollerului. Astfel, sistemul poate: | * Această abordare mi-a permis să rulez simultan mai multor componente ale sistemului fără blocarea microcontrollerului. Astfel, sistemul poate: | ||
| - | - citi periodic senzorii | + | - citi periodic senzorii \\ |
| - | - actualiza afișajul LCD | + | - actualiza afișajul LCD \\ |
| - | - controla pompa și ventilatorul | + | - controla pompa și ventilatorul \\ |
| - | - procesa comenzile Bluetooth | + | - procesa comenzile Bluetooth \\ |
| - | - detecta apăsările butonului | + | - detecta apăsările butonului \\ |
| - | - trimite informații către aplicația Android. | + | - trimite informații către aplicația Android. \\ |
| + | \\ | ||
| * În centrul sistemului se află Timer0, configurat în modul CTC (Clear Timer on Compare Match), care generează întreruperi periodice și incrementează variabila globală g_millis. Această variabilă este utilizată pentru sincronizarea tuturor task-urilor sistemului. | * În centrul sistemului se află Timer0, configurat în modul CTC (Clear Timer on Compare Match), care generează întreruperi periodice și incrementează variabila globală g_millis. Această variabilă este utilizată pentru sincronizarea tuturor task-urilor sistemului. | ||
| Line 156: | Line 161: | ||
| Am împărțit fișierul main.c în mai multe secțiuni critice pentru sistemul meu, fiecare având un rol important în cadrul proiectului. | Am împărțit fișierul main.c în mai multe secțiuni critice pentru sistemul meu, fiecare având un rol important în cadrul proiectului. | ||
| - | == -> Configurări globale și maparea pinilor == | + | == Configurări globale și maparea pinilor == |
| * În această secțiune am definit: | * În această secțiune am definit: | ||
| * constantele aplicației | * constantele aplicației | ||
| Line 187: | Line 192: | ||
| } SystemMode; | } SystemMode; | ||
| * Astfel este mult mai clar și ușor de extins. | * Astfel este mult mai clar și ușor de extins. | ||
| - | == 2) Gestionarea timpului și Timer 0 == | + | == Gestionarea timpului și Timer 0 == |
| * Sistemul utilizează Timer0 pentru implementarea unei baze de timp software utilizate de întreg schedulerul aplicației. | * Sistemul utilizează Timer0 pentru implementarea unei baze de timp software utilizate de întreg schedulerul aplicației. | ||
| Line 221: | Line 226: | ||
| | WGM10/WGM12 | configurare Fast PWM | | | WGM10/WGM12 | configurare Fast PWM | | ||
| + | == Implementarea protocolului DHT11 == | ||
| + | * Pentru citirea temperaturii ambientale am utilizat senzorul digital DHT11. În locul unei biblioteci externe dedicate, protocolul de comunicație a fost implementat manual, folosind acces direct la pini GPIO și delay-uri precise în microsecunde. Această abordare a fost aleasă pentru a înțelege mai bine modul de funcționare al protocolului low-level utilizat de senzor și pentru a avea control complet asupra comunicației dintre microcontroller și DHT11. | ||
| + | * Funcția DHT11_read() implementează întregul protocol de comunicație necesar citirii datelor. Inițial, microcontrollerul configurează pinul conectat la DHT11 ca output și transmite un semnal de start, menținând linia pe LOW timp de aproximativ 20 ms. Acest semnal notifică senzorul că microcontrollerul dorește inițierea unei noi transmisii. Ulterior, pinul este readus în modul input, iar aplicația așteaptă răspunsul senzorului folosind mai multe bucle bazate pe timeout pentru a evita blocarea sistemului în cazul unei erori de comunicație. | ||
| + | |||
| + | * Datele transmise de DHT11 sunt formate din 40 de biți, împărțiți în 5 octeți: | ||
| + | * umiditate întreagă | ||
| + | * umiditate zecimală | ||
| + | * temperatură întreagă | ||
| + | * temperatura zecimală | ||
| + | * cehcksum | ||
| + | * Din acest motiv am utilizat un vector uint8_t data[5] = {0}, care mi-a permis să stochez toate informațiile trimise de senzor. Protocolul funcționează pe baza temporizării: impuls scurt -> bit 0, impuls lung -> bit 1. | ||
| + | * După recepționarea tuturor celor 40 de biți, aplicația reconstruiește cei 5 octeți și verifică integritatea datelor folosind checksum-ul transmis de senzor. Verificarea se face prin adunarea primilor 4 octeți și compararea rezultatului cu al cincilea octet primit. Dacă valorile nu coincid, funcția returnează eroare, evitând utilizarea unor date corupte. Temperatura finală este extrasă din data[2] și transmisă către restul aplicației pentru controlul ventilatorului și afișarea pe LCD. | ||
| + | | Registru / Componentă | Rol | ||
| + | | DDRC | configurarea pinului DHT11 ca input/output | | ||
| + | | PORTC | controlul semnalului digital transmis către senzor | | ||
| + | | PINC | citirea nivelului logic de pe pin | | ||
| + | | `_delay_ms()` / `_delay_us()` | sincronizare conform protocolului DHT11 | | ||
| + | | GPIO digital | implementarea comunicației low-level | ||
| Line 230: | Line 253: | ||
| - schimbarea modului de funcționare; | - schimbarea modului de funcționare; | ||
| - selectarea profilului plantei. | - selectarea profilului plantei. | ||
| + | |||
| + | Pentru configurarea comunicației seriale au fost utilizate registrele UART ale microcontrollerului, fără folosirea bibliotecilor Arduino standard. Baud rate-ul a fost configurat la 9600 bps folosind registrele UBRR0H și UBRR0L, iar transmisia și recepția au fost activate prin registrul UCSR0B. Comunicarea se realizează asincron, caracter cu caracter, folosind registrul UDR0 pentru transferul efectiv al datelor. | ||
| + | |||
| + | Registre UART utilizate: | ||
| + | |||
| + | | Registru | Rol | | ||
| + | | UBRR0H / UBRR0L | configurarea baud rate-ului | | ||
| + | | UCSR0A | registru de status UART | | ||
| + | | UCSR0B | activarea transmisiei și recepției | | ||
| + | | UCSR0C | configurarea frame-ului serial | | ||
| + | | UDR0 | transmiterea și recepția datelor | | ||
| + | |||
| + | Sistemul apoi va trimite periodic către aplicația Android informații despre: umiditatea solului, temperatura ambientală, intensitatea luminii, starea pompei și starea ventilatorului. | ||
| + | * Pe lângă monitorizare, aplicația Android poate controla direct funcționarea sistemului prin trimiterea unor comenzi simple prin Bluetooth. Aceste comenzi sunt recepționate în funcția task_bluetooth_commands(). | ||
| + | |||
| + | Comenzile implementate sunt: | ||
| + | |||
| + | S → pornirea sau oprirea completă a sistemului \\ | ||
| + | E → activarea modului ECO \\ | ||
| + | N → selectarea profilului pentru plantă normală \\ | ||
| + | C → selectarea profilului cactus \\ | ||
| + | F → selectarea profilului tropical \\ | ||
| + | |||
| + | Fiecare profil de plantă modifică automat parametrii utilizați de logica sistemului pentru irigare. De exemplu, pentru profilul „plantă normală” sunt setate: | ||
| + | * umiditatea minimă la 40%; | ||
| + | * durata funcționării pompei la 3000 ms. | ||
| + | |||
| + | Pentru profilul „cactus”, sistemul utilizează praguri mai conservative: | ||
| + | * umiditate minimă de 20%; | ||
| + | * durată redusă a irigării, de 1000 ms, | ||
| + | |||
| + | -> deoarece plantele de tip cactus necesită cantități mai mici de apă și sunt mai sensibile la excesul de umiditate. | ||
| + | |||
| + | În cazul profilului „plantă tropicală”, pragul de umiditate este crescut la 65%, iar durata de funcționare a pompei este mărită la 4000 ms, pentru a menține un nivel ridicat de umiditate specific acestui tip de plante. | ||
| + | Selectarea profilului modifică direct variabilele | ||
| + | * plant_dry_percent | ||
| + | * plant_pump_duration | ||
| + | care ulterior sunt utilizate în funcția task_control() | ||
| + | |||
| + | |||
| + | |||
| În același timp, parametrii senzorilor sunt trimiși periodic către aplicația mobilă pentru monitorizare în timp real. | În același timp, parametrii senzorilor sunt trimiși periodic către aplicația mobilă pentru monitorizare în timp real. | ||
| Line 243: | Line 307: | ||
| - | ===== Rezultate obținute ===== | + | |
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | În cadrul acestui proiect am realizat un sistem inteligent pentru monitorizare și irigarea automată a plantelor, lucru foarte util pentru mine și care în același timp a putut fi transformat într-un proiect destul de complex. Proiectul combină partea hardware cu partea software, integrează senzori, actuatoare, dar și o comunicație Bluetooth care face legătura dintre o aplicația mobile și sistem. | ||
| + | |||
| + | Pe parcursul dezvoltării m-am distrat foarte mult experimentând cu partea hardware - partea care mi s-a părut și cea mai interesantă, întrucât a fost prima dată când am avut ocazia să implementez de la zero un sistem embedded complet și să văd efectiv cum toate componentele ajung să funcționeze împreună. Mi s-a părut foarte satisfăcător momentul în care am reușit să controlez pompa, ventilatorul și LCD-ul direct prin microcontroller și să observ cum sistemul reacționează în timp real la datele venite de la senzori. În același timp, proiectul m-a ajutat să înțeleg mult mai bine conceptele din cadrul laboratoarelor și să văd cum se leagă împreună într-un sistem unitar. | ||
| + | |||
| + | Deși pe parcurs au existat și probleme legate de conexiunile hardware (în sepcial la partea bluetooth, dar și în ceea ce privește asigurarea unei funționări corecte d.p.d.v. hardware a pompei submersibile și a motorului DC) și de calibrarea senzorilor, tocmai aceste challenge-uri au făcut proiectul să fie interesant. | ||
| + | |||
| + | Aș vrea să extind proiectul prin adăugarea unui modul Wi-Fi și a unui server web, care să vină ca alternativă la aplicația mobilă curentă. | ||
| ===== Cod sursă - GitHub Repository ===== | ===== Cod sursă - GitHub Repository ===== | ||
| {{https://github.com/banescuema101/SmartPlantPM}} | {{https://github.com/banescuema101/SmartPlantPM}} | ||
| Line 252: | Line 323: | ||
| 18 Mai - Primul prototip software, crearea repository-ului pe github. Am avut câteva probleme cu conexiunea bluetooth spre microcontroller și a trebuit să schimb niște legături \\ | 18 Mai - Primul prototip software, crearea repository-ului pe github. Am avut câteva probleme cu conexiunea bluetooth spre microcontroller și a trebuit să schimb niște legături \\ | ||
| 22 Mai - Finalizare software și integrare a aplicației Android \\ | 22 Mai - Finalizare software și integrare a aplicației Android \\ | ||
| - | Documentarea software-ului pentru pagina ocw este acum in lucru | + | 24 Mai - Am terminat documentarea software-ului pentru pagina ocw \\ |
| ===== Bibliografie ==== | ===== Bibliografie ==== | ||
| Multe componente au fost comandate de pe website-ul Bitmi, unde la aproape fiecare componentă am găsit și instrucțiuni referitoare la modul în care le pot conecta la Arduino UNO, precum și specificațiile necesare.\\ | Multe componente au fost comandate de pe website-ul Bitmi, unde la aproape fiecare componentă am găsit și instrucțiuni referitoare la modul în care le pot conecta la Arduino UNO, precum și specificațiile necesare.\\ | ||
| Line 258: | Line 329: | ||
| [[https://www.bitmi.ro/module-electronice/modul-wireless-esp8266-esp-01-compatibil-arduino-10433.html]] | [[https://www.bitmi.ro/module-electronice/modul-wireless-esp8266-esp-01-compatibil-arduino-10433.html]] | ||
| [[https://www.bitmi.ro/senzori-electronici/senzor-de-umiditate-a-solului-higrometru-10461.html]] | [[https://www.bitmi.ro/senzori-electronici/senzor-de-umiditate-a-solului-higrometru-10461.html]] | ||
| + | |||
| + | Datasheet Arduino UNO R3 (pentru a vedea cum s-au mapat pinii la regiștrii: | ||
| + | [[https://www.alldatasheet.com/datasheet-pdf/view/1943445/ARDUINO/ARDUINO-UNO.html]] | ||
| + | |||
| + | Si datasheet-urile componentelor: \\ | ||
| + | Senzorul de temperatură: [[https://www.alldatasheet.com/html-pdf/2193416/OSEPP/DHT11/1246/7/DHT11.html]] \\ | ||
| + | [[https://github.com/eshansurendra/liquid_crystal_i2c_avr/blob/main/src/main.c]] \\ | ||
| + | Modulul bluetooth HC-05: [[https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf]] | ||
| + | |||