Table of Contents

Smart4Plant - Sistem inteligent de irigare și monitorizare a plantelor

Introducere

Smart4Plant este un sistem inteligent de irigare și monitorizare a plantelor, conceput pentru a ajuta utilizatorii să își îngrijească plantele de interior prin udare automată și monitorizare în timp real a condițiilor de mediu. Persoanele pasionate de plante pot întâmpina dificultăți în îngrijirea acestora din diverse motive, în special atunci când sunt plecate pentru perioade mai lungi și nu se află în apropierea plantelor lor.
Sistemul oferă o soluție automată care monitorizează continuu nivelul de umiditate al solului, temperatura și umiditatea aerului, activând sistemul de irigare atunci când este necesar pentru a menține condiții sănătoase pentru plante.
De asemenea, Smart4Plant poate îmbunătăți accesibilitatea și confortul persoanelor cu dizabilități sau mobilitate redusă.
Sistemul reduce efortul fizic necesar pentru îngrijirea și udarea regulată a plantelor.
Prin automatizarea sarcinilor esențiale de întreținere și monitorizarea condițiilor de mediu, proiectul își propune să ofere o soluție practică, accesibilă și ușor de utilizat pentru o îngrijire mai inteligentă a plantelor.

Descriere generală

Schema bloc a proiectului:
Schema bloc Smart4Plant
Componentele principale pe care le utilizez în proiect sunt:

Senzor de umiditate a solului

Este utilizat pentru monitorizarea nivelului de umiditate în sol.
Valorile citite sunt analizate apoi prin intermediul microcontroller-ului pentru a determina momentul în care planta necesită udarea.
Acesta poate măsura temperatura din intervalul -20 Celsius ⇔ 50 Celsius, cu o precizie de +-2 Celsius și umiditatea din intervalul 20% - 90%, cu o precizie de +- 15%.

Senzor de temperatură

Am utilizat un modul DHT11 KY-015 pentru măsurarea temperaturii și umidității aerului.

Mini pompă submersibilă

Am utilizat o mini pompă de apă submersibilă de 1.6L/min, aceasta fiind responsabilă pentru irigarea automată a plantei. Ea funcționează la o tensiune între 3V și 5V și are un consum de curent de aproximativ 100-200mA.
Pentru controlul pompei am folosit un tranzistor NPN 2N2222 și o diodă 1N4007 pentru a proteja circuitul împotriva curenților inverși care sunt generați la oprirea motorului.
Am alimentat pompa, cât și motorul DC a cărei descriere este mai jos, printr-o sursă externă de 5V pentru mă asigura că placa Arduino nu se va arde.

Motor DC pentru ventilație

Motorul DC 3V - 6V este utilizat pentru simularea unui mic sistem de ventilație pentru a răci mediul plantei atunci când temperatura devine mult prea ridicată. Și el este controlat printr-un tranzistor NPN și e protejat de o diodă 1N4007.

Buzzer pasiv

Modulul buzzer pasiv KY-006 va oferi feedback audio utilizatorului privind starea sistemului și va semnala evenimente importante, precum oprirea sistemului de irigare, pornirea sistemului de irigare, nivelul scăzut al apei în rezervor, un semnal audio atunci când temperatura este prea ridicată, caz în care sistemul de ventilație va porni.
Am ales să introduc și acest feedback auditiv, deoarece m-am gândit că ar putea contribui la îmbunătățirea accesibilității sistemului pentru persoanele cu deficiențe de vedere, oferind infos despre starea sistemului fără a mai fi necesară observarea LED-urilor de status sau a display-ului.

Fotorezistență

Este utilizată pentru măsurarea intensității luminii ambientale. Sistemul va putea decide activarea irigării în funcție de nivelul de lumină detectat.

Senzor de nivel al apei

Monitorizează cantitatea de apă disponibilă în rezervorul în care este amplasată pompa submersibilă și previne funcționarea pompei în lipsa apei.

Modul Bluetooth HC-06

Acesta oferă conectivitate Bluetooth sistemului și îmi permite să transmit informații despre starea plantei, a sistemului și diverși parametrii către o aplicație mobilă. Comunicarea între plăcuța Arduino UNO și modulul HC-06 se realizează prin protocol UART.

Hardware Design

Schema hardware a circuitului

