Table of Contents

Plant Care System

Introducere

Prezentarea pe scurt a proiectului:

  • Ce face: Acest proiect este un Sistem de Monitorizare a Plantelor, conceput pentru a automatiza și simplifica procesul de îngrijire a plantelor.
  • Care este scopul lui: Să faciliteze îngrijirea plantelor prin automatizare, reducând nevoia de intervenție manuală constantă.
  • Ideea: A pornit din nevoia de a avea mai multă grijă de plantele de interior, mai ales atunci când utilizatorii sunt ocupați sau plecați.
  • La ce bun?: Acest sistem este util deoarece ajută la asigurarea unei îngrijiri adecvate a plantelor fără verificări frecvente, fiind ideal pentru studenți, persoane ocupate sau orice iubitor de plante.

Descriere generală

Acest proiect este un Sistem Inteligent de Monitorizare și Udare Automată a Plantelor, conceput pentru a automatiza îngrijirea plantelor prin monitorizarea condițiilor de mediu și activarea unei pompe de apă atunci când este necesar. Este potrivit pentru utilizare în interior sau în sere de dimensiuni mici.

Proiectul integrează senzori pentru a măsura umiditatea solului și, opțional (în extinderi viitoare), temperatura și nivelul de lumină, toate fiind procesate de un microcontroler compatibil cu Arduino Uno. În funcție de valorile obținute, sistemul poate activa o pompă de apă, aprinde un modul LED sau afișa date pe un ecran.

Componente Hardware

Logica decizională

Se activează pompa și LED-ul dacă solul este prea uscat:

if (moistureLevel < threshold) {
  digitalWrite(pumpPin, HIGH);
  digitalWrite(ledPin, HIGH);
} else {
  digitalWrite(pumpPin, LOW);
  digitalWrite(ledPin, LOW);
}

Controlul actuatorilor

Extensii posibile

Imaginea de mai jos prezintă o schemă bloc cu toate modulele proiectului actual și viitor, împreună cu interacțiunile dintre ele:

Hardware Design

Listă de materiale

Componentă Specificații sumare Link de achiziție
ATmega328P Microcontroler pe 8 biți, frecvență de până la 20 MHz, 32 KB memorie flash, 2 KB SRAM, 23 pini I/O, compatibil cu Arduino Uno link_aTMega
Breadboard 400 puncte Dimensiuni: 8.5 x 5.5 x 0.85cm; Diametru fir necesar: 0.8mm. link_breadboard
Mini pompă submersibilă 5V USB Lungime cablu 1 metru cu mufă DC; Debit 16l/min; Consum curent 300 mA – 1 A; Rezistență internă 2.7 ohmi; P 9W; link_pompa
Senzor umiditate sol Tensiune de alimentare: 3.3V sau 5V DC; Dimensiune modul: 3 x 1.5 cm; Dimensiune senzor: 6 x 2 cm; senzor_sol
Senzor nivel apa Tensiune de operare: 3-5V DC; Curent de operare: >20mA; Temperatura de operare: 10 - 30°C; Dimensiuni: 62 x 20 x 8 mm; big_link
Cabluri jumper M-M, pentru conectare rapidă link_cabluri_optimus
Rezistențe diverse 220Ω, 10kΩ, etc., pentru circuite de bază link_rezistori
Modul semafor LED roșu, verde, albastru modul_link
Tranzistor NPN link_tranzistor
Dioda 1N4007 link_dioda
Modul WiFi ESP8266 ESP-01 Negru Tensiune de alimentare: 3.3V; Curent consumat: 70mA - 300mApk; Comunicație UART la 115200 bps; Curent consumat în modul power down: <10uA; modul_wifi_esp_01

Circuite componente/module individuale

ATmega328P

Aici gasesti fișa tehnică ATmega328P (PDF)

Schema Block:

ESP 01

Documentația completă pentru modulul ESP-01 poate fi găsită aici: ESP-01 Datasheet și Specificații

Caracteristici principale:

