Sistem de irigare a plantelor

Autor: Gherghel Ștefan-Ciprian

Grupă: 333CA

Introducere

Sistemul de irigare este conceput pentru a monitoriza condițiile de mediu și a gestiona automat alimentarea cu apă a plantelor, oferind în același timp flexibilitate prin mai multe moduri de funcționare:

  • automat (în funcție de umiditate)
  • periodic (interval de timp)
  • manual (apăsarea continuă a butonului).

Interfața cu utilizatorul este realizată printr-un ecran OLED și butoane, permițând configurarea parametrilor (intervalul de timp sau valoarea prag a umidității), selectarea modului de funcționare și afișarea umidității solului cât și a temperaturii ambientale. Sistemul va evidenția situațiile limită (rezervor gol sau baterie descărcată) cu ajutorul unui led RGB care pulsează.

Motivația acestui proiect a pornit din nevoia de a-mi menține busuiocul din București sănătos și bine udat atunci când sunt plecat. Într-un context în care timpul disponibil pentru îngrijirea plantelor este adesea limitat, sistemul oferă o soluție practică pentru a susține creșterea și întreținerea acestora, chiar și în lipsa unei supravegheri constante.

Descriere generală

Schemă bloc

Mod de funcționare

Sistemul funcționează pe baza unui microcontroler (ATmega328P), care colectează și procesează datele provenite de la senzori și controlează acționarea pompei de apă în funcție de modul de funcționare selectat.

Conectate la microcontroler sunt următoarele componente:

  • senzor de umiditate a solului - Furnizează un semnal analogic pe un pin ADC.
  • senzor de temperatură - Furnizează un semnal analogic pe un pin ADC.
  • senzor de nivel al apei - Furnizează un semnal analogic pe un pin ADC.
  • Display OLED - Afișează valorile senzorilor, modul de funcționare și alertele, comunicând prin I2C.
  • Releu - Controlează pompa și este comandat de un pin digital.
  • Pompă de apă - Este alimentată prin releu, nefiind conectată direct la pini ai microcontrolerului.
  • LED RGB - Conectat prin pini PWM.
  • Butoane - Conectate la pini digitali și utilizate pentru selectarea modului de funcționare și schimbarea valorii prag de umiditate sau a intervalului de timp.
  • Sursă de alimentare (4 baterii AA) - Alimentează pompa.

Pentru siguranță și fiabilitate, sistemul include mecanisme de protecție:

  • dacă nivelul apei din rezervor este scăzut, pompa nu va fi activată (LED-ul RGB pulsează albastru);
  • în cazul unei baterii descărcate (LED-ul RGB pulsează roșu).

Mod automat (bazat pe umiditate) - HUMIDITY

În acest mod, sistemul realizează udarea în funcție de nivelul de umiditate al solului.

Microcontrolerul citește periodic valoarea senzorului de umiditate. Valoarea obținută este comparată cu un prag minim. Utilizatorul poate selecta pragul de dintr-o listă prestabilită cu ajutorul butoanelor.

Dacă umiditatea scade sub pragul minim → pompa este activată pentru o durată fixă.

Mod periodic (pe bază de timp) - TIMED

În acest mod, udarea se realizează la un interval regulat de timp, indiferent de valoarea umidității.

Microcontrolerul utilizează timere interne pentru a măsura timpul scurs. Utilizatorul poate selecta intervalul de udare dintr-o listă prestabilită cu ajutorul butoanelor.

La atingerea intervalului → pompa este activată pentru o durată fixă iar apoi timerul este resetat.

Mod manual - MANUAL

În acest mod, utilizatorul are control direct asupra pompei.

Pompa este activată prin apăsarea unui buton și funcționează doar pe durata menținerii acestuia apăsat.

Afișare

Sunt prezente două tipuri de meniuri afișate pe ecranul OLED (schimbarea lor are loc prin apăsarea unui buton).

  • Ecran principal - STANDARD: afișează temperatura, nivelul umidității, modul de funcționare și tensiunea bateriei.
  • Ecranul de setări - MENU: afișeaza listele de valori prestabilitate pentru intervalul de timp de udare și pragul de umiditate. Prin utilizarea a doua butoane se pot seta noile valori.

Al treilea ecran - WATERING - este afișat atunci când display-ul nu este în Standby și are loc o udare.

Standby

După un anumit interval de timp de inactivitate din partea utilizatorului ecranul se stinge și microcontroller-ul își limitează intr-o anumită măsură activitatea (spre exemplu nu mai citește temperatura).

Hardware Design

Bill of Materials

