Differences

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

Link to this comparison view

pm:prj2026:bianca.popa1106:miruna.iliescu [2026/05/15 14:53]
miruna.iliescu [Jurnal]
pm:prj2026:bianca.popa1106:miruna.iliescu [2026/05/24 20:36] (current)
miruna.iliescu [Hardware Design]
Line 37: Line 37:
 **Modul manual (MANUAL):** utilizatorul poate controla pompa prin apăsarea succesivă a **Modul manual (MANUAL):** utilizatorul poate controla pompa prin apăsarea succesivă a
 butonului. Prima apăsare comută sistemul în modul manual (pompa oprită). A doua apăsare butonului. Prima apăsare comută sistemul în modul manual (pompa oprită). A doua apăsare
-pornește un ciclu de udare format din mai multe pulsuri scurte, cu pauze între ele — pauze+pornește un ciclu de udare format din mai multe pulsuri scurte, cu pauze între elepauze
 în care butonul rămâne activ, permițând oprirea de urgență. A treia apăsare revine la în care butonul rămâne activ, permițând oprirea de urgență. A treia apăsare revine la
 modul automat. modul automat.
  
 Implementarea folosește o mașină de stări non-blocantă,​ fără nicio funcție de tip Implementarea folosește o mașină de stări non-blocantă,​ fără nicio funcție de tip
-`_delay_ms()în bucla principală. Timpii sunt gestionați printr-un contor de milisecunde+_delay_ms() în bucla principală. Timpii sunt gestionați printr-un contor de milisecunde
 propriu, bazat pe Timer1 în mod CTC. propriu, bazat pe Timer1 în mod CTC.
  
Line 88: Line 88:
   * Breadboard   * Breadboard
   * Fire de legătură   * Fire de legătură
 +
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​schema_hardware.png?​800 |Schema hardware }}
  
 Placa Arduino-compatible reprezintă unitatea centrală de control a sistemului. Aceasta Placa Arduino-compatible reprezintă unitatea centrală de control a sistemului. Aceasta
Line 99: Line 101:
 Pompa de apă este controlată prin modulul releu (pinul D7). Releul permite pornirea și Pompa de apă este controlată prin modulul releu (pinul D7). Releul permite pornirea și
 oprirea pompei fără ca aceasta să fie alimentată direct dintr-un pin al microcontrolerului. oprirea pompei fără ca aceasta să fie alimentată direct dintr-un pin al microcontrolerului.
-Pompa este alimentată separat de la suportul cu 4 baterii AA (aproximativ ​6V). Dioda+Pompa este alimentată separat de la suportul cu 4 baterii AA (6V). Dioda
 1N4007, montată în paralel cu terminalele pompei (catodul spre +), elimină spike-urile 1N4007, montată în paralel cu terminalele pompei (catodul spre +), elimină spike-urile
 inductive generate de motorul DC la comutarea releului. inductive generate de motorul DC la comutarea releului.
Line 106: Line 108:
 Modulul PCF8574 realizează conversia de la I2C la interfața paralelă a LCD-ului HD44780. Modulul PCF8574 realizează conversia de la I2C la interfața paralelă a LCD-ului HD44780.
  
-Butonul este conectat pe pinul D2 (INT0), cu pull-up intern ​activat. Întreruperea externă +Butonul este conectat pe pinul D2 (INT0), cu rezistenta ​pull-up intern ​activata. Întreruperea externă 
-se declanșează pe front descrescător ​(1→0), adică la apăsarea butonului.+se declanșează pe frontul ​descrescător,​ adică la apăsarea butonului. 
 + 
 +==== Diagrama de semnal ==== 
 + 
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​protectie_emi.png?​1000 |Protectie EMI }} 
 + 
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​ciclu_irigare_auto.png?​1000 | Ciclu irigare AUTO }}
  
 ===== Software Design ===== ===== Software Design =====
Line 114: Line 122:
  
 Întregul software este structurat ca o **mașină de stări non-blocantă**. Bucla principală Întregul software este structurat ca o **mașină de stări non-blocantă**. Bucla principală
-`while(1)rulează continuu fără nicio instrucțiune ​`_delay_ms()`, permițând verificarea+while(1) rulează continuu fără nicio instrucțiune _delay_ms(),​ permițând verificarea
 simultană a butonului, a timpilor de stare și a senzorului la fiecare iterație. simultană a butonului, a timpilor de stare și a senzorului la fiecare iterație.
  