Modulul wireless ESP-01 integrează cipul ESP8266, un microcontroler puternic cu funcționalitate WiFi, care permite comunicarea prin rețea fără fir. Pentru a-l folosi împreună cu o placă Arduino, se utilizează conexiunea serială UART, la o viteză de transmisie de 115200 bps (baudrate).

Modulul dispune de 1 MB memorie flash pentru stocarea programelor și a datelor, precum și de doi pini GPIO (General Purpose Input/Output), care pot fi controlați similar cu pinii digitali ai plăcii Arduino. Acești pini pot fi folosiți pentru a citi sau controla senzori și actuatori în proiectele voastre.

Astfel, prin intermediul unei interfețe seriale, Arduino poate trimite și primi comenzi către modulul ESP-01 pentru a se conecta la o rețea WiFi și pentru a comunica cu alte dispozitive sau servicii cloud.

Asemenea altor module prezentate, dispozitivul funcționează la o tensiune de alimentare de 3.3 V. Aceasta poate fi furnizată în siguranță, direct de pe plăcuța Arduino. În schimb, pentru restul conexiunilor este nevoie să folosim un modul de conversie de niveluri logice, de la 5 V la 3.3 V. O posibilă modalitate de a evita utilizarea unui astfel de convertor de niveluri logice, fără a risca distrugerea modulului ESP-01 este utilizarea unei conexiuni precum cea figurată din imaginea de mai sus.

Pentru a comunica cu plăcuța Arduino pinul RX al modulului WiFi se conectează la pinul RX al plăcuței, iar pinul TX la pinul TX Arduino. Dacă nu folosiți un convertor de nivel, puteți folosi un divizor de tensiune realizat din două rezistoare: Pinul Arduino va genera o tensiune de 5 V. Pe pinul modulului WiFi vom obține:

BreadBoard

Pentru detalii suplimentare, accesați Datasheet-ul oficial.

Pompa de Apa

🔧 Prezentare generală a circuitului intern

Pompa submersibilă mini 5V cu mufa USB este o pompă mică, cu motor DC fără perii (BLDC), folosită frecvent în proiecte DIY, acvarii și sisteme mici de circulație a apei.

Componente incluse în circuit:

⚙️ Diagrama Funcțională (Simplificată)

O diagramă funcțională generalizată a unei astfel de pompe include următoarele componente:

🔄 Control și Integrare

Pentru a integra această pompă într-un proiect folosesc urmatorul mecanism de comutare: un tranzistor + rezistentele necesare pentru a controla alimentarea pompei.

Senzor de Umiditate

🔧 Descrierea circuitului intern

Senzorul de umiditate a solului de la Optimus Digital este un senzor rezistiv, care măsoară umiditatea solului prin rezistența electrică dintre cele două sonde metalice. Circuitul intern include:

🔌 Conectarea senzorului

Senzorul are patru pini:

🔧 Cum am realizat testarea senzorului?

Am creat urmatorul circuit cu led-uri, placa compatibila arduino uno R3, fire, breadboard si am folosit un ghemotoc de vata uda pentru a testa senzorul.

Pentru mai multe informatii, verificati link-ul: YL-69-HL-69 Sensor Specifications

Modul Led

🔧 Specificații tehnice

Dimensiuni: 56 x 21 x 11 mm LED-uri: Roșu, Galben, Verde Dimensiune LED: 5 mm Tensiune de alimentare: 3.3V sau 5V DC Tip LED: Catod comun Intrare: Digitală Rezistori integrați: Da

🔍 Circuit intern

Fiecare LED este conectat în serie cu un rezistor de limitare a curentului. Toate LED-urile au catodul comun, ceea ce înseamnă că partea negativă a fiecărui LED este conectată la un punct comun, iar partea pozitivă este controlată individual.

Senzor de Apă (Plutitor)

