Differences

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

Link to this comparison view

pm:prj2025:mdinica:melisa.staicu [2025/06/03 23:31]
melisa.staicu
pm:prj2025:mdinica:melisa.staicu [2025/06/04 16:32] (current)
mihai.spirchez [Elementul de noutate al proiectului]
Line 108: Line 108:
 ===== Software Design ===== ===== Software Design =====
  
- +===== Biblioteci și resurse utilizate ​=====
-**Mediu de Dezvoltare** +
- +
- +
-Proiectul este dezvoltat în Arduino IDE, folosind limbajul C++, împreună cu biblioteci externe pentru gestionarea ecranului TFT LCD, cardului SD și servomotoarelor. Codul este modularizat în funcții specifice pentru măsurători,​ afișaj, control servo și salvare date, pentru a crește lizibilitatea și scalabilitatea. +
- +
-Toate funcționalitățile sistemului sunt funcționale și integrate coerent, demonstrând aplicabilitatea practică a platformei Arduino pentru automatizare în medii reale. +
- +
- +
-**Elementul de noutate al proiectului** +
- +
- +
-Deși sistemele de măsurare a puterii produse de panourile solare sunt întâlnite frecvent, elementul de noutate al acestui proiect constă în integrarea mai multor funcții hardware și logice într-o singură soluție embedded, low-cost, cu scop dublu: +
- +
-  * Monitorizare inteligentă (curent, tensiune, lumină, nivel apă) +
-  * Intervenție automată prin activarea unui releu, servomotor și pompă în cazul detectării murdăriei. +
- +
-Proiectul combină senzoristică,​ afișaj grafic, control mecanic și înregistrare de date pe SD, fiind scalabil și aplicabil în agricultură,​ smart-farming sau energii regenerabile. +
- +
-**Biblioteci și resurse utilizate**+
  
  
Line 136: Line 117:
  
  
-**Algoritmi și structuri**+===== Algoritmi și structuri ​======
  
  
Line 148: Line 129:
   * Scrierea periodică a valorilor pe cardul SD, pentru arhivare și analiză ulterioară   * Scrierea periodică a valorilor pe cardul SD, pentru arhivare și analiză ulterioară
  
-**Utilizarea funcționalităților din laborator**+===== Utilizarea funcționalităților din laborator ​=====
  
 +  * **Laboratorul 0** - Serial.begin() pentru testare și debugging cu valori live de la senzori.
 +  * **Laboratorul 1** - pinMode(), digitalWrite() pentru controlul releului și inițializarea pinilor.
 +  * **Laboratorul 2** - Controlul servomotoarelor cu Servo.write() pe canale PWM.
 +  * **Laboratorul 3** - analogRead() pentru curent, tensiune și fotorezistori.
 +  * **Laboratorul 4** - Adafruit_ST7735 pentru afișarea datelor: curent, tensiune, putere, stare sistem.
 +  * **Laboratorul 5** - Salvare pe SD cu SD.open(), file.print(),​ înregistrare periodică cu millis().
 +  * **Laboratorul 6** - Integrarea completă într-un sistem funcțional cu reacții automate.
  
-Laborator Funcționalitate aplicată +===== Funcții și fișiere sursă ​=====
-Lab 0 Serial.begin() pentru testare și debugging cu valori live de la senzori +
-Lab 1 pinMode(),​ digitalWrite() pentru controlul releului și inițializarea pinilor +
-Lab 2 Controlul servomotoarelor cu Servo.write() pe canale PWM +
-Lab 3 analogRead() pentru curent, tensiune și fotorezistori +
-Lab 4 Adafruit_ST7735 pentru afișarea datelor: curent, tensiune, putere, stare sistem +
-Lab 5 Salvare pe SD cu SD.open(), file.print(),​ înregistrare periodică cu millis() +
-Lab 6 Integrarea completă într-un sistem funcțional cu reacții automate +
- +
-**Funcții și fișiere sursă**+
  
  
 Funcții principale: Funcții principale:
  
