This shows you the differences between two versions of the page.
|
pm:prj2026:bianca.popa1106:miruna.iliescu [2026/05/15 14:47] miruna.iliescu |
pm:prj2026:bianca.popa1106:miruna.iliescu [2026/05/24 20:36] (current) miruna.iliescu [Hardware Design] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Sistem inteligent de monitorizare a umidității solului cu irigare automată și manuală ====== | + | ====== Sistem de monitorizare a umidității solului cu irigare automată și manuală ====== |
| ===== Introducere ===== | ===== Introducere ===== | ||
| 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 ele, pauze |
| î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 regulate; dacă umiditatea < prag → STATE_WATERING | + | * **STATE_IDLE**: citire senzor la intervale regulate: dacă umiditatea < prag -> STATE_WATERING |
| - | * **STATE_WATERING**: pompă pornită pentru WATERING_TIME_MS; la expirare → STATE_ABSORB_WAIT | + | * **STATE_WATERING**: pompă pornită timp de WATERING_TIME_MS, la 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 ===== | ||
| * Milestone 1: A fost creată pagina proiectului pe OCW. Au fost adăugate introducerea, descrierea generală, schema bloc și lista inițială de componente hardware. | * Milestone 1: A fost creată pagina proiectului pe OCW. Au fost adăugate introducerea, descrierea generală, schema bloc și lista inițială de componente hardware. | ||
| - | * Milestone 2: | + | |
| - | * Milestone 3: Implementare completă software: mașină de stări non-blocantă, mod AUTO cu cicluri de udare și absorbție, | + | * Milestone 2: Realizarea hardware a sistemului. Au fost conectate și testate toate componentele fizice: senzorul de umiditate a solului pe pinul A0, butonul pe pinul D2 (INT0) cu pull-up intern, modulul releu pe pinul D7, LED-ul de stare, LCD-ul 1602 prin modulul I2C (adresa 0x27) pe pinii A4/A5. Pompa submersibilă a fost conectată la ieșirea releului, alimentată separat din suportul cu 4 baterii AA. A fost montată o diodă de protecție 1N4007 în paralel cu terminalele pompei pentru eliminarea spike-urilor inductive generate de motorul DC la comutarea releului. |
| - | 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 185: | 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> | ||