Senzorul de nivel pe bază de plutitor funcționează prin închiderea unui circuit electric atunci când nivelul apei atinge o anumită înălțime, activând un contact reed magnetic. Este simplu, fiabil și ideal pentru aplicații de detectare a prezenței lichidului. Material : polipropilena Putere comutata : 10W Curent max comutat : 0.5A Temperatura de operare max : 85C

Este similiar cu cel gasit la documentatia: plutitor_En

Schema Electrica:

Switch Control

Circuit de control al unei pompe de apă folosind un tranzistor NPN pentru a comuta curentul care alimentează pompa, pe baza semnalului digital trimis de un pin de pe Arduino. Iată cum funcționează circuitul:

Semnal de control de la Arduino: Pinul digital D7 de pe Arduino trimite un semnal HIGH (5V). Acest semnal trece printr-un rezistor de aproximativ 1kΩ, care protejează baza tranzistorului și limitează curentul care ajunge la acesta.

Comutarea tranzistorului NPN: Semnalul HIGH (5V) ajunge la baza tranzistorului NPN (2N2222). Curentul trece prin rezistor și ajunge la baza tranzistorului, ceea ce face ca tranzistorul să intre în modul de saturație (ON). Când tranzistorul este ON, colectorul (C) este conectat la emitor (E), creând astfel un traseu de curent prin pompa de apă, care este conectată la 5V.

Pornirea pompei: Deoarece tranzistorul este în modul ON, pompa de apă este conectată la GND, ceea ce permite curentului să circule prin ea și să o pornească.

Oprirea pompei: Când pinul D7 este setat pe LOW (0V), curentul nu mai ajunge la baza tranzistorului. Tranzistorul se oprește și curentul nu mai trece prin pompa de apă, astfel că aceasta se oprește.

Componente necesare: 1x tranzistor NPN

1x rezistor ~1kΩ (pentru baza tranzistorului)

1x diodă pentru a proteja pompa de efectele curentului invers, conectată invers pe terminalele pompei;

Circuit final

—Înlocuiri de Componente pentru Simulare—

Pentru a simula circuitul într-un mod realist, am efectuat câteva înlocuiri de componente în scopul obținerii unui comportament funcțional corespunzător. Detaliile acestor înlocuiri sunt următoarele:

În locul unui senzor de nivel de apă analogic specific, am utilizat un potențiometru pentru a simula schimbările de rezistență și, implicit, varierea nivelului apei. Acest potențiometru permite ajustarea valorii de tensiune de ieșire pentru a simula diferite niveluri de apă, de la nivel scăzut (uscat) până la nivel înalt (plin).

💡 Ce face: Potențiometrul simulează creșterea/scăderea nivelului apei. Valoarea variază de la 0 (gol) la 1023 (plin). Se poate roti butonul în timpul simulării pentru a vedea cum se schimbă valoarea în Serial Monitor.

În locul unei diode flyback dedicate, am adăugat o diode 1N4007 pentru protecția circuitului în fața tensiunilor induse de sarcini inductive. Aceasta diodă a fost plasată paralel cu sarcina inductivă pentru a proteja componentele sensibile, cum ar fi Arduino sau tranzistorii, de eventualele spike-uri de tensiune.

Pentru a simula pompa de apa am utilizat componentele de bază din Tinkercad: motor, transistor NPN, înlocuind necesitatea unui sistem fizic real.

Schematic:

Circuit:

Lista Componente:

⚙️ Descriere a Pinilor Utilizați

Această secțiune explică exact ce pin de pe microcontroller este conectat la fiecare componentă, motivul alegerii și indică ce elemente sunt planificate pentru viitor.

🌊 Senzor Nivel Apă – A0

🌱 Senzor Umiditate Sol – A1

💡 LED-uri de Stare

🔌 Pompa de Apă / Comutator – Pin D7

🛑 Buton pentru Întrerupere – Pin D2 `(future)`

📶 Modul ESP-01 – UART: Pin D0 (RX), Pin D1 (TX) `(future)`


Notă: Alegerea pinilor a ținut cont de:
* Necesitatea ADC pentru senzori (analogRead)
* Compatibilitate PWM pentru LED-uri și control tranzistor
* Pinuri hardware dedicate pentru UART și întreruperi
* Extensibilitate pentru funcții viitoare