-Timpul este gestionat printr-un contor propriu de milisecunde (`uptime_ms()`), implementat+Timpul este gestionat printr-un contor propriu de milisecunde (uptime_ms()),​ implementat
 folosind **Timer1 în mod CTC** cu prescaler 64 și OCR1A = 249, generând o întrerupere la folosind **Timer1 în mod CTC** cu prescaler 64 și OCR1A = 249, generând o întrerupere la
-fiecare 1 ms (pentru F_CPU = 16 MHz).+fiecare 1 ms.
  
 ==== Moduri de funcționare ==== ==== Moduri de funcționare ====
  
-Sistemul definește două moduri (`system_mode_t`):+Sistemul definește două moduri (system_mode_t):​
  
   * **MODE_AUTO**:​ irigare automată bazată pe citirile senzorului   * **MODE_AUTO**:​ irigare automată bazată pe citirile senzorului
   * **MODE_MANUAL**:​ control manual al pompei prin buton   * **MODE_MANUAL**:​ control manual al pompei prin buton
  
-În MODE_AUTO, mașina de stări (`irrigation_state_t`) parcurge:+În MODE_AUTO, mașina de stări (irrigation_state_t) parcurge:
  
-  * **STATE_IDLE**:​ citire senzor la intervale regulatedacă umiditatea < prag → STATE_WATERING +  * **STATE_IDLE**:​ citire senzor la intervale regulatedacă umiditatea < prag -> STATE_WATERING 
-  * **STATE_WATERING**:​ pompă pornită ​pentru ​WATERING_TIME_MSla expirare ​→ STATE_ABSORB_WAIT +  * **STATE_WATERING**:​ pompă pornită ​timp de WATERING_TIME_MSla expirare ​-> STATE_ABSORB_WAIT 
-  * **STATE_ABSORB_WAIT**:​ așteptare ABSORB_TIME_MS pentru absorbția apei → STATE_IDLE+  * **STATE_ABSORB_WAIT**:​ așteptare ABSORB_TIME_MS pentru absorbția apei -> STATE_IDLE
   * **STATE_SAFETY_WAIT**:​ pauză de siguranță după MAX_WATERING_CYCLES cicluri consecutive   * **STATE_SAFETY_WAIT**:​ pauză de siguranță după MAX_WATERING_CYCLES cicluri consecutive
  
Line 142: Line 150:
  
 Butonul este conectat pe INT0 (D2) cu pull-up intern. ISR-ul verifică starea pinului Butonul este conectat pe INT0 (D2) cu pull-up intern. ISR-ul verifică starea pinului
-în momentul declanșării (`if (!(PIND & (1 << PD2)))`) pentru a filtra false triggere+în momentul declanșării (if (!(PIND & (1 << PD2)))) pentru a filtra false triggere
 cauzate de interferențe electromagnetice (EMI) generate de comutarea releului. cauzate de interferențe electromagnetice (EMI) generate de comutarea releului.
  
Line 149: Line 157:
  
 La pornirea și oprirea pompei, butonul este mascat pentru 1000 ms La pornirea și oprirea pompei, butonul este mascat pentru 1000 ms
-(`ignore_button_until_ms`), acoperind perioada de inrush current a motorului care+(ignore_button_until_ms),​ acoperind perioada de inrush current a motorului care
 generează EMI. Această mască, combinată cu verificarea pinului în ISR și debouncing-ul generează EMI. Această mască, combinată cu verificarea pinului în ISR și debouncing-ul
 de 250 ms, elimină practic toate false detectările. de 250 ms, elimină practic toate false detectările.
Line 158: Line 166:
   * **Lab 1 – USART**: log serial pentru debugging; afișarea valorilor ADC, umidității și stării sistemului   * **Lab 1 – USART**: log serial pentru debugging; afișarea valorilor ADC, umidității și stării sistemului
   * **Lab 2 – Întreruperi externe**: butonul pe INT0, front descrescător,​ cu ISR pentru setarea unui flag atomic   * **Lab 2 – Întreruperi externe**: butonul pe INT0, front descrescător,​ cu ISR pentru setarea unui flag atomic