-  * readCurrent() – convertește citirea ​de la ACS712 într-valoare ​de amperaj +  * setup_display() – inițializează ecranul TFT, setează rotația, ​șterge ecranul și pregătește zona de afișare pentru actualizări periodice. 
-  * readVoltage() – calculează tensiunea pe baza valorii analogice ​de la divizor +  * setup_water_sensor() – configurează pini locali și de pe extenderul I2C (PCF8574) pentru citirea nivelului apei pe baza tranzistorilor conectați ​la diferite înălțimi. 
-  * logToSD() – scrie datele ​(tensiunecurent, putere) pe cardul SD +  * setup_curent_sensor() – face calibrare inițială a senzorului ACS712, calculând offsetul ​de tensiune fără curent, pentru a putea oferi valori reale și precise ulterior. 
-  * updateDisplay() – afișează valorile curente ​pe LCD +  * setup_lumina_sensor() – setează pinii senzorilor ​de lumină și pinul de control pentru releul pompei. Pompa este oprită ​la pornirea sistemului (LOW logic invers). 
-  * controlSystem() – decide ​dacă trebuie activat sistemul ​de curățare+  * water_senzor_get_procentage() – interpretează starea pinilor de la tranzistori ​(via PCF8574 și pini direcți) și returnează procentul estimat al nivelului de apăîntre 0% și 100%. 
 +  * curent_sensor_get_value(– face medii multiple ale tensiunii ​pe pinul analogic, transformă rezultatul în amperi, aplică un filtru EMA (exponential moving average) și returnează curentul produs de panoul solar. 
 +  * display_water_level(procent, curent) – actualizează doar când este nevoie ​afișajul de pe TFT cu noul nivel de apă și curentul generat, pentru a evita artefacte vizuale sau erori. 
 +  * verifica_lumina_si_porneste_pompa() – citește lumină pe cei doi senzori și decide ​când este nevoie să pornească pompa de apă (în cazul murdăririi senzorilor). Activează și un „flag” pentru a permite mișcarea ulterioară a servomotorului. 
 +  * loop() – bucla principală care execută toată logica periodic: verifică lumină, afișează nivelul apei și curentul, iar după oprirea pompei, execută de 6 ori o mișcare a servomotorului SG90.
  
-**Interacțiunea dintre componente**+===== Interacțiunea dintre componente ​=====
  
   * Panoul solar furnizează energie, care este monitorizată prin senzorii de curent și tensiune   * Panoul solar furnizează energie, care este monitorizată prin senzorii de curent și tensiune
Line 179: Line 162:
   * Cardul SD arhivează nivelul de apă și puterea panoului pentru analiză ulterioară   * Cardul SD arhivează nivelul de apă și puterea panoului pentru analiză ulterioară
  
-**Calibrarea și validarea**+===== Calibrarea și validarea ​=====
  
   * Curentul măsurat cu ACS712 a fost calibrat comparativ cu un multimetru, iar offset-ul a fost corectat în cod.   * Curentul măsurat cu ACS712 a fost calibrat comparativ cu un multimetru, iar offset-ul a fost corectat în cod.
Line 186: Line 169:
  
  
-**Optimizări**+===== Optimizări ===== 
 +  ​Curentul măsurat cu ACS712 a fost calibrat comparativ cu un multimetru, iar offset-ul a fost corectat în cod. 
 +  ​Afișare optimizată pe ecran TFT – actualizăm conținutul de pe ecran doar când apar modificări ale nivelului apei sau ale curentului generat, evitând astfel apeluri repetate și costisitoare la funcțiile de desenare. 
 +  ​Structurare modulară a codului – funcționalitățile majore (citire senzori, control servomotor, afișare pe TFT, control pompă etc.) sunt implementate în funcții separate, ușor de întreținut,​ testat și extins. 
 +  ​Controlul acțiunilor prin stări logice – am folosit variabile precum pompaPornita și servoExecutatDupaPompa pentru a evita repetiții și suprapuneri ale comenzilor hardware (releu sau servo), permițând un flux de execuție clar și fiabil. 
 +  * Eliminarea delay-urilor inutile – în versiunile inițiale ale codului am folosit millis() pentru control temporizat non-blocant. În forma finală, logica a fost simplificată intenționat pentru a oferi claritate maximă, fără blocaje și fără afectarea celorlalte funcționalități. 
 +  * Comentarii clare și cod auto-explicativ – codul este documentat pas cu pas, fiecare funcție și secțiune fiind explicată pentru o înțelegere facilă.
  
 +===== Mediu de Dezvoltare =====
  
-  * Utilizarea millis() ​în loc de delay() ​pentru ​logare periodică neblocantă +Proiectul este dezvoltat ​în Arduino IDE, care oferă un mediu ușor de utilizat ​pentru ​programarea ​și încărcarea ​codului ​pe placa Arduino. Tot codul este scris în C++folosind bibliotecile standard Arduino ​și logică personalizată pentru ​implementarea scopului proiectului.
-  * SPI partajat între SD și TFT, folosind CS dedicat și control software atent +
-  * Modularizare a codului în funcții clare pentru senzoriafișaj ​și salvare date +
-  * Servomotoare resetate automat la poziția neutră dacă nu e detectată murdărie +
-  * Releul activ doar la nevoie ​pentru ​a economisi energie+
  
-**Structură modulară**+===== Elementul de noutate al proiectului =====
  
 +Am realizat propriul nostru senzor pentru detectarea volumului apei, alcătuit din mai mulți tranzistori,​ fiecare dintre aceștia ​ având conectat la colector câte un rezistor și un led, iar pe bază un fir care duce către un recipient. Fiecare fir către recipient are o lungime diferita, astfel incât să capteze curentul din puncte diferite din sticlă. Practic fiecare tranzistor va aprinde ledul în momentul în care este atins nivelul lui de apă. Totdată, la fiecare colector al tranzistorilor,​ este conectat și un fir care este dus către plăcuța de Arduino pentru a fi citit. ​
  
-Codul este organizat clar pe următoarele secțiuni: +{{:pm:​prj2025:​mdinica:​senzor_apa.jpeg?​800x800|}}
-  * Inițializare componente (setup()) +
-  * Măsurători (readVoltage(),​ readCurrent()) +
-  * Logică de decizie (controlSystem()) +
-  * Afișaj și SD (updateDisplay(),​ logToSD()) +
-  * Această structurare permite adăugarea de funcții suplimentare fără a afecta funcționalitățile de bază. +
- +
-**Concluzie** +
- +
- +
-Proiectul realizează o automatizare completă a unui panou solar, cu detecție de murdărie, activare automată de sistem de curățare și monitorizare completă a parametrilor electrici. Este scalabil, eficient și utilizabil în aplicații reale cu buget redus.+
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
Line 216: Line 193:
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Proiectul a fost o experiență practică valoroasă, care ne-a ajutat să înțelegem mai bine principiile de funcționare ale componentelor electronice și modul în care acestea pot fi integrate într-un sistem autonom. A fost interesant să lucrăm cu senzori, relee, servomotoare și un panou solar. Am întâmpinat dificultăți tehnice, mai ales în integrarea componentelor multiple, dar prin documentare,​ videouri explicative și testare am reușit să le depășim. A fost o activitate practică extrem de utilă, din care am învățat foarte multe și care a avut o finalitate reușită.
  
-<note warning>​ +===== 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**. +{{:pm:prj2025:mdinica:media_proiect.zip?800x800|}}
-</​note>​+
  
 ===== Cod sursă ===== ===== Cod sursă =====
 https://​github.com/​melisa204/​pm_project https://​github.com/​melisa204/​pm_project
  
-===== Jurnal =====+===== Jurnal =====
 +06.05.2025 - Am decis tema proiectului și am realizat descrierea inițială a acestuia. 
 + 
 +09.05.2025 - Am realizat schema. 
 + 
 +10.05.2025 - Am comanda primele componente. 
 + 
 +12.05.2025 - Am ridicat componentele și am observat dupa jumătate de zi că am primit senzori de temperatură în loc de tranzistori,​ după ce nu funcționa testarea noastră pe breadboard. 
 + 
 +13.05.2025 - Am dat comandă de tranzistori și de componentele care ne-am dat seama pe parcurs ca ne mai trebuiesc. 
 + 
 +15.05.2025 - Am ridicat restul componentelor. 
 + 
 +18.05.2025 - Am asamblat întregul proiect și am testat funcționalitatea componentelor. 
 + 
 +22.05.2025 - Am dezvoltat și am testat partea de software a proiectului. 
 + 
 +25.05.2025 - Am realizat testarea finală și videoclipurile pentru demo.
  
-<note tip> +30.05.2025 - Am realizat scheletul ​de lemn pentru susținerea si prezentarea ​proiectului.
-Puteți avea și o secțiune ​de jurnal în care să poată urmări asistentul de proiect progresul ​proiectului. +
-</​note>​+
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2025/mdinica/melisa.staicu.1748982685.txt.gz · Last modified: 2025/06/03 23:31 by melisa.staicu
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