🔌 Simulare Electrică

Vizualizează conexiunile și comportamentul sistemului:

Notă: Această simulare arată conexiunile dintre:
* senzorul de umiditate,
* LED-urile de stare,
* pompa de apă,
* microcontrollerul,
* senzorul de nivel (reostat).

Software Design

Corespondență cu laboratoarele

Proiectul integrează concepte și tehnologii abordate în cadrul mai multor laboratoare, după cum urmează:

Componente periferice externe utilizate

Contribuție software

Chiar dacă hardware-ul este simplu, logica software a fost concepută modular și include:

Aceste aspecte asigură aplicarea efectivă a cunoștințelor dobândite în cadrul laboratorului și îndeplinirea cerințelor minime de complexitate software impuse de proiect.


Functii Peronalizate

* setupTimer2ForButton()

Scop: Configurează Timer2 în mod CTC pentru a genera întreruperi la fiecare 1 ms, folosite pentru a detecta apăsarea butonului de reset.

+------------------------------+
| setupTimer2ForButton()      |
+------------------------------+
| - Dezactivează întreruperile|
| - Setează Timer2 în mod CTC |
| - OCR2A = 249 (1kHz rate)   |
| - Activează întreruperea    |
| - Activează întreruperile   |
+------------------------------+

* ISR(TIMER2_COMPA_vect)

Scop: Rutina de întrerupere asociată Timer2 care detectează tranziția de la HIGH la LOW a butonului pentru reset.

+--------------------------------+
| ISR(TIMER2_COMPA_vect)        |
+--------------------------------+
| - Citește starea butonului     |
| - Dacă trece de la HIGH -> LOW |
|   → setează `resetRequested`  |
| - Actualizează `lastState`     |
+--------------------------------+

* pumpTimeoutISR()

Scop: Rutina apelată automat de Timer1 după 10 secunde; setează flag-ul pumpTimeout pentru a opri pompa.

+---------------------------+
| pumpTimeoutISR()         |
+---------------------------+
| - Setează pumpTimeout = 1 |
+---------------------------+

* checkPumpTimeout()

Scop: Verifică dacă pompa trebuie oprită din cauza expirării temporizatorului.

+------------------------------+
| checkPumpTimeout()          |
+------------------------------+
| IF pumpTimeout && pumpOn:   |
|   → Oprește pompa           |
|   → Resetare flaguri/timer  |
+------------------------------+

* lockPump()

Scop: Oprește și „blochează” pompa atunci când nivelul de apă este scăzut pentru prea mult timp.

+---------------------------+
| lockPump()               |
+---------------------------+
| - Oprește pompa          |
| - Setează pumpLocked     |
| - Resetează timerul      |
+---------------------------+

* unlockPump()

Scop: Resetează blocarea pompei, permițându-i să fie pornită din nou.

+---------------------------+
| unlockPump()             |
+---------------------------+
| - Resetează toate flagurile |
| - Oprește timerul          |
+---------------------------+

* connectToWiFi()

Scop: Trimite comenzi AT către modulul ESP pentru a-l conecta la rețeaua WiFi.

+--------------------------------+
| connectToWiFi()               |
+--------------------------------+
| - Trimite AT+RST              |
| - Setează modul pe CWMODE=1   |
| - Trimite AT+CWJAP cu SSID    |
| - Așteaptă conectarea         |
+--------------------------------+

* sendToThingSpeak(int soilValue, int waterLevel)

Scop: Trimite datele de la senzor către ThingSpeak folosind o comandă HTTP GET.

+------------------------------------------------+
| sendToThingSpeak(soilValue, waterLevel)       |
+------------------------------------------------+
| - Trimite AT+CIPSTART (TCP către ThingSpeak)  |
| - Construiește string GET cu cheie API        |
| - Trimite dimensiunea mesajului               |
| - Trimite datele (field1, field2)             |
| - Închide conexiunea cu AT+CIPCLOSE           |
+------------------------------------------------+