-  * **Lab 3 – Timer1 CTC**: contor de milisecunde non-blocant;​ OCR1A = 249, prescaler 64, ISR incrementează ​`system_millis`+  * **Lab 3 – Timer1 CTC**: contor de milisecunde non-blocant;​ OCR1A = 249, prescaler 64, ISR incrementează system_millis
   * **Lab 4 – ADC**: citirea senzorului FC-28 pe canalul A0; medie pe 10 eșantioane cu eliminarea min/max   * **Lab 4 – ADC**: citirea senzorului FC-28 pe canalul A0; medie pe 10 eșantioane cu eliminarea min/max
   * **TWI/​I2C**:​ comunicare cu LCD 1602 prin modulul PCF8574; driver propriu implementat în registre AVR   * **TWI/​I2C**:​ comunicare cu LCD 1602 prin modulul PCF8574; driver propriu implementat în registre AVR
  
 ===== Rezultate ===== ===== Rezultate =====
 +==== Hardware final proiect ====
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​hw2.png?​800 | Hardware final proiect}}
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​hw1.png?​800 | Hardware final proiect}}
  
-Această secțiune va fi completată după finalizarea testării sistemului.+==== Senzor de umididate si modulul interfata I2C pentru LCD ==== 
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​hw_senzor_lcd.png?​800 | Senzor de umididate si modulul interfata I2C pentru LCD}}
  
-===== Concluzii =====+==== Sistem de irigare finalizat ​==== 
 +{{ :​pm:​prj2026:​bianca.popa1106:​miruna.iliescu:​hw_start.png?​800 | Sistem de irigare }}
  
-Această secțiune va fi completată după finalizarea proiectului.+==== Video demonstrativ al modului de functionare ====
  
-===== Cod sursă și resurse =====+[[https://​youtube.com/​shorts/​-Wmx8Wu8yMY|Video demonstrativ - Sistem Irigare]]
  
-Această secțiune va fi completată după crearea repository-ului pentru codul sursă.+===== Cod sursă ===== 
 + 
 +Codul sursă complet al proiectului este disponibil pe GitHub 
 +[[https://​github.com/​MirunaIliescu21/​Sistem-Irigare | Reposit GitHub - Sistem Irigare]] 
 + 
 +Proiectul este structurat ca un proiect **PlatformIO** și se compilează direct din VS Code. 
 +Toate modulele software (I2C, LCD, USART, ADC, releu, buton, timer, RGB LED) sunt implementate în C pur, fără framework Arduino.
  
 ===== Jurnal ===== ===== Jurnal =====
Line 181: Line 200:
  
   * Milestone 3: Implementare completă software: mașină de stări non-blocantă,​ mod AUTO cu cicluri de udare și absorbție, mod MANUAL cu pulsuri, protecție EMI pentru buton, driver I2C și LCD propriu.   * Milestone 3: Implementare completă software: mașină de stări non-blocantă,​ mod AUTO cu cicluri de udare și absorbție, mod MANUAL cu pulsuri, protecție EMI pentru buton, driver I2C și LCD propriu.
 +
 +  * Uterior, am devin independenta de laptop, din punctul de vedere al sursei de alimentare. Placuta Arduino este alimentata la o baterie de 9V prin barrel jack. Intern, placa are un regulator de tensiune care coboară la 5V pentru ATmega și restul componentelor.
 +
  
 ===== Bibliografie / Resurse ===== ===== Bibliografie / Resurse =====
Line 186: Line 208:
   * Template proiect PM: https://​ocw.cs.pub.ro/​courses/​pm/​pm/​prj2021/​template   * Template proiect PM: https://​ocw.cs.pub.ro/​courses/​pm/​pm/​prj2021/​template
   * Datasheet ATmega328P: https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf   * Datasheet ATmega328P: https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
-  * Datasheet PCF8574 (I2C LCD expander): https://​www.ti.com/​lit/​ds/​symlink/​pcf8574.pdf+  ​* Placă de dezvoltare: Arduino Uno R3 (kit Plusivo) https://​store.arduino.cc/​products/​arduino-uno-rev3 
 +  ​* Datasheet PCF8574 (modul interfata ​I2C LCD 1602): https://​www.ti.com/​lit/​ds/​symlink/​pcf8574.pdf
   * Documentație senzor umiditate sol FC-28   * Documentație senzor umiditate sol FC-28
   * Documentație LCD 1602 HD44780   * Documentație LCD 1602 HD44780
 +  * Documentație modul releu
 +  * Datasheet diodă protecție 1N4007
 +  * PlatformIO IDE: https://​platformio.org
 +  * Laboratoare OCW: https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab3-2023-2024
 +
 <​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>​
  
  
pm/prj2026/bianca.popa1106/miruna.iliescu.1778846032.txt.gz · Last modified: 2026/05/15 14:53 by miruna.iliescu
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