Pin Arduino UNO Conectat la Rol
5V Rail alimentare breadboard Alimentare generală pentru senzori și module
GND Rail GND breadboard Masă comună pentru întreg circuitul
A0 Senzor umiditate sol Citirea nivelului de umiditate din sol
A1 Fotorezistență (LDR) Măsurarea intensității luminii ambientale
A2 Senzorul DATA temperatură DHT11 Citirea temperaturii mediului
D10 LED verde Indicator stare sistem
D11 LED galben Indicator stare sistem
D12 LED rosu Indicator stare sistem
D8 Buzzer Semnalizare audio
D9 Tranzistor NPN motor DC Control motor (ventilator)
D4 Buton pornire/oprire sistem Input utilizator
D6 Tranzistor NPN pompă Control pompă
D5 Senzor nivel apă Indică faptul că apa din rezervor e peste o limită
A4 (SDA) Display OLED SDA Comunicație I2C
A5 (SCL) Display OLED SCL Comunicație I2C
Componentă Descriere conexiuni
Modul Bluetooth HC-06 Pinul VCC este conectat la 5V Arduino UNO pentru alimentare, iar pinul GND este conectat la GND pentru masă comună. Pinul TXD al modulului este conectat direct la pinul RX al Arduino UNO pentru transmiterea datelor către microcontroller. Pinul RXD al modulului este conectat la pinul TX al Arduino UNO printr-un divizor de tensiune realizat din două rezistențe de 1kΩ și 2kΩ, utilizat pentru reducerea nivelului logic de la 5V la 3.3V și protejarea modulului Bluetooth.
Senzor umiditate sol Pinul VCC este conectat la 5V Arduino UNO, pinul GND este conectat la GND, iar pinul SIG este conectat la A0 pentru citirea nivelului de umiditate al solului.
Senzor temperatură DHT11 Pinul VCC este conectat la 5V Arduino UNO pentru alimentare, pinul GND este conectat la GND, iar pinul DATA este conectat la A2 pentru transmiterea valorilor de temperatură și umiditate.
Fotorezistență (LDR) Un terminal al fotorezistenței este conectat la 5V, iar celălalt terminal este conectat la A1 și la un rezistor conectat către GND, formând un divizor rezistiv utilizat pentru măsurarea intensității luminii ambientale.
LCD 16×2 cu interfață I2C Pinul VCC este conectat la 5V Arduino UNO, pinul GND la GND, pinul SDA la A4 (SDA), iar pinul SCL la A5 (SCL), realizând comunicarea prin protocolul I2C.
Buzzer Pinul pozitiv al buzzerului este conectat la D8 pentru generarea semnalelor sonore, iar pinul negativ este conectat la GND.
LED verde Anodul LED-ului verde este conectat la D10 printr-un rezistor, iar catodul este conectat la GND. LED-ul indică funcționarea normală a sistemului.
LED galben Anodul LED-ului galben este conectat la D11 printr-un rezistor, iar catodul este conectat la GND. LED-ul indică faptul că pompa de irigare udă planta
LED roșu Anodul LED-ului roșu este conectat la D12 printr-un rezistor, iar catodul este conectat la GND. LED-ul indică faptul că planta este acum ventilată.
Buton pornire/opriere sistem Un pin al butonului este conectat la D4 pentru citirea stării acestuia, iar celălalt pin este conectat la GND.
Tranzistor NPN control pompă Baza tranzistorului este conectată la pinul D6 al plăcii Arduino UNO printr-un rezistor pentru controlul pompei. Emitorul este conectat la GND comun. Colectorul este conectat la borna negativă a mini pompei submersibile. Borna pozitivă a pompei este conectată direct la terminalul pozitiv al sursei externe de 9V. Terminalul negativ al sursei externe este conectat la GND-ul comun al circuitului. O diodă este conectată în paralel cu pompa pentru protecția împotriva tensiunilor inverse generate la oprirea motorului.
Tranzistor NPN control motor DC Baza tranzistorului este conectată la pinul D9 al plăcii Arduino UNO printr-un rezistor pentru controlul motorului DC utilizat pentru ventilație. Emitorul este conectat la GND comun. Colectorul este conectat la borna negativă a motorului DC. Borna pozitivă a motorului este conectată direct la terminalul pozitiv al sursei externe de 9V. Terminalul negativ al sursei externe este conectat la GND-ul comun al circuitului. O diodă este conectată în paralel cu motorul pentru protecția împotriva tensiunilor inverse generate la oprire.
Senzor nivel apă Pinul VCC este conectat la 5V Arduino UNO pentru alimentare, pinul GND este conectat la GND, iar pinul SIG este conectat la pinul D9 al Arduino UNO pentru detectarea nivelului apei din rezervor.

Poză cu sistemul

 Fotografie cu sistemul

Software Design

Funcționalități implementate

Funcționalitățile principale pe care le-am implementat sunt:

1) Monitorizarea umidității solului
2) Monitorizarea temperaturii ambientale
3) Monitorizarea intensității luminii
4) Control automat al pompei de apă
5) Control inteligent al ventilatorului prin PWM hardware
6) Sistem de profiluri pentru plante
7) Mod ECO pentru reducerea consumului de apă
8) Afișarea informațiilor pe un ecran LCD I2C
9) Comunicație Bluetooth UART cu aplicația Android realizată în Kotlin
10) Control prin buton folosind întreruperi hardware
11) Detectarea apăsărilor scurte și lungi (pentru a seta între modul clasic de funcționare și modul economic)
11) Un sistem de feedback vizual, dar și audio în caz că rezervorul pompei rămâne fără apă, lucru care ar putea perturba funționarea motorului pompei.

Biblioteci utilizate

Bibliotecă Rol
<avr/io.h> acces direct la registrele hardware ale ATmega328P
<avr/interrupt.h> configurarea și utilizarea întreruperilor hardware
<util/delay.h> generarea delay-urilor hardware necesare protocolului DHT11
<stdio.h> funcții de formatare (“sprintf”)
<string.h> manipulare stringuri
<stdlib.h>

Funcționalități implementate din laboratoare

Sistemul utilizează concepte din mai multe laboratoare:

  1. GPIO
  2. UART
  3. ADC
  4. PWM
  5. Timere
  6. Întreruperi
  7. I2C

Arhitectura software

  1. citi periodic senzorii
  2. actualiza afișajul LCD
  3. controla pompa și ventilatorul
  4. procesa comenzile Bluetooth
  5. detecta apăsările butonului
  6. trimite informații către aplicația Android.


      task_read_sensors() – citirea senzorilor analogici și digitali 
      task_control() – logica principală a sistemului
      task_fan_pwm() – control gradual al ventilatorului prin PWM
      task_display() – actualizarea afișajului LCD
      task_logger() – transmiterea parametrilor către aplicația Android
      task_bluetooth_commands() – procesarea comenzilor Bluetooth
      handle_button() – gestionarea apăsărilor butonului

Structura codului în main.c

Am împărțit fișierul main.c în mai multe secțiuni critice pentru sistemul meu, fiecare având un rol important în cadrul proiectului.

Configurări globale și maparea pinilor

#define FAN_DDR DDRB
#define FAN_PORT PORTB
#define FAN_PIN PB1

typedef enum {

SYSTEM_OFF, 
MODE_CLASSIC, 
MODE_ECO 

} SystemMode;

Gestionarea timpului și Timer 0

Configurarea este realizată prin registrele:

Registru Rol
TCCR0A configurarea modului CTC
TCCR0B configurarea prescalerului
OCR0A valoarea compare match
TIMSK0 activarea întreruperii
Configurarea efectivă

TCCR0A |= (1 « WGM01); OCR0A = 249; TCCR0B |= (1 « CS01) | (1 « CS00); TIMSK0 |= (1 « OCIE0A);

Și la fiecare compare match, este executată întreruperea ISR(TIMER0_COMPA_vect), care incrementează variabila globală volatile uint32_t g_milis, care reprezintă timpul global al sistemului.

-> Scheduler-ul cooperativ
-> PWM hardware și controlul ventilatorului:
TCCR1A configurare PWM
TCCR1B configurare mod + prescaler
OCR1A duty-cycle PWM
COM1A1 activare ieșire PWM
WGM10/WGM12 configurare Fast PWM
Implementarea protocolului DHT11

| Registru / Componentă | Rol

DDRC configurarea pinului DHT11 ca input/output
PORTC controlul semnalului digital transmis către senzor
PINC citirea nivelului logic de pe pin
`_delay_ms()` / `_delay_us()` sincronizare conform protocolului DHT11
GPIO digital
Comunicarea cu aplicația Android

Se realizează prin Bluetooth, utilizând modulul HC-05 și perifericul UART hardware al microcontrollerului. Sistemul poate primi comenzi pentru:

  1. pornirea/oprirerea sistemului;
  2. schimbarea modului de funcționare;
  3. selectarea profilului plantei.

Pentru configurarea comunicației seriale au fost utilizate registrele UART ale microcontrollerului, fără folosirea bibliotecilor Arduino standard. Baud rate-ul a fost configurat la 9600 bps folosind registrele UBRR0H și UBRR0L, iar transmisia și recepția au fost activate prin registrul UCSR0B. Comunicarea se realizează asincron, caracter cu caracter, folosind registrul UDR0 pentru transferul efectiv al datelor.

Registre UART utilizate:

Registru Rol
UBRR0H / UBRR0L configurarea baud rate-ului
UCSR0A registru de status UART
UCSR0B activarea transmisiei și recepției
UCSR0C configurarea frame-ului serial
UDR0 transmiterea și recepția datelor

Sistemul apoi va trimite periodic către aplicația Android informații despre: umiditatea solului, temperatura ambientală, intensitatea luminii, starea pompei și starea ventilatorului.

Comenzile implementate sunt:

S → pornirea sau oprirea completă a sistemului
E → activarea modului ECO
N → selectarea profilului pentru plantă normală
C → selectarea profilului cactus
F → selectarea profilului tropical

Fiecare profil de plantă modifică automat parametrii utilizați de logica sistemului pentru irigare. De exemplu, pentru profilul „plantă normală” sunt setate:

Pentru profilul „cactus”, sistemul utilizează praguri mai conservative:

→ deoarece plantele de tip cactus necesită cantități mai mici de apă și sunt mai sensibile la excesul de umiditate.

În cazul profilului „plantă tropicală”, pragul de umiditate este crescut la 65%, iar durata de funcționare a pompei este mărită la 4000 ms, pentru a menține un nivel ridicat de umiditate specific acestui tip de plante. Selectarea profilului modifică direct variabilele

care ulterior sunt utilizate în funcția task_control()

În același timp, parametrii senzorilor sunt trimiși periodic către aplicația mobilă pentru monitorizare în timp real.

Pentru afișarea informațiilor locale, sistemul utilizează un LCD 16×2 conectat prin protocolul I2C. Comunicarea se realizează direct prin registrele perifericului TWI hardware al ATmega328P, fără utilizarea funcțiilor Arduino standard. LCD-ul afișează:

  1. temperatura
  2. umiditatea
  3. lumina
  4. starea pompei
  5. starea ventilatorului
  6. modul curent de funcționare

Concluzii

În cadrul acestui proiect am realizat un sistem inteligent pentru monitorizare și irigarea automată a plantelor, lucru foarte util pentru mine și care în același timp a putut fi transformat într-un proiect destul de complex. Proiectul combină partea hardware cu partea software, integrează senzori, actuatoare, dar și o comunicație Bluetooth care face legătura dintre o aplicația mobile și sistem.

Pe parcursul dezvoltării m-am distrat foarte mult experimentând cu partea hardware - partea care mi s-a părut și cea mai interesantă, întrucât a fost prima dată când am avut ocazia să implementez de la zero un sistem embedded complet și să văd efectiv cum toate componentele ajung să funcționeze împreună. Mi s-a părut foarte satisfăcător momentul în care am reușit să controlez pompa, ventilatorul și LCD-ul direct prin microcontroller și să observ cum sistemul reacționează în timp real la datele venite de la senzori. În același timp, proiectul m-a ajutat să înțeleg mult mai bine conceptele din cadrul laboratoarelor și să văd cum se leagă împreună într-un sistem unitar.

Deși pe parcurs au existat și probleme legate de conexiunile hardware (în sepcial la partea bluetooth, dar și în ceea ce privește asigurarea unei funționări corecte d.p.d.v. hardware a pompei submersibile și a motorului DC) și de calibrarea senzorilor, tocmai aceste challenge-uri au făcut proiectul să fie interesant.

Aș vrea să extind proiectul prin adăugarea unui modul Wi-Fi și a unui server web, care să vină ca alternativă la aplicația mobilă curentă.

Cod sursă - GitHub Repository

SmartPlantPM

Jurnal

1 Mai - Finalizare etapa I a documentației (schemă electrică, schemă bloc, descriere)
15 Mai - Finalizare a etapei hardware
18 Mai - Primul prototip software, crearea repository-ului pe github. Am avut câteva probleme cu conexiunea bluetooth spre microcontroller și a trebuit să schimb niște legături
22 Mai - Finalizare software și integrare a aplicației Android
24 Mai - Am terminat documentarea software-ului pentru pagina ocw

Bibliografie

Multe componente au fost comandate de pe website-ul Bitmi, unde la aproape fiecare componentă am găsit și instrucțiuni referitoare la modul în care le pot conecta la Arduino UNO, precum și specificațiile necesare.

https://www.bitmi.ro/module-electronice/modul-wireless-esp8266-esp-01-compatibil-arduino-10433.html https://www.bitmi.ro/senzori-electronici/senzor-de-umiditate-a-solului-higrometru-10461.html

Datasheet Arduino UNO R3 (pentru a vedea cum s-au mapat pinii la regiștrii: https://www.alldatasheet.com/datasheet-pdf/view/1943445/ARDUINO/ARDUINO-UNO.html

Si datasheet-urile componentelor:
Senzorul de temperatură: https://www.alldatasheet.com/html-pdf/2193416/OSEPP/DHT11/1246/7/DHT11.html
https://github.com/eshansurendra/liquid_crystal_i2c_avr/blob/main/src/main.c
Modulul bluetooth HC-05: https://components101.com/sites/default/files/component_datasheet/HC-05%20Datasheet.pdf