* loop() (parțial personalizat) Scop: Conține o structură modulară care:


Descrierea codului aplicaţiei si modului de testare

Mediu de testare utilizat

Pentru testarea hardware-ului cu un software simplu s-a utilizat platforma Tinkercad Circuits pentru simularea inițială a circuitului, permițând testarea logicii de control într-un mediu vizual interactiv.

Urmatoare imagine reflecta logica simpla pe care am folosit-o pentru a simula circuitul.

Ulterior, implementarea firmware-ului s-a realizat în Arduino IDE, un mediu de dezvoltare open-source destinat programării microcontrolerelor compatibile cu platforma Arduino. Acesta a oferit facilități de scriere, compilare și upload al codului către placă, precum și un monitor serial pentru debug și testare.

Testare mai avansata - inainte de optimizari si de aplicarea cunostintelor despre protocoalele invatate in laboratoare. Fisierul cu codul pentru aceasta testare se gaseste la: .\PlantCareSystem\Software\TestingPurpose\sketch_may15a ( in commit-urile mai vechi).

Schema de baza

Aceasta este schema de baza de la care am plecat si peste care am implementat primul soft dupa care am testat:

START
  |
  V
Citeste valoarea senzorului de umiditate (ADC - A1)
  |
  V
Afiseaza valoarea in Serial Monitor (UART)
  |
  V
Comparare cu praguri:
  |-- [Valoare > dryThreshold (uscat)] --> LED rosu ON, LED verde OFF
  |                                      Activare pompa (D7 HIGH)
  |                                      Afisare status pompa (UART)
  |                                      Asteapta 3 secunde
  |                                      Dezactivare pompa (D7 LOW)
  |
  |-- [Valoare < wetThreshold (umed)] --> LED verde ON, LED rosu OFF
  |                                      Asigura pompa oprita (D7 LOW)
  |
  |-- [Alt caz] -----------------------> Toate LED-urile OFF
                                         Asigura pompa oprita (D7 LOW)
  |
  V
Asteapta 2 secunde si repeta

Aceasta este schema de baza a soft-ului complet, dupa care am realizat implementarea finala:

START
  |
  V
Inițializări:
 - Pini: LED-uri, pompă, senzor, plutitor, buton reset
 - UART și SoftwareSerial pentru ESP
 - Timer1 (10s) pentru oprirea pompei
 - Timer2 pentru citirea butonului de reset (cu ISR)
 - Conectare la WiFi prin ESP
  |
  V
LOOP:
  |
  V
Dacă au trecut 2 secunde:
  |
  +--> Citește valoare umiditate sol (A1)
  |
  +--> Afișează în UART (opțional)
  |
  +--> Comparare valoare:
  |     |
  |     |-- [valoare > dryThreshold]:
  |     |      - LED roșu ON (intensitate proporțională cu uscăciunea)
  |     |      - LED verde OFF
  |     |      - Dacă pompa e oprită și nu e blocată:
  |     |          - Pornește pompa (D7 HIGH)
  |     |          - Pornește Timer1 pentru 10s
  |     |
  |     |-- [valoare < wetThreshold]:
  |     |      - LED verde ON
  |     |      - LED roșu OFF
  |     |      - Verifică dacă Timer1 a expirat (checkPumpTimeout)
  |     |
  |     |-- [între praguri]:
  |            - LED-uri cu intensitate intermediară
  |            - Verifică dacă Timer1 a expirat
  |
  +--> Verificare nivel apă (plutitor - D2):
        |
        |-- [float HIGH (nivel OK)]:
        |      - Nu face nimic special
        |
        |-- [float LOW (nivel scăzut)]:
               - LED galben ON
               - Pornește timer de 30s dacă nu e deja pornit
               - Dacă au trecut 30s:
                   - Dezactivează pompa
                   - Oprește Timer1 (blochează pompa)
  |
  +--> Trimitere date către ThingSpeak:
         - Soil moisture + nivel apă
  |
  +--> Verificare buton reset (prin ISR):
         - Dacă a fost apăsat:
             - Resetează blocarea pompei
             - Oprește LED galben
  |
  V
