This is an old revision of the document!
Proiectul propune realizarea unui sistem inteligent pentru monitorizarea umidității solului și controlul procesului de irigare, folosind o placă Arduino, un senzor analogic de umiditate a solului, un LCD 1602 și un buton pentru comutarea modurilor de funcționare.
Scopul proiectului este automatizarea procesului de udare a unei plante, astfel încât sistemul să poată porni irigarea atunci când nivelul de umiditate al solului scade sub un prag prestabilit. În același timp, sistemul permite și pornirea manuală a irigării prin apăsarea unui buton, fără a întrerupe funcționarea automată.
Proiectul este util deoarece poate ajuta la întreținerea plantelor atunci când utilizatorul nu poate verifica manual starea solului. LCD-ul 1602 asigură afișarea locală a informațiilor importante: umiditatea curentă, modul de funcționare și starea pompei.
Proiectul utilizează concepte studiate în laboratoarele de Programarea Microprocesoarelor, precum GPIO, USART, întreruperi externe, timere și ADC.
Sistemul este alcătuit din mai multe module hardware care comunică între ele prin intermediul plăcii Arduino-compatible. Senzorul de umiditate a solului oferă o valoare analogică proporțională cu nivelul de umiditate. Această valoare este citită de microcontroler folosind convertorul analog-digital (ADC).
Sistemul funcționează în două moduri, comutate printr-un singur buton.
Modul automat (AUTO): microcontrolerul verifică periodic valoarea citită de la senzor. Dacă umiditatea solului scade sub pragul ales, sistemul aprinde LED-ul de stare și pornește pompa de apă pentru o perioadă determinată (un puls de udare). După fiecare puls, sistemul așteaptă o perioadă de absorbție înainte de a remăsura umiditatea. Dacă după un număr maxim de cicluri consecutive solul rămâne uscat, sistemul intră într-o pauză de siguranță pentru a preveni suprasolicitarea pompei.
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 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 modul automat.
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 propriu, bazat pe Timer1 în mod CTC.
Pompa este controlată printr-un modul releu, deoarece nu poate fi alimentată direct dintr-un pin al plăcii Arduino. O diodă de protecție 1N4007 montată în paralel cu pompa protejează circuitul împotriva spike-urilor inductive generate de motorul pompei la pornire și oprire.
LCD-ul 1602, conectat prin interfața I2C, afișează în timp real umiditatea solului, modul de funcționare curent și starea pompei.
Schema bloc prezintă principalele module ale sistemului și modul în care acestea interacționează.
Senzorul de umiditate a solului este conectat la placa Arduino printr-o intrare analogică, iar valoarea este citită folosind ADC. Butonul de comutare a modurilor este conectat la pinul de întrerupere externă INT0 (D2).
Placa Arduino controlează LED-ul de stare și modulul releu prin pini GPIO. Pompa de apă este alimentată separat de la suportul cu 4 baterii AA, iar releul comută alimentarea acesteia. LCD-ul 1602 este conectat prin interfața I2C (pinii A4/A5).
Componentele utilizate în proiect sunt:
Placa Arduino-compatible reprezintă unitatea centrală de control a sistemului. Aceasta citește valoarea analogică de la senzorul de umiditate, gestionează mașina de stări și controlează toate perifericele.
Senzorul de umiditate a solului este conectat la pinul analogic A0. Valoarea citită este prelucrată cu modulul ADC, folosind o medie pe 10 eșantioane cu eliminarea valorilor extreme (min și max), pentru reducerea zgomotului.
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. Pompa este alimentată separat de la suportul cu 4 baterii AA (aproximativ 6V). Dioda 1N4007, montată în paralel cu terminalele pompei (catodul spre +), elimină spike-urile inductive generate de motorul DC la comutarea releului.
LCD-ul 1602 este conectat prin modulul I2C (adresa 0x27) la pinii A4 (SDA) și A5 (SCL). 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ă se declanșează pe front descrescător (1→0), adică la apăsarea butonului.
Î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 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 folosind Timer1 în mod CTC cu prescaler 64 și OCR1A = 249, generând o întrerupere la fiecare 1 ms (pentru F_CPU = 16 MHz).
Sistemul definește două moduri (`system_mode_t`):
În MODE_AUTO, mașina de stări (`irrigation_state_t`) parcurge:
În MODE_MANUAL, pompa funcționează în pulsuri (MANUAL_PULSE_ON_MS activ, MANUAL_PULSE_OFF_MS pauză), cu MANUAL_PULSE_COUNT pulsuri per ciclu manual. Butonul rămâne activ în timpul pauzelor dintre pulsuri.
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 cauzate de interferențe electromagnetice (EMI) generate de comutarea releului.
Debouncing-ul software folosește un contor de milisecunde: apăsările detectate la mai puțin de 250 ms față de apăsarea anterioară sunt ignorate.
La pornirea și oprirea pompei, butonul este mascat pentru 1000 ms (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 de 250 ms, elimină practic toate false detectările.
Această secțiune va fi completată după finalizarea testării sistemului.
Această secțiune va fi completată după finalizarea proiectului.
Această secțiune va fi completată după crearea repository-ului pentru codul sursă.