Componentă Cantitate Link Preț unitar (RON)
Placă dezvoltare NANO v3 AtMega 328p 1 Link24.44
Display OLED I2C 1 Link 16.95
Pompă apă submersibilă 1 Link7.62
Furtun Pompă 1 Link 6.36
Releu 1 Link5.45
Senzor temperatură LM35 1 Link 7.26
Senzor higrometru capacitiv 1 Link 5.49
Senzor nivel lichid 1 Link1.78
Breadboard 1 Link 11.30
Buton PCB 4 Link0.36
LED RGB 1 Link1.51
Suport 4AA 1 Link6.34
Fire Dupont 10cm Tata-Tata TBD Link0.15
Fire Dupont 20cm Tata-Mama TBD Link0.25
Rezistență 470 2 Link0.15
Diodă 1N4007 1 Link0.49
Rezistență 10k 2 Link0.15
Baterii AA 4 2.00
Preț total 104.66 RON

Schema electrică

Pinout (principale conexiuni)

Senzor temperatură

Pin componentă Pin arduino Pin microcontroller Mențiuni
GND GDN
VCC 5V
OUT A0 PC0 ADC0

Senzor umiditate sol

Pin componentă Pin arduino Pin microcontroller Mențiuni
GND GND
VCC 5V
OUT A2 PC2 ADC2

Senzor nivel apă

Pin componentă Pin arduino Pin microcontroller Mențiuni
GND GND
VCC 5V
OUT A1 PC1 ADC1

LED RGB

Pin componentă Pin arduino Pin microcontroller Mențiuni
Anod 5V
Red 10 PB2 PWM
Blue 9 PB1 PWM

OLED

Pin componentă Pin arduino Pin microcontroller Mențiuni
GND GND
VCC 3V3
SCL A5 PC5 I2C
SDA A4 PC4 I2C

Modul releu

Pin componentă Pin arduino Pin microcontroller Mențiuni
GND GND
VCC 5V
IN 8 PB0 Comandă digitală

Prin releu este comandată pompa submersibilă.

Conectări

Pin 1 Pin 2 Mentiuni
COM - releu (+) - baterie
NO - releu (+) - pompă

Pe bornele pompei se află o diodă 1N4007 pentru protejarea circuitului împotriva tensiunilor inverse.

Divizor tensiune

Divizorul de tensiune este utilizat pentru monitorizarea tensiunii pe baterie și este alcătuit din două rezistențe de 10k. Valoarea este citită de pe pinul A3(PC3) - ADC3.

Butoane

Buton Pin arduino Pin microcontroller Mențiuni
BTN1 2 PD2 INT0
BTN2 3 PD3 INT1
BTN3 4 PD4 PCINT20
BTN4 7 PD7

Butoanele au activată rezistența de pull-up.

Software Design

Mediu de dezvoltare:

  • Arduino IDE (voiam să utilizez PlatformIO pentru a lucra ca la laborator dar am ales Arduino IDE pentru a utiliza bibliotecile Adafruit ale ecranului OLED)

Biblioteci utilizate:

  • Adafruit_GFX
  • Adafruit_SSD1306 - oferă funcții optimizate pentru afișarea a diferite forme geometrice și a bitmap-urilor.
  • EEPROM - oferă metoda update() pentru a preveni scrierile redundante.

Funcționare:

  • Optimizări ADC:
    • ADC-ul este configurat cu regiștrii.
    • Pentru a elimina zgomotul electromagnetic generat de comutația releului, citirea senzorilor analogici se face cu funcția getFilteredADC(), care efectuează un set de citiri succesive, le sortează crescător, elimină extremele și calculează media aritmetică a valorilor rămase.
    • Înainte de a cupla releul pompei se apelează funcțiile checkWaterLevel() și checkVoltage(). Acestea forțează citiri ADC pentru a se asigura că este bateria este incărcată și este suficientă apă în rezervor. În funcție de starea de eroare LED-ul trece în BLUE_FADE (apă insuficientă) sau RED_FADE (baterie descărcată).
    • Funcția checkReturnFromError() verifică în fundal revenirea la parametrii normali (citiri ADC periodice) pentru stingerea LED-ului la puțin timp după soluționarea problemei.
  • Moduri de funcționare:
    • HUMIDITY: Sistemul compară umiditatea curentă a solului cu pragul selectat din listă {50%, 60%, 70%, 80%}. Dacă umiditatea scade sub prag se declanșează udarea. Include o perioadă de pauză humidityCooldownTime pentru a permite apei să se propage uniform în sol.
    • TIMED: Udarea se activează automat la intervale fixe de zile din lista {1, 2, 3, 4}.
    • MANUAL: Permite utilizatorului să acționeze pompa prin menținerea apăsării unui buton.
  • Interfața vizuală:
    • Display-ul OLED comută între trei stări de afișare controlate de displayHandler():
      • Ecranul STANDARD: Afișează modul curent de funcționare, temperatura și umiditatea solului.
      • Ecranul MENU: Permite configurarea pragului de umiditate sau a intervalului de timp.
      • Ecranul WATERING: Afișează o imagine în timpul funcționării pompei. Pentru modurile automate se adaugă si o bară de progres.
  • Interacțiunea cu utilizatorul:
    • Întreruperile sunt configurate cu regiștrii iar cele externe sunt pe frontul descrescător.
    • Pentru evitarea declanșărilor neintenționate este utilizată variabila lastRelayCommand în interiorul ISR.
    • INT0 - BTN1: Schimbă modul de funcționare în ecranul STANDARD sau selectează parametrul de modificat în ecranul MENIU.
    • INT1 - BTN2: Incrementează ciclic indexul pragului de umiditate sau al intervalului de timp în ecranul MENIU.
    • PCINT20 - BTN3: Comută între ecranul STANDARD și cel de MENIU și acționează ca declanșator pentru trezirea din modul Standby.
    • BTN4: Prin menținerea acestuia apăsat este activată udarea în modul MANUAL.
  • Standby:
    • Dacă sistemul nu detectează nicio activitate din partea utilizatorului timp de 60 de secunde (standbyTime), ecranul OLED este stins complet prin comanda SSD1306_DISPLAYOFF.
  • Persistența datelor:
    • Prin intermediul funcției updateEEPROM(), stările curente ale variabilelor - mode, humidityIndex și timedIndex - sunt salvate automat în memorie (EEPROM_MODE_ADDR, EEPROM_HUMIDITY_ADDR, EEPROM_TIMED_ADDR). Această scriere se efectuează doar în momentul în care utilizatorul părăsește ecranul de MENIU sau când sistemul intră automat în starea de Standby, utilizând metoda EEPROM.update() pentru a scrie datele doar dacă acestea s-au modificat.
  • Temporizare:
    • Pentru gestionarea intervalelor de timp este folosit un timer software implementat cu ajutorul Timer2 configurat în modul CTC, întreruperea TIMER2_COMPA_vect incrementând variabila currentMillis la 1ms.
  • PWM:
    • Pentru PWM pe LED-ul RGB este folosit PWM hardware configurat prin Timer1 (Fast PWM) pe canalele OC1A și OC1B.

Calibrare senzori:

  • Umiditate: am determinat tensiunea pentru senzorul în aer și am ales o valoare ceva mai mică (3V vs 3.2V). Valoarea pentru 100% umiditate a fost determinată în urma unei udări (1.4V). Senzorul este in logică inversă (pentru un sol foarte uscat scoate o tensiune apropiată de cea de alimentare).
  • Nivel apă: momentan am pus o valoare de 400 care o să fie schimbată probabil în varianta finală a proiectului în funcție de forma recipientului.
  • LM35: nu necesită.

Utilizare noțiuni laborator:

  • I2C: comunicare cu display-ul OLED.
  • ADC: citirea valorilor senzorilor analogici.
  • PWM: obținerea efectului de luminozitate variabilă pe LED-ul RGB.
  • Întreruperi: evitarea polling-ului pe butoane.
  • Timere: se utilizează Timer2 pentru obținerea unei funcționalități echivalente cu millis().

Element de noutate : Combinarea celor trei moduri de funcționare diferite.

Rezultate Obţinute

Ecran STANDARD
 Ecran STANDARD

Ecran STANDARD (după reset)
 Ecran STANDARD (după reset)

Ecran MENU
 Ecran MENU

Ecran WATERING
 Ecran WATERING

Link-uri rezultate:

A se ignora valoarea afișată a temperaturii în videoclipuri deoarece am rupt unul dintre picioarele senzorului și nu era conectat.

Concluzii

  • Este importantă achiziționarea unor componente de rezervă.
  • Nu mă așteptam să scriu așa de mult cod.

Download

Jurnal

  • 16.04.2026 - Alegere tema proiect si confirmare.
  • 17.04.2026 - Plasare comandă componente.
  • 23.04.2026 - Testare funcționare pompă.
  • 02.05.2026 - Creare pagină de documentație.
  • 06.05.2026 - Aproape finalizată pagina pentru primul termen și primul prototip cu ecran, senzorul de temperatură și butoane pentru schimbarea modului și activarea ecranului (standby).
  • 07.05.2026 - Prototipul are moduri de funcționare, meniuri interactive și persistența setărilor. Conectare LED, senzor umiditate, buton, divizor de tensiune.
  • 11.05.2026 - Toate conexiunile sunt realizate dar am stricat pompa (funcționează doar uneori).
  • 17.05.2026 - Finalizare software. Videoclipuri realizate. Rupt picior senzor LM35.
  • 19.05.2026 - Realizat PWM și millis() cu regiștrii.

Bibliografie/Resurse

Resurse Hardware

Resurse Software

Export to PDF

pm/prj2026/victor.stoica0203/stefan.gherghel.txt · Last modified: 2026/05/19 21:42 by stefan.gherghel
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