REPETĂ LOOP

Evoluția implementării – Extinderi și modificări față de planul inițial

Laborator 1 – UART

Laborator 2 – Întreruperi

Laborator 3 – Timere și PWM

Laborator 4 – ADC


Extinderi Posibile


Librării și surse 3rd-party

1. TimerOne.h

2. AVR IO și Interrupts

3. SoftwareSerial

4. Definirea pinilor

Configuratia actuala a pinilor:

Pin Funcție / Descriere
2 Intrare digitală pentru senzorul plutitor (floatPin)
3 LED galben (yellowLED) - PWM - legat la Timer2 (OC2B)
4 Buton reset (resetButtonPin)
5 LED verde (greenLED) - PWM
6 LED roșu (redLED) - PWM
7 Control pompa (switchPin)
10 TX SoftwareSerial (ESP WiFi) - pin asociat Timer1 (OC1B)
11 RX SoftwareSerial (ESP WiFi) - pin asociat Timer2 (OC2A)
A1 (analog) Intrare analogică pentru senzorul de umiditate sol (soilSensorPin)

Notă:

Timer1 and Timer2 Pins on ATmega328P (Arduino Uno)

Timer1 (16-bit timer)

  1. Pins:
    1. Pin 9 (OC1A) – Output Compare A
    2. Pin 10 (OC1B) – Output Compare B
  1. Used for PWM outputs on pins 9 and 10.

Timer2 (8-bit timer)

  1. Pins:
    1. Pin 3 (OC2B) – Output Compare B
    2. Pin 11 (OC2A) – Output Compare A
  1. Used for PWM outputs on pins 3 and 11.

Notes

  1. When using Timer1, avoid using pins 9 and 10 for other PWM or timer-related functions.
  2. When using Timer2, avoid using pins 3 and 11 for other PWM or timer-related functions.

Recommended pins for other I/O or SoftwareSerial

  1. Pins: 2, 4, 5, 6, 7, 8, 12, 13
  2. Note: Pins 5 and 6 are PWM pins controlled by Timer0.
  3. Pins 0 and 1 are hardware serial pins (avoid if using USB serial).

Algoritmi și structuri planificate

Aplicația are ca scop automatizarea controlului unei pompe de apă, în funcție de nivelul detectat de un senzor de umiditate. Logica principală implică:

Structura firmware-ului este organizată în jurul funcțiilor `setup()` și `loop()`, caracteristice platformei Arduino, cu separarea clară a inițializărilor față de logica repetitivă de rulare.

Actualizare: S-a adăugat suport complet pentru controlul pompei cu temporizări precise folosind Timer1, detecția butonului reset prin Timer2 configurat la nivel de registri (fără bibliotecă), precum și comunicarea Wi-Fi prin modulul ESP cu trimiterea datelor către ThingSpeak. Aceste modificări extind funcționalitatea inițială și îmbunătățesc robustetea sistemului.

Conzluzii - Rezultate Obţinute

În urma implementării proiectului, s-a reușit automatizarea cu succes a sistemului de irigare, conform cerințelor stabilite. Pompa este controlată automat în funcție de valorile obținute de la senzorul de umiditate și de la senzorul de nivel al apei (simulat cu un potențiometru). Funcțiile de siguranță, precum oprirea temporizată a pompei și blocarea în caz de nivel scăzut al apei, au fost implementate cu succes. De asemenea, s-a realizat transmiterea datelor către platforma ThingSpeak prin conexiune Wi-Fi și s-a integrat un buton de deblocare a pompei, gestionat prin întrerupere.

Poți viziona simularea proiectului accesând linkul de mai jos:

Toate funcționalitățile propuse au fost testate și validate în mediu de simulare, demonstrând stabilitatea și eficiența soluției.

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF