This is an old revision of the document!


Sistem inteligent de monitorizare a umidității solului cu irigare automată și manuală

Introducere

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.

Descriere generală

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

Schema bloc

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).

Hardware Design

Componentele utilizate în proiect sunt:

  • Placă Arduino-compatible, inclusă în kitul Plusivo
  • Senzor analogic de umiditate a solului (FC-28)
  • Modul releu cu un canal, comandat la 5V
  • Pompă de apă submersibilă, 3–6V DC
  • Diodă de protecție 1N4007 (protecție back-EMF motor pompă)
  • Furtun pentru pompă de apă, 6×8 mm, 1 metru
  • Suport pentru 4 baterii AA, cu capac și întrerupător
  • Baterii AA pentru alimentarea pompei
  • LCD 1602, 16×2, 5V, cu retroiluminare
  • Modul interfață I2C pentru LCD 1602 (PCF8574)
  • Buton pentru comutarea modurilor de funcționare
  • LED pentru semnalizarea irigării active
  • Rezistență 220Ω pentru LED
  • Rezistențe pull-up pentru buton
  • Breadboard
  • Fire de legătură

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.

Software Design

Arhitectura generală

Î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).

Moduri de funcționare

Sistemul definește două moduri (`system_mode_t`):

  • MODE_AUTO: irigare automată bazată pe citirile senzorului
  • MODE_MANUAL: control manual al pompei prin buton

Î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_WATERING: pompă pornită pentru WATERING_TIME_MS; la expirare → STATE_ABSORB_WAIT
  • 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

Î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.

Gestionarea butonului și protecție EMI

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.

Periferice utilizate

  • Lab 0 – GPIO: controlul LED-ului de stare și al pinului de comandă al releului (D7)
  • 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 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
  • TWI/I2C: comunicare cu LCD 1602 prin modulul PCF8574; driver propriu implementat în registre AVR

Rezultate

Această secțiune va fi completată după finalizarea testării sistemului.

Concluzii

Această secțiune va fi completată după finalizarea proiectului.

Cod sursă și resurse

Această secțiune va fi completată după crearea repository-ului pentru codul sursă.

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 2:
  • 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.

Bibliografie / Resurse

Export to PDF

pm/prj2026/bianca.popa1106/miruna.iliescu.1778845658.txt.gz · Last modified: 2026/05/15